fix: switch to actions-utils and update deps (#91)
This commit is contained in:
parent
5975d7549d
commit
ec59fe8c8e
2
dist/main/index.js
vendored
2
dist/main/index.js
vendored
File diff suppressed because one or more lines are too long
2
dist/post/index.js
vendored
2
dist/post/index.js
vendored
File diff suppressed because one or more lines are too long
326
package-lock.json
generated
326
package-lock.json
generated
@ -9,23 +9,24 @@
|
|||||||
"version": "0.4.0",
|
"version": "0.4.0",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.6.0"
|
"@actions/core": "^1.6.0",
|
||||||
|
"@google-github-actions/actions-utils": "^0.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "^4.2.22",
|
"@types/chai": "^4.3.0",
|
||||||
"@types/mocha": "^9.0.0",
|
"@types/mocha": "^9.0.0",
|
||||||
"@types/node": "^16.11.11",
|
"@types/node": "^17.0.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.5.0",
|
"@typescript-eslint/eslint-plugin": "^5.8.0",
|
||||||
"@typescript-eslint/parser": "^5.5.0",
|
"@typescript-eslint/parser": "^5.8.0",
|
||||||
"@vercel/ncc": "^0.33.0",
|
"@vercel/ncc": "^0.33.1",
|
||||||
"chai": "^4.3.4",
|
"chai": "^4.3.4",
|
||||||
"eslint": "^8.3.0",
|
"eslint": "^8.5.0",
|
||||||
"eslint-config-prettier": "^8.3.0",
|
"eslint-config-prettier": "^8.3.0",
|
||||||
"eslint-plugin-prettier": "^4.0.0",
|
"eslint-plugin-prettier": "^4.0.0",
|
||||||
"mocha": "^9.1.3",
|
"mocha": "^9.1.3",
|
||||||
"prettier": "^2.5.0",
|
"prettier": "^2.5.1",
|
||||||
"ts-node": "^10.4.0",
|
"ts-node": "^10.4.0",
|
||||||
"typescript": "^4.5.2"
|
"typescript": "^4.5.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@actions/core": {
|
"node_modules/@actions/core": {
|
||||||
@ -66,14 +67,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@eslint/eslintrc": {
|
"node_modules/@eslint/eslintrc": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
|
||||||
"integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==",
|
"integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ajv": "^6.12.4",
|
"ajv": "^6.12.4",
|
||||||
"debug": "^4.3.2",
|
"debug": "^4.3.2",
|
||||||
"espree": "^9.0.0",
|
"espree": "^9.2.0",
|
||||||
"globals": "^13.9.0",
|
"globals": "^13.9.0",
|
||||||
"ignore": "^4.0.6",
|
"ignore": "^4.0.6",
|
||||||
"import-fresh": "^3.2.1",
|
"import-fresh": "^3.2.1",
|
||||||
@ -94,13 +95,21 @@
|
|||||||
"node": ">= 4"
|
"node": ">= 4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@google-github-actions/actions-utils": {
|
||||||
|
"version": "0.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@google-github-actions/actions-utils/-/actions-utils-0.1.0.tgz",
|
||||||
|
"integrity": "sha512-zGKODnHmCqLL6RQP6CFY+EtpS4J+VSX6RRUNdv1NGS3sSavKy+yD0O+7hzfEjqdZBPGK8lf1JhttYHYZ6KbMmA==",
|
||||||
|
"dependencies": {
|
||||||
|
"yaml": "^1.10.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@humanwhocodes/config-array": {
|
"node_modules/@humanwhocodes/config-array": {
|
||||||
"version": "0.6.0",
|
"version": "0.9.2",
|
||||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
|
||||||
"integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==",
|
"integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@humanwhocodes/object-schema": "^1.2.0",
|
"@humanwhocodes/object-schema": "^1.2.1",
|
||||||
"debug": "^4.1.1",
|
"debug": "^4.1.1",
|
||||||
"minimatch": "^3.0.4"
|
"minimatch": "^3.0.4"
|
||||||
},
|
},
|
||||||
@ -174,9 +183,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/chai": {
|
"node_modules/@types/chai": {
|
||||||
"version": "4.2.22",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.22.tgz",
|
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz",
|
||||||
"integrity": "sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ==",
|
"integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/json-schema": {
|
"node_modules/@types/json-schema": {
|
||||||
@ -192,19 +201,19 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@types/node": {
|
"node_modules/@types/node": {
|
||||||
"version": "16.11.11",
|
"version": "17.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.2.tgz",
|
||||||
"integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==",
|
"integrity": "sha512-JepeIUPFDARgIs0zD/SKPgFsJEAF0X5/qO80llx59gOxFTboS9Amv3S+QfB7lqBId5sFXJ99BN0J6zFRvL9dDA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.0.tgz",
|
||||||
"integrity": "sha512-4bV6fulqbuaO9UMXU0Ia0o6z6if+kmMRW8rMRyfqXj/eGrZZRGedS4n0adeGNnjr8LKAM495hrQ7Tea52UWmQA==",
|
"integrity": "sha512-spu1UW7QuBn0nJ6+psnfCc3iVoQAifjKORgBngKOmC8U/1tbe2YJMzYQqDGYB4JCss7L8+RM2kKLb1B1Aw9BNA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/experimental-utils": "5.5.0",
|
"@typescript-eslint/experimental-utils": "5.8.0",
|
||||||
"@typescript-eslint/scope-manager": "5.5.0",
|
"@typescript-eslint/scope-manager": "5.8.0",
|
||||||
"debug": "^4.3.2",
|
"debug": "^4.3.2",
|
||||||
"functional-red-black-tree": "^1.0.1",
|
"functional-red-black-tree": "^1.0.1",
|
||||||
"ignore": "^5.1.8",
|
"ignore": "^5.1.8",
|
||||||
@ -230,15 +239,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/experimental-utils": {
|
"node_modules/@typescript-eslint/experimental-utils": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.0.tgz",
|
||||||
"integrity": "sha512-kjWeeVU+4lQ1SLYErRKV5yDXbWDPkpbzTUUlfAUifPYvpX0qZlrcCZ96/6oWxt3QxtK5WVhXz+KsnwW9cIW+3A==",
|
"integrity": "sha512-KN5FvNH71bhZ8fKtL+lhW7bjm7cxs1nt+hrDZWIqb6ViCffQcWyLunGrgvISgkRojIDcXIsH+xlFfI4RCDA0xA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@types/json-schema": "^7.0.9",
|
"@types/json-schema": "^7.0.9",
|
||||||
"@typescript-eslint/scope-manager": "5.5.0",
|
"@typescript-eslint/scope-manager": "5.8.0",
|
||||||
"@typescript-eslint/types": "5.5.0",
|
"@typescript-eslint/types": "5.8.0",
|
||||||
"@typescript-eslint/typescript-estree": "5.5.0",
|
"@typescript-eslint/typescript-estree": "5.8.0",
|
||||||
"eslint-scope": "^5.1.1",
|
"eslint-scope": "^5.1.1",
|
||||||
"eslint-utils": "^3.0.0"
|
"eslint-utils": "^3.0.0"
|
||||||
},
|
},
|
||||||
@ -250,18 +259,18 @@
|
|||||||
"url": "https://opencollective.com/typescript-eslint"
|
"url": "https://opencollective.com/typescript-eslint"
|
||||||
},
|
},
|
||||||
"peerDependencies": {
|
"peerDependencies": {
|
||||||
"eslint": "*"
|
"eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/parser": {
|
"node_modules/@typescript-eslint/parser": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.8.0.tgz",
|
||||||
"integrity": "sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg==",
|
"integrity": "sha512-Gleacp/ZhRtJRYs5/T8KQR3pAQjQI89Dn/k+OzyCKOsLiZH2/Vh60cFBTnFsHNI6WAD+lNUo/xGZ4NeA5u0Ipw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/scope-manager": "5.5.0",
|
"@typescript-eslint/scope-manager": "5.8.0",
|
||||||
"@typescript-eslint/types": "5.5.0",
|
"@typescript-eslint/types": "5.8.0",
|
||||||
"@typescript-eslint/typescript-estree": "5.5.0",
|
"@typescript-eslint/typescript-estree": "5.8.0",
|
||||||
"debug": "^4.3.2"
|
"debug": "^4.3.2"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@ -281,13 +290,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/scope-manager": {
|
"node_modules/@typescript-eslint/scope-manager": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.8.0.tgz",
|
||||||
"integrity": "sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg==",
|
"integrity": "sha512-x82CYJsLOjPCDuFFEbS6e7K1QEWj7u5Wk1alw8A+gnJiYwNnDJk0ib6PCegbaPMjrfBvFKa7SxE3EOnnIQz2Gg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "5.5.0",
|
"@typescript-eslint/types": "5.8.0",
|
||||||
"@typescript-eslint/visitor-keys": "5.5.0"
|
"@typescript-eslint/visitor-keys": "5.8.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
@ -298,9 +307,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/types": {
|
"node_modules/@typescript-eslint/types": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.8.0.tgz",
|
||||||
"integrity": "sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg==",
|
"integrity": "sha512-LdCYOqeqZWqCMOmwFnum6YfW9F3nKuxJiR84CdIRN5nfHJ7gyvGpXWqL/AaW0k3Po0+wm93ARAsOdzlZDPCcXg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
|
||||||
@ -311,13 +320,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/typescript-estree": {
|
"node_modules/@typescript-eslint/typescript-estree": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.0.tgz",
|
||||||
"integrity": "sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ==",
|
"integrity": "sha512-srfeZ3URdEcUsSLbkOFqS7WoxOqn8JNil2NSLO9O+I2/Uyc85+UlfpEvQHIpj5dVts7KKOZnftoJD/Fdv0L7nQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "5.5.0",
|
"@typescript-eslint/types": "5.8.0",
|
||||||
"@typescript-eslint/visitor-keys": "5.5.0",
|
"@typescript-eslint/visitor-keys": "5.8.0",
|
||||||
"debug": "^4.3.2",
|
"debug": "^4.3.2",
|
||||||
"globby": "^11.0.4",
|
"globby": "^11.0.4",
|
||||||
"is-glob": "^4.0.3",
|
"is-glob": "^4.0.3",
|
||||||
@ -338,12 +347,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@typescript-eslint/visitor-keys": {
|
"node_modules/@typescript-eslint/visitor-keys": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.0.tgz",
|
||||||
"integrity": "sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw==",
|
"integrity": "sha512-+HDIGOEMnqbxdAHegxvnOqESUH6RWFRR2b8qxP1W9CZnnYh4Usz6MBL+2KMAgPk/P0o9c1HqnYtwzVH6GTIqug==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@typescript-eslint/types": "5.5.0",
|
"@typescript-eslint/types": "5.8.0",
|
||||||
"eslint-visitor-keys": "^3.0.0"
|
"eslint-visitor-keys": "^3.0.0"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
@ -361,9 +370,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/@vercel/ncc": {
|
"node_modules/@vercel/ncc": {
|
||||||
"version": "0.33.0",
|
"version": "0.33.1",
|
||||||
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.0.tgz",
|
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.1.tgz",
|
||||||
"integrity": "sha512-m21HzXD+L/YHoJTwyCCyGBXD0O2L4KR/Y6SSsS4qvRlz3NAYsiiYahzOsgfWEt4PJxpPVCMGiuWzsvb2tycmyA==",
|
"integrity": "sha512-Mlsps/P0PLZwsCFtSol23FGqT3FhBGb4B1AuGQ52JTAtXhak+b0Fh/4T55r0/SVQPeRiX9pNItOEHwakGPmZYA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"ncc": "dist/ncc/cli.js"
|
"ncc": "dist/ncc/cli.js"
|
||||||
@ -805,13 +814,13 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/eslint": {
|
"node_modules/eslint": {
|
||||||
"version": "8.3.0",
|
"version": "8.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz",
|
||||||
"integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==",
|
"integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@eslint/eslintrc": "^1.0.4",
|
"@eslint/eslintrc": "^1.0.5",
|
||||||
"@humanwhocodes/config-array": "^0.6.0",
|
"@humanwhocodes/config-array": "^0.9.2",
|
||||||
"ajv": "^6.10.0",
|
"ajv": "^6.10.0",
|
||||||
"chalk": "^4.0.0",
|
"chalk": "^4.0.0",
|
||||||
"cross-spawn": "^7.0.2",
|
"cross-spawn": "^7.0.2",
|
||||||
@ -822,7 +831,7 @@
|
|||||||
"eslint-scope": "^7.1.0",
|
"eslint-scope": "^7.1.0",
|
||||||
"eslint-utils": "^3.0.0",
|
"eslint-utils": "^3.0.0",
|
||||||
"eslint-visitor-keys": "^3.1.0",
|
"eslint-visitor-keys": "^3.1.0",
|
||||||
"espree": "^9.1.0",
|
"espree": "^9.2.0",
|
||||||
"esquery": "^1.4.0",
|
"esquery": "^1.4.0",
|
||||||
"esutils": "^2.0.2",
|
"esutils": "^2.0.2",
|
||||||
"fast-deep-equal": "^3.1.3",
|
"fast-deep-equal": "^3.1.3",
|
||||||
@ -973,9 +982,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/espree": {
|
"node_modules/espree": {
|
||||||
"version": "9.1.0",
|
"version": "9.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz",
|
||||||
"integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==",
|
"integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"acorn": "^8.6.0",
|
"acorn": "^8.6.0",
|
||||||
@ -1314,9 +1323,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/ignore": {
|
"node_modules/ignore": {
|
||||||
"version": "5.1.9",
|
"version": "5.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz",
|
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
|
||||||
"integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==",
|
"integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 4"
|
"node": ">= 4"
|
||||||
@ -1822,9 +1831,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/prettier": {
|
"node_modules/prettier": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
|
||||||
"integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==",
|
"integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"prettier": "bin-prettier.js"
|
"prettier": "bin-prettier.js"
|
||||||
@ -2237,9 +2246,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/typescript": {
|
"node_modules/typescript": {
|
||||||
"version": "4.5.2",
|
"version": "4.5.4",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz",
|
||||||
"integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==",
|
"integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"tsc": "bin/tsc",
|
"tsc": "bin/tsc",
|
||||||
@ -2332,6 +2341,14 @@
|
|||||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/yaml": {
|
||||||
|
"version": "1.10.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
|
||||||
|
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 6"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/yargs": {
|
"node_modules/yargs": {
|
||||||
"version": "16.2.0",
|
"version": "16.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
|
||||||
@ -2429,14 +2446,14 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@eslint/eslintrc": {
|
"@eslint/eslintrc": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz",
|
||||||
"integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==",
|
"integrity": "sha512-BLxsnmK3KyPunz5wmCCpqy0YelEoxxGmH73Is+Z74oOTMtExcjkr3dDR6quwrjh1YspA8DH9gnX1o069KiS9AQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"ajv": "^6.12.4",
|
"ajv": "^6.12.4",
|
||||||
"debug": "^4.3.2",
|
"debug": "^4.3.2",
|
||||||
"espree": "^9.0.0",
|
"espree": "^9.2.0",
|
||||||
"globals": "^13.9.0",
|
"globals": "^13.9.0",
|
||||||
"ignore": "^4.0.6",
|
"ignore": "^4.0.6",
|
||||||
"import-fresh": "^3.2.1",
|
"import-fresh": "^3.2.1",
|
||||||
@ -2453,13 +2470,21 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@google-github-actions/actions-utils": {
|
||||||
|
"version": "0.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@google-github-actions/actions-utils/-/actions-utils-0.1.0.tgz",
|
||||||
|
"integrity": "sha512-zGKODnHmCqLL6RQP6CFY+EtpS4J+VSX6RRUNdv1NGS3sSavKy+yD0O+7hzfEjqdZBPGK8lf1JhttYHYZ6KbMmA==",
|
||||||
|
"requires": {
|
||||||
|
"yaml": "^1.10.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@humanwhocodes/config-array": {
|
"@humanwhocodes/config-array": {
|
||||||
"version": "0.6.0",
|
"version": "0.9.2",
|
||||||
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz",
|
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.9.2.tgz",
|
||||||
"integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==",
|
"integrity": "sha512-UXOuFCGcwciWckOpmfKDq/GyhlTf9pN/BzG//x8p8zTOFEcGuA68ANXheFS0AGvy3qgZqLBUkMs7hqzqCKOVwA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@humanwhocodes/object-schema": "^1.2.0",
|
"@humanwhocodes/object-schema": "^1.2.1",
|
||||||
"debug": "^4.1.1",
|
"debug": "^4.1.1",
|
||||||
"minimatch": "^3.0.4"
|
"minimatch": "^3.0.4"
|
||||||
}
|
}
|
||||||
@ -2521,9 +2546,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/chai": {
|
"@types/chai": {
|
||||||
"version": "4.2.22",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.22.tgz",
|
"resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.0.tgz",
|
||||||
"integrity": "sha512-tFfcE+DSTzWAgifkjik9AySNqIyNoYwmR+uecPwwD/XRNfvOjmC/FjCxpiUGDkDVDphPfCUecSQVFw+lN3M3kQ==",
|
"integrity": "sha512-/ceqdqeRraGolFTcfoXNiqjyQhZzbINDngeoAq9GoHa8PPK1yNzTaxWjA6BFWp5Ua9JpXEMSS4s5i9tS0hOJtw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/json-schema": {
|
"@types/json-schema": {
|
||||||
@ -2539,19 +2564,19 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
"version": "16.11.11",
|
"version": "17.0.2",
|
||||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.11.tgz",
|
"resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.2.tgz",
|
||||||
"integrity": "sha512-KB0sixD67CeecHC33MYn+eYARkqTheIRNuu97y2XMjR7Wu3XibO1vaY6VBV6O/a89SPI81cEUIYT87UqUWlZNw==",
|
"integrity": "sha512-JepeIUPFDARgIs0zD/SKPgFsJEAF0X5/qO80llx59gOxFTboS9Amv3S+QfB7lqBId5sFXJ99BN0J6zFRvL9dDA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@typescript-eslint/eslint-plugin": {
|
"@typescript-eslint/eslint-plugin": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.8.0.tgz",
|
||||||
"integrity": "sha512-4bV6fulqbuaO9UMXU0Ia0o6z6if+kmMRW8rMRyfqXj/eGrZZRGedS4n0adeGNnjr8LKAM495hrQ7Tea52UWmQA==",
|
"integrity": "sha512-spu1UW7QuBn0nJ6+psnfCc3iVoQAifjKORgBngKOmC8U/1tbe2YJMzYQqDGYB4JCss7L8+RM2kKLb1B1Aw9BNA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/experimental-utils": "5.5.0",
|
"@typescript-eslint/experimental-utils": "5.8.0",
|
||||||
"@typescript-eslint/scope-manager": "5.5.0",
|
"@typescript-eslint/scope-manager": "5.8.0",
|
||||||
"debug": "^4.3.2",
|
"debug": "^4.3.2",
|
||||||
"functional-red-black-tree": "^1.0.1",
|
"functional-red-black-tree": "^1.0.1",
|
||||||
"ignore": "^5.1.8",
|
"ignore": "^5.1.8",
|
||||||
@ -2561,55 +2586,55 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/experimental-utils": {
|
"@typescript-eslint/experimental-utils": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.8.0.tgz",
|
||||||
"integrity": "sha512-kjWeeVU+4lQ1SLYErRKV5yDXbWDPkpbzTUUlfAUifPYvpX0qZlrcCZ96/6oWxt3QxtK5WVhXz+KsnwW9cIW+3A==",
|
"integrity": "sha512-KN5FvNH71bhZ8fKtL+lhW7bjm7cxs1nt+hrDZWIqb6ViCffQcWyLunGrgvISgkRojIDcXIsH+xlFfI4RCDA0xA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/json-schema": "^7.0.9",
|
"@types/json-schema": "^7.0.9",
|
||||||
"@typescript-eslint/scope-manager": "5.5.0",
|
"@typescript-eslint/scope-manager": "5.8.0",
|
||||||
"@typescript-eslint/types": "5.5.0",
|
"@typescript-eslint/types": "5.8.0",
|
||||||
"@typescript-eslint/typescript-estree": "5.5.0",
|
"@typescript-eslint/typescript-estree": "5.8.0",
|
||||||
"eslint-scope": "^5.1.1",
|
"eslint-scope": "^5.1.1",
|
||||||
"eslint-utils": "^3.0.0"
|
"eslint-utils": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/parser": {
|
"@typescript-eslint/parser": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.8.0.tgz",
|
||||||
"integrity": "sha512-JsXBU+kgQOAgzUn2jPrLA+Rd0Y1dswOlX3hp8MuRO1hQDs6xgHtbCXEiAu7bz5hyVURxbXcA2draasMbNqrhmg==",
|
"integrity": "sha512-Gleacp/ZhRtJRYs5/T8KQR3pAQjQI89Dn/k+OzyCKOsLiZH2/Vh60cFBTnFsHNI6WAD+lNUo/xGZ4NeA5u0Ipw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/scope-manager": "5.5.0",
|
"@typescript-eslint/scope-manager": "5.8.0",
|
||||||
"@typescript-eslint/types": "5.5.0",
|
"@typescript-eslint/types": "5.8.0",
|
||||||
"@typescript-eslint/typescript-estree": "5.5.0",
|
"@typescript-eslint/typescript-estree": "5.8.0",
|
||||||
"debug": "^4.3.2"
|
"debug": "^4.3.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/scope-manager": {
|
"@typescript-eslint/scope-manager": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.8.0.tgz",
|
||||||
"integrity": "sha512-0/r656RmRLo7CbN4Mdd+xZyPJ/fPCKhYdU6mnZx+8msAD8nJSP8EyCFkzbd6vNVZzZvWlMYrSNekqGrCBqFQhg==",
|
"integrity": "sha512-x82CYJsLOjPCDuFFEbS6e7K1QEWj7u5Wk1alw8A+gnJiYwNnDJk0ib6PCegbaPMjrfBvFKa7SxE3EOnnIQz2Gg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "5.5.0",
|
"@typescript-eslint/types": "5.8.0",
|
||||||
"@typescript-eslint/visitor-keys": "5.5.0"
|
"@typescript-eslint/visitor-keys": "5.8.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/types": {
|
"@typescript-eslint/types": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.8.0.tgz",
|
||||||
"integrity": "sha512-OaYTqkW3GnuHxqsxxJ6KypIKd5Uw7bFiQJZRyNi1jbMJnK3Hc/DR4KwB6KJj6PBRkJJoaNwzMNv9vtTk87JhOg==",
|
"integrity": "sha512-LdCYOqeqZWqCMOmwFnum6YfW9F3nKuxJiR84CdIRN5nfHJ7gyvGpXWqL/AaW0k3Po0+wm93ARAsOdzlZDPCcXg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@typescript-eslint/typescript-estree": {
|
"@typescript-eslint/typescript-estree": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.8.0.tgz",
|
||||||
"integrity": "sha512-pVn8btYUiYrjonhMAO0yG8lm7RApzy2L4RC7Td/mC/qFkyf6vRbGyZozoA94+w6D2Y2GRqpMoCWcwx/EUOzyoQ==",
|
"integrity": "sha512-srfeZ3URdEcUsSLbkOFqS7WoxOqn8JNil2NSLO9O+I2/Uyc85+UlfpEvQHIpj5dVts7KKOZnftoJD/Fdv0L7nQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "5.5.0",
|
"@typescript-eslint/types": "5.8.0",
|
||||||
"@typescript-eslint/visitor-keys": "5.5.0",
|
"@typescript-eslint/visitor-keys": "5.8.0",
|
||||||
"debug": "^4.3.2",
|
"debug": "^4.3.2",
|
||||||
"globby": "^11.0.4",
|
"globby": "^11.0.4",
|
||||||
"is-glob": "^4.0.3",
|
"is-glob": "^4.0.3",
|
||||||
@ -2618,12 +2643,12 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@typescript-eslint/visitor-keys": {
|
"@typescript-eslint/visitor-keys": {
|
||||||
"version": "5.5.0",
|
"version": "5.8.0",
|
||||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.8.0.tgz",
|
||||||
"integrity": "sha512-4GzJ1kRtsWzHhdM40tv0ZKHNSbkDhF0Woi/TDwVJX6UICwJItvP7ZTXbjTkCdrors7ww0sYe0t+cIKDAJwZ7Kw==",
|
"integrity": "sha512-+HDIGOEMnqbxdAHegxvnOqESUH6RWFRR2b8qxP1W9CZnnYh4Usz6MBL+2KMAgPk/P0o9c1HqnYtwzVH6GTIqug==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@typescript-eslint/types": "5.5.0",
|
"@typescript-eslint/types": "5.8.0",
|
||||||
"eslint-visitor-keys": "^3.0.0"
|
"eslint-visitor-keys": "^3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -2634,9 +2659,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"@vercel/ncc": {
|
"@vercel/ncc": {
|
||||||
"version": "0.33.0",
|
"version": "0.33.1",
|
||||||
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.0.tgz",
|
"resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.33.1.tgz",
|
||||||
"integrity": "sha512-m21HzXD+L/YHoJTwyCCyGBXD0O2L4KR/Y6SSsS4qvRlz3NAYsiiYahzOsgfWEt4PJxpPVCMGiuWzsvb2tycmyA==",
|
"integrity": "sha512-Mlsps/P0PLZwsCFtSol23FGqT3FhBGb4B1AuGQ52JTAtXhak+b0Fh/4T55r0/SVQPeRiX9pNItOEHwakGPmZYA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"acorn": {
|
"acorn": {
|
||||||
@ -2962,13 +2987,13 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"eslint": {
|
"eslint": {
|
||||||
"version": "8.3.0",
|
"version": "8.5.0",
|
||||||
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.5.0.tgz",
|
||||||
"integrity": "sha512-aIay56Ph6RxOTC7xyr59Kt3ewX185SaGnAr8eWukoPLeriCrvGjvAubxuvaXOfsxhtwV5g0uBOsyhAom4qJdww==",
|
"integrity": "sha512-tVGSkgNbOfiHyVte8bCM8OmX+xG9PzVG/B4UCF60zx7j61WIVY/AqJECDgpLD4DbbESD0e174gOg3ZlrX15GDg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@eslint/eslintrc": "^1.0.4",
|
"@eslint/eslintrc": "^1.0.5",
|
||||||
"@humanwhocodes/config-array": "^0.6.0",
|
"@humanwhocodes/config-array": "^0.9.2",
|
||||||
"ajv": "^6.10.0",
|
"ajv": "^6.10.0",
|
||||||
"chalk": "^4.0.0",
|
"chalk": "^4.0.0",
|
||||||
"cross-spawn": "^7.0.2",
|
"cross-spawn": "^7.0.2",
|
||||||
@ -2979,7 +3004,7 @@
|
|||||||
"eslint-scope": "^7.1.0",
|
"eslint-scope": "^7.1.0",
|
||||||
"eslint-utils": "^3.0.0",
|
"eslint-utils": "^3.0.0",
|
||||||
"eslint-visitor-keys": "^3.1.0",
|
"eslint-visitor-keys": "^3.1.0",
|
||||||
"espree": "^9.1.0",
|
"espree": "^9.2.0",
|
||||||
"esquery": "^1.4.0",
|
"esquery": "^1.4.0",
|
||||||
"esutils": "^2.0.2",
|
"esutils": "^2.0.2",
|
||||||
"fast-deep-equal": "^3.1.3",
|
"fast-deep-equal": "^3.1.3",
|
||||||
@ -3081,9 +3106,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"espree": {
|
"espree": {
|
||||||
"version": "9.1.0",
|
"version": "9.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/espree/-/espree-9.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/espree/-/espree-9.2.0.tgz",
|
||||||
"integrity": "sha512-ZgYLvCS1wxOczBYGcQT9DDWgicXwJ4dbocr9uYN+/eresBAUuBu+O4WzB21ufQ/JqQT8gyp7hJ3z8SHii32mTQ==",
|
"integrity": "sha512-oP3utRkynpZWF/F2x/HZJ+AGtnIclaR7z1pYPxy7NYM2fSO6LgK/Rkny8anRSPK/VwEA1eqm2squui0T7ZMOBg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"acorn": "^8.6.0",
|
"acorn": "^8.6.0",
|
||||||
@ -3340,9 +3365,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"ignore": {
|
"ignore": {
|
||||||
"version": "5.1.9",
|
"version": "5.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz",
|
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
|
||||||
"integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==",
|
"integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"import-fresh": {
|
"import-fresh": {
|
||||||
@ -3710,9 +3735,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"prettier": {
|
"prettier": {
|
||||||
"version": "2.5.0",
|
"version": "2.5.1",
|
||||||
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz",
|
||||||
"integrity": "sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg==",
|
"integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"prettier-linter-helpers": {
|
"prettier-linter-helpers": {
|
||||||
@ -3967,9 +3992,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"typescript": {
|
"typescript": {
|
||||||
"version": "4.5.2",
|
"version": "4.5.4",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.2.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz",
|
||||||
"integrity": "sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw==",
|
"integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"uri-js": {
|
"uri-js": {
|
||||||
@ -4037,6 +4062,11 @@
|
|||||||
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
"integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"yaml": {
|
||||||
|
"version": "1.10.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
|
||||||
|
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
|
||||||
|
},
|
||||||
"yargs": {
|
"yargs": {
|
||||||
"version": "16.2.0",
|
"version": "16.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
|
||||||
|
19
package.json
19
package.json
@ -23,22 +23,23 @@
|
|||||||
"author": "GoogleCloudPlatform",
|
"author": "GoogleCloudPlatform",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@actions/core": "^1.6.0"
|
"@actions/core": "^1.6.0",
|
||||||
|
"@google-github-actions/actions-utils": "^0.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/chai": "^4.2.22",
|
"@types/chai": "^4.3.0",
|
||||||
"@types/mocha": "^9.0.0",
|
"@types/mocha": "^9.0.0",
|
||||||
"@types/node": "^16.11.11",
|
"@types/node": "^17.0.2",
|
||||||
"@typescript-eslint/eslint-plugin": "^5.5.0",
|
"@typescript-eslint/eslint-plugin": "^5.8.0",
|
||||||
"@typescript-eslint/parser": "^5.5.0",
|
"@typescript-eslint/parser": "^5.8.0",
|
||||||
"@vercel/ncc": "^0.33.0",
|
"@vercel/ncc": "^0.33.1",
|
||||||
"chai": "^4.3.4",
|
"chai": "^4.3.4",
|
||||||
"eslint": "^8.3.0",
|
"eslint": "^8.5.0",
|
||||||
"eslint-config-prettier": "^8.3.0",
|
"eslint-config-prettier": "^8.3.0",
|
||||||
"eslint-plugin-prettier": "^4.0.0",
|
"eslint-plugin-prettier": "^4.0.0",
|
||||||
"mocha": "^9.1.3",
|
"mocha": "^9.1.3",
|
||||||
"prettier": "^2.5.0",
|
"prettier": "^2.5.1",
|
||||||
"ts-node": "^10.4.0",
|
"ts-node": "^10.4.0",
|
||||||
"typescript": "^4.5.2"
|
"typescript": "^4.5.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,16 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import { createSign } from 'crypto';
|
import { createSign } from 'crypto';
|
||||||
|
import {
|
||||||
|
isServiceAccountKey,
|
||||||
|
parseCredential,
|
||||||
|
randomFilepath,
|
||||||
|
ServiceAccountKey,
|
||||||
|
toBase64,
|
||||||
|
writeSecureFile,
|
||||||
|
} from '@google-github-actions/actions-utils';
|
||||||
|
|
||||||
import { AuthClient } from './auth_client';
|
import { AuthClient } from './auth_client';
|
||||||
import { toBase64, fromBase64, trimmedString, writeSecureFile } from '../utils';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Available options to create the CredentialsJSONClient.
|
* Available options to create the CredentialsJSONClient.
|
||||||
@ -22,49 +30,16 @@ interface CredentialsJSONClientOptions {
|
|||||||
*/
|
*/
|
||||||
export class CredentialsJSONClient implements AuthClient {
|
export class CredentialsJSONClient implements AuthClient {
|
||||||
readonly #projectID: string;
|
readonly #projectID: string;
|
||||||
readonly #credentials: Record<string, string>;
|
readonly #credentials: ServiceAccountKey;
|
||||||
|
|
||||||
constructor(opts: CredentialsJSONClientOptions) {
|
constructor(opts: CredentialsJSONClientOptions) {
|
||||||
this.#credentials = this.parseServiceAccountKeyJSON(opts.credentialsJSON);
|
const credentials = parseCredential(opts.credentialsJSON);
|
||||||
this.#projectID = opts.projectID || this.#credentials['project_id'];
|
if (!isServiceAccountKey(credentials)) {
|
||||||
}
|
throw new Error(`Provided credential is not a valid service account key JSON`);
|
||||||
|
|
||||||
/**
|
|
||||||
* parseServiceAccountKeyJSON attempts to parse the given string as a service
|
|
||||||
* account key JSON. It handles if the string is base64-encoded.
|
|
||||||
*/
|
|
||||||
parseServiceAccountKeyJSON(str: string): Record<string, string> {
|
|
||||||
str = trimmedString(str);
|
|
||||||
if (!str) {
|
|
||||||
throw new Error(`Missing service account key JSON (got empty value)`);
|
|
||||||
}
|
}
|
||||||
|
this.#credentials = credentials;
|
||||||
|
|
||||||
// If the string doesn't start with a JSON object character, it is probably
|
this.#projectID = opts.projectID || this.#credentials.project_id;
|
||||||
// base64-encoded.
|
|
||||||
if (!str.startsWith('{')) {
|
|
||||||
str = fromBase64(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
let creds: Record<string, string>;
|
|
||||||
try {
|
|
||||||
creds = JSON.parse(str);
|
|
||||||
} catch (e) {
|
|
||||||
throw new SyntaxError(`Failed to parse credentials as JSON: ${e}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const requireValue = (key: string) => {
|
|
||||||
const val = trimmedString(creds[key]);
|
|
||||||
if (!val) {
|
|
||||||
throw new Error(`Service account key JSON is missing required field "${key}"`);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
requireValue('project_id');
|
|
||||||
requireValue('private_key_id');
|
|
||||||
requireValue('private_key');
|
|
||||||
requireValue('client_email');
|
|
||||||
|
|
||||||
return creds;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -74,14 +49,14 @@ export class CredentialsJSONClient implements AuthClient {
|
|||||||
const header = {
|
const header = {
|
||||||
alg: 'RS256',
|
alg: 'RS256',
|
||||||
typ: 'JWT',
|
typ: 'JWT',
|
||||||
kid: this.#credentials['private_key_id'],
|
kid: this.#credentials.private_key_id,
|
||||||
};
|
};
|
||||||
|
|
||||||
const now = Math.floor(new Date().getTime() / 1000);
|
const now = Math.floor(new Date().getTime() / 1000);
|
||||||
|
|
||||||
const body = {
|
const body = {
|
||||||
iss: this.#credentials['client_email'],
|
iss: this.#credentials.client_email,
|
||||||
sub: this.#credentials['client_email'],
|
sub: this.#credentials.client_email,
|
||||||
aud: 'https://iamcredentials.googleapis.com/',
|
aud: 'https://iamcredentials.googleapis.com/',
|
||||||
iat: now,
|
iat: now,
|
||||||
exp: now + 3599,
|
exp: now + 3599,
|
||||||
@ -94,7 +69,7 @@ export class CredentialsJSONClient implements AuthClient {
|
|||||||
signer.write(message);
|
signer.write(message);
|
||||||
signer.end();
|
signer.end();
|
||||||
|
|
||||||
const signature = signer.sign(this.#credentials['private_key']);
|
const signature = signer.sign(this.#credentials.private_key);
|
||||||
return message + '.' + toBase64(signature);
|
return message + '.' + toBase64(signature);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
throw new Error(`Failed to sign auth token using ${await this.getServiceAccount()}: ${err}`);
|
throw new Error(`Failed to sign auth token using ${await this.getServiceAccount()}: ${err}`);
|
||||||
@ -110,7 +85,7 @@ export class CredentialsJSONClient implements AuthClient {
|
|||||||
const header = {
|
const header = {
|
||||||
alg: 'RS256',
|
alg: 'RS256',
|
||||||
typ: 'JWT',
|
typ: 'JWT',
|
||||||
kid: this.#credentials['private_key_id'],
|
kid: this.#credentials.private_key_id,
|
||||||
};
|
};
|
||||||
|
|
||||||
const message = toBase64(JSON.stringify(header)) + '.' + toBase64(unsignedJWT);
|
const message = toBase64(JSON.stringify(header)) + '.' + toBase64(unsignedJWT);
|
||||||
@ -120,7 +95,7 @@ export class CredentialsJSONClient implements AuthClient {
|
|||||||
signer.write(message);
|
signer.write(message);
|
||||||
signer.end();
|
signer.end();
|
||||||
|
|
||||||
const signature = signer.sign(this.#credentials['private_key']);
|
const signature = signer.sign(this.#credentials.private_key);
|
||||||
const jwt = message + '.' + toBase64(signature);
|
const jwt = message + '.' + toBase64(signature);
|
||||||
return jwt;
|
return jwt;
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
@ -142,7 +117,7 @@ export class CredentialsJSONClient implements AuthClient {
|
|||||||
* extracted from the Service Account Key JSON.
|
* extracted from the Service Account Key JSON.
|
||||||
*/
|
*/
|
||||||
async getServiceAccount(): Promise<string> {
|
async getServiceAccount(): Promise<string> {
|
||||||
return this.#credentials['client_email'];
|
return this.#credentials.client_email;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -150,6 +125,7 @@ export class CredentialsJSONClient implements AuthClient {
|
|||||||
* set as GOOGLE_APPLICATION_CREDENTIALS for gcloud and client libraries.
|
* set as GOOGLE_APPLICATION_CREDENTIALS for gcloud and client libraries.
|
||||||
*/
|
*/
|
||||||
async createCredentialsFile(outputDir: string): Promise<string> {
|
async createCredentialsFile(outputDir: string): Promise<string> {
|
||||||
return await writeSecureFile(outputDir, JSON.stringify(this.#credentials));
|
const outputFile = randomFilepath(outputDir);
|
||||||
|
return await writeSecureFile(outputFile, JSON.stringify(this.#credentials));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import { URL } from 'url';
|
import { URL } from 'url';
|
||||||
|
import { randomFilepath, writeSecureFile } from '@google-github-actions/actions-utils';
|
||||||
|
|
||||||
import { AuthClient } from './auth_client';
|
import { AuthClient } from './auth_client';
|
||||||
import { writeSecureFile } from '../utils';
|
|
||||||
import { BaseClient } from '../base';
|
import { BaseClient } from '../base';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -208,6 +209,7 @@ export class WorkloadIdentityClient implements AuthClient {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
return await writeSecureFile(outputDir, JSON.stringify(data));
|
const outputFile = randomFilepath(outputDir);
|
||||||
|
return await writeSecureFile(outputFile, JSON.stringify(data));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
18
src/main.ts
18
src/main.ts
@ -11,11 +11,18 @@ import {
|
|||||||
setOutput,
|
setOutput,
|
||||||
setSecret,
|
setSecret,
|
||||||
} from '@actions/core';
|
} from '@actions/core';
|
||||||
|
import {
|
||||||
|
errorMessage,
|
||||||
|
exactlyOneOf,
|
||||||
|
parseCSV,
|
||||||
|
parseDuration,
|
||||||
|
} from '@google-github-actions/actions-utils';
|
||||||
|
|
||||||
import { WorkloadIdentityClient } from './client/workload_identity_client';
|
import { WorkloadIdentityClient } from './client/workload_identity_client';
|
||||||
import { CredentialsJSONClient } from './client/credentials_json_client';
|
import { CredentialsJSONClient } from './client/credentials_json_client';
|
||||||
import { AuthClient } from './client/auth_client';
|
import { AuthClient } from './client/auth_client';
|
||||||
import { BaseClient } from './base';
|
import { BaseClient } from './base';
|
||||||
import { buildDomainWideDelegationJWT, errorMessage, explodeStrings, parseDuration } from './utils';
|
import { buildDomainWideDelegationJWT } from './utils';
|
||||||
|
|
||||||
const secretsWarning =
|
const secretsWarning =
|
||||||
`If you are specifying input values via GitHub secrets, ensure the secret ` +
|
`If you are specifying input values via GitHub secrets, ensure the secret ` +
|
||||||
@ -42,14 +49,11 @@ async function run(): Promise<void> {
|
|||||||
const credentialsJSON = getInput('credentials_json');
|
const credentialsJSON = getInput('credentials_json');
|
||||||
const createCredentialsFile = getBooleanInput('create_credentials_file');
|
const createCredentialsFile = getBooleanInput('create_credentials_file');
|
||||||
const tokenFormat = getInput('token_format');
|
const tokenFormat = getInput('token_format');
|
||||||
const delegates = explodeStrings(getInput('delegates'));
|
const delegates = parseCSV(getInput('delegates'));
|
||||||
|
|
||||||
// Ensure exactly one of workload_identity_provider and credentials_json was
|
// Ensure exactly one of workload_identity_provider and credentials_json was
|
||||||
// provided.
|
// provided.
|
||||||
if (
|
if (!exactlyOneOf(workloadIdentityProvider, credentialsJSON)) {
|
||||||
(!workloadIdentityProvider && !credentialsJSON) ||
|
|
||||||
(workloadIdentityProvider && credentialsJSON)
|
|
||||||
) {
|
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'The GitHub Action workflow must specify exactly one of ' +
|
'The GitHub Action workflow must specify exactly one of ' +
|
||||||
'"workload_identity_provider" or "credentials_json"! ' +
|
'"workload_identity_provider" or "credentials_json"! ' +
|
||||||
@ -159,7 +163,7 @@ async function run(): Promise<void> {
|
|||||||
logDebug(`Creating access token`);
|
logDebug(`Creating access token`);
|
||||||
|
|
||||||
const accessTokenLifetime = parseDuration(getInput('access_token_lifetime'));
|
const accessTokenLifetime = parseDuration(getInput('access_token_lifetime'));
|
||||||
const accessTokenScopes = explodeStrings(getInput('access_token_scopes'));
|
const accessTokenScopes = parseCSV(getInput('access_token_scopes'));
|
||||||
const accessTokenSubject = getInput('access_token_subject');
|
const accessTokenSubject = getInput('access_token_subject');
|
||||||
const serviceAccount = await client.getServiceAccount();
|
const serviceAccount = await client.getServiceAccount();
|
||||||
|
|
||||||
|
21
src/post.ts
21
src/post.ts
@ -1,7 +1,7 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import { getBooleanInput, setFailed, info as logInfo } from '@actions/core';
|
import { getBooleanInput, setFailed, info as logInfo } from '@actions/core';
|
||||||
import { removeExportedCredentials } from './utils';
|
import { errorMessage, removeFile } from '@google-github-actions/actions-utils';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Executes the post action, documented inline.
|
* Executes the post action, documented inline.
|
||||||
@ -13,14 +13,25 @@ export async function run(): Promise<void> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const exportedPath = await removeExportedCredentials();
|
// Look up the credentials path, if one exists. Note that we only check the
|
||||||
if (exportedPath) {
|
// environment variable set by our action, since we don't want to
|
||||||
logInfo(`Removed exported credentials at ${exportedPath}`);
|
// accidentially clean up if someone set GOOGLE_APPLICATION_CREDENTIALS or
|
||||||
|
// another environment variable manually.
|
||||||
|
const credentialsPath = process.env['GOOGLE_GHA_CREDS_PATH'];
|
||||||
|
if (!credentialsPath) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove the file.
|
||||||
|
const removed = await removeFile(credentialsPath);
|
||||||
|
if (removed) {
|
||||||
|
logInfo(`Removed exported credentials at ${credentialsPath}`);
|
||||||
} else {
|
} else {
|
||||||
logInfo('No exported credentials found');
|
logInfo('No exported credentials found');
|
||||||
}
|
}
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
setFailed(`google-github-actions/auth post failed with: ${err}`);
|
const msg = errorMessage(err);
|
||||||
|
setFailed(`google-github-actions/auth post failed with: ${msg}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
218
src/utils.ts
218
src/utils.ts
@ -1,199 +1,5 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import { promises as fs } from 'fs';
|
|
||||||
import crypto from 'crypto';
|
|
||||||
import path from 'path';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* writeSecureFile writes a file to disk in a given directory with a
|
|
||||||
* random name.
|
|
||||||
*
|
|
||||||
* @param outputDir Directory to create random file in.
|
|
||||||
* @param data Data to write to file.
|
|
||||||
* @returns Path to written file.
|
|
||||||
*/
|
|
||||||
export async function writeSecureFile(outputDir: string, data: string): Promise<string> {
|
|
||||||
// Generate a random filename to store the credential. 12 bytes is 24
|
|
||||||
// characters in hex. It's not the ideal entropy, but we have to be under
|
|
||||||
// the 255 character limit for Windows filenames (which includes their
|
|
||||||
// entire leading path).
|
|
||||||
const uniqueName = crypto.randomBytes(12).toString('hex');
|
|
||||||
const pth = path.join(outputDir, uniqueName);
|
|
||||||
|
|
||||||
// Write the file as 0640 so the owner has RW, group as R, and the file is
|
|
||||||
// otherwise unreadable. Also write with EXCL to prevent a symlink attack.
|
|
||||||
await fs.writeFile(pth, data, { mode: 0o640, flag: 'wx' });
|
|
||||||
|
|
||||||
return pth;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* removeExportedCredentials removes any exported credentials file. If the file
|
|
||||||
* does not exist, it does nothing.
|
|
||||||
*
|
|
||||||
* @returns Path of the file that was removed.
|
|
||||||
*/
|
|
||||||
export async function removeExportedCredentials(): Promise<string> {
|
|
||||||
// Look up the credentials path, if one exists. Note that we only check the
|
|
||||||
// environment variable set by our action, since we don't want to
|
|
||||||
// accidentially clean up if someone set GOOGLE_APPLICATION_CREDENTIALS or
|
|
||||||
// another environment variable manually.
|
|
||||||
const credentialsPath = process.env['GOOGLE_GHA_CREDS_PATH'];
|
|
||||||
if (!credentialsPath) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete the file.
|
|
||||||
try {
|
|
||||||
await fs.unlink(credentialsPath);
|
|
||||||
return credentialsPath;
|
|
||||||
} catch (err) {
|
|
||||||
if (err instanceof Error)
|
|
||||||
if (err && err.message && err.message.includes('ENOENT')) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Error(`failed to remove exported credentials: ${err}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Converts a multi-line or comma-separated collection of strings into an array
|
|
||||||
* of trimmed strings.
|
|
||||||
*/
|
|
||||||
export function explodeStrings(input: string): Array<string> {
|
|
||||||
if (!input || input.trim().length === 0) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
const list = new Array<string>();
|
|
||||||
let curr = '';
|
|
||||||
let escaped = false;
|
|
||||||
for (const ch of input) {
|
|
||||||
if (escaped) {
|
|
||||||
curr += ch;
|
|
||||||
escaped = false;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (ch) {
|
|
||||||
case '\\':
|
|
||||||
escaped = true;
|
|
||||||
continue;
|
|
||||||
case ',':
|
|
||||||
case '\n': {
|
|
||||||
const val = curr.trim();
|
|
||||||
if (val) {
|
|
||||||
list.push(val);
|
|
||||||
}
|
|
||||||
curr = '';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
curr += ch;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const val = curr.trim();
|
|
||||||
if (val) {
|
|
||||||
list.push(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* toBase64 base64 URL encodes the result.
|
|
||||||
*/
|
|
||||||
export function toBase64(s: string | Buffer): string {
|
|
||||||
return Buffer.from(s)
|
|
||||||
.toString('base64')
|
|
||||||
.replace(/\+/g, '-')
|
|
||||||
.replace(/\//g, '_')
|
|
||||||
.replace(/=+$/, '');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fromBase64 base64 decodes the result, taking into account URL and standard
|
|
||||||
* encoding with and without padding.
|
|
||||||
*/
|
|
||||||
export function fromBase64(s: string): string {
|
|
||||||
let str = s.replace(/-/g, '+').replace(/_/g, '/');
|
|
||||||
while (str.length % 4) str += '=';
|
|
||||||
return Buffer.from(str, 'base64').toString('utf8');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* trimmedString returns a string trimmed of whitespace. If the input string is
|
|
||||||
* null, then it returns the empty string.
|
|
||||||
*/
|
|
||||||
export function trimmedString(s: string | undefined | null): string {
|
|
||||||
return s ? s.trim() : '';
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* parseDuration parses a user-supplied string duration with optional suffix and
|
|
||||||
* returns a number representing the number of seconds. It returns 0 when given
|
|
||||||
* the empty string.
|
|
||||||
*
|
|
||||||
* @param str Duration string
|
|
||||||
*/
|
|
||||||
export function parseDuration(str: string): number {
|
|
||||||
const given = (str || '').trim();
|
|
||||||
if (!given) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
let total = 0;
|
|
||||||
let curr = '';
|
|
||||||
for (let i = 0; i < str.length; i++) {
|
|
||||||
const ch = str[i];
|
|
||||||
switch (ch) {
|
|
||||||
case ' ':
|
|
||||||
continue;
|
|
||||||
case ',':
|
|
||||||
continue;
|
|
||||||
case 's': {
|
|
||||||
total += +curr;
|
|
||||||
curr = '';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'm': {
|
|
||||||
total += +curr * 60;
|
|
||||||
curr = '';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 'h': {
|
|
||||||
total += +curr * 60 * 60;
|
|
||||||
curr = '';
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case '0':
|
|
||||||
case '1':
|
|
||||||
case '2':
|
|
||||||
case '3':
|
|
||||||
case '4':
|
|
||||||
case '5':
|
|
||||||
case '6':
|
|
||||||
case '7':
|
|
||||||
case '8':
|
|
||||||
case '9':
|
|
||||||
curr += ch;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw new SyntaxError(`Unsupported character "${ch}" at position ${i}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Anything left over is seconds
|
|
||||||
if (curr) {
|
|
||||||
total += +curr;
|
|
||||||
}
|
|
||||||
|
|
||||||
return total;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* buildDomainWideDelegationJWT constructs an _unsigned_ JWT to be used for a
|
* buildDomainWideDelegationJWT constructs an _unsigned_ JWT to be used for a
|
||||||
* DWD exchange. The JWT must be signed and then exchanged with the OAuth
|
* DWD exchange. The JWT must be signed and then exchanged with the OAuth
|
||||||
@ -229,27 +35,3 @@ export function buildDomainWideDelegationJWT(
|
|||||||
|
|
||||||
return JSON.stringify(body);
|
return JSON.stringify(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* errorMessage extracts the error message from the given error.
|
|
||||||
*
|
|
||||||
* TODO(sethvargo): Candidate for centralization.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
export function errorMessage(err: unknown): string {
|
|
||||||
if (!err) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
let msg = err instanceof Error ? err.message : `${err}`;
|
|
||||||
msg = msg.trim();
|
|
||||||
msg = msg.replace('Error: ', '');
|
|
||||||
msg = msg.trim();
|
|
||||||
|
|
||||||
if (!msg) {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
msg = msg[0].toLowerCase() + msg.slice(1);
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
@ -3,258 +3,9 @@
|
|||||||
import 'mocha';
|
import 'mocha';
|
||||||
import { expect } from 'chai';
|
import { expect } from 'chai';
|
||||||
|
|
||||||
import { tmpdir } from 'os';
|
import { buildDomainWideDelegationJWT } from '../src/utils';
|
||||||
import { existsSync, readFileSync } from 'fs';
|
|
||||||
|
|
||||||
import {
|
|
||||||
buildDomainWideDelegationJWT,
|
|
||||||
explodeStrings,
|
|
||||||
fromBase64,
|
|
||||||
parseDuration,
|
|
||||||
removeExportedCredentials,
|
|
||||||
toBase64,
|
|
||||||
trimmedString,
|
|
||||||
writeSecureFile,
|
|
||||||
} from '../src/utils';
|
|
||||||
|
|
||||||
describe('Utils', () => {
|
describe('Utils', () => {
|
||||||
describe('#writeSecureFile', () => {
|
|
||||||
it('writes data to the file', async () => {
|
|
||||||
const tmp = tmpdir();
|
|
||||||
const filePath = await writeSecureFile(tmp, 'hi');
|
|
||||||
expect(existsSync(filePath)).to.be.true;
|
|
||||||
expect(readFileSync(filePath).toString('utf8')).to.eq('hi');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('generates a random name', async () => {
|
|
||||||
const tmp = tmpdir();
|
|
||||||
const filePath1 = await writeSecureFile(tmp, 'hi');
|
|
||||||
const filePath2 = await writeSecureFile(tmp, 'bye');
|
|
||||||
expect(filePath1).to.not.eq(filePath2);
|
|
||||||
expect(filePath1).to.not.eq(filePath2);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#removeExportedCredentials', () => {
|
|
||||||
it('does nothing when GOOGLE_GHA_CREDS_PATH is unset', async () => {
|
|
||||||
delete process.env.GOOGLE_GHA_CREDS_PATH;
|
|
||||||
const pth = await removeExportedCredentials();
|
|
||||||
expect(pth).to.eq('');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('deletes the file', async () => {
|
|
||||||
const filePath = await writeSecureFile(tmpdir(), 'my data');
|
|
||||||
process.env.GOOGLE_GHA_CREDS_PATH = filePath;
|
|
||||||
const pth = await removeExportedCredentials();
|
|
||||||
expect(existsSync(filePath)).to.be.false;
|
|
||||||
expect(pth).to.eq(filePath);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('does not fail if the file does not exist', async () => {
|
|
||||||
const filePath = '/not/a/file';
|
|
||||||
process.env.GOOGLE_GHA_CREDS_PATH = filePath;
|
|
||||||
const pth = await removeExportedCredentials();
|
|
||||||
expect(pth).to.eq('');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#explodeStrings', () => {
|
|
||||||
const cases = [
|
|
||||||
{
|
|
||||||
name: 'empty string',
|
|
||||||
input: '',
|
|
||||||
expected: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'padded empty string',
|
|
||||||
input: ' ',
|
|
||||||
expected: [],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'comma-separated',
|
|
||||||
input: 'hello , world , and goodbye',
|
|
||||||
expected: ['hello', 'world', 'and goodbye'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'newline-separated',
|
|
||||||
input: `
|
|
||||||
hello
|
|
||||||
world
|
|
||||||
and goodbye`,
|
|
||||||
expected: ['hello', 'world', 'and goodbye'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'comma and newline-separated',
|
|
||||||
input: `
|
|
||||||
hello,
|
|
||||||
world,
|
|
||||||
and goodbye,`,
|
|
||||||
expected: ['hello', 'world', 'and goodbye'],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'comma-escaped',
|
|
||||||
input: 'hello , world , and\\, goodbye',
|
|
||||||
expected: ['hello', 'world', 'and, goodbye'],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
cases.forEach((tc) => {
|
|
||||||
it(tc.name, async () => {
|
|
||||||
expect(explodeStrings(tc.input)).to.eql(tc.expected);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#toBase64', () => {
|
|
||||||
const cases = [
|
|
||||||
{
|
|
||||||
name: 'empty string',
|
|
||||||
input: '',
|
|
||||||
expected: '',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'empty buffer',
|
|
||||||
input: Buffer.from(''),
|
|
||||||
expected: '',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'encodes string',
|
|
||||||
input: 'hello',
|
|
||||||
expected: 'aGVsbG8',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'encodes buffer',
|
|
||||||
input: Buffer.from('hello'),
|
|
||||||
expected: 'aGVsbG8',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
cases.forEach((tc) => {
|
|
||||||
it(tc.name, async () => {
|
|
||||||
expect(toBase64(tc.input)).to.eq(tc.expected);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#fromBase64', () => {
|
|
||||||
const cases = [
|
|
||||||
{
|
|
||||||
name: 'decodes',
|
|
||||||
input: 'aGVsbG8',
|
|
||||||
expected: 'hello',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'decodes padded',
|
|
||||||
input: 'aGVsbG8==',
|
|
||||||
expected: 'hello',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'decodes semi-padded',
|
|
||||||
input: 'aGVsbG8=',
|
|
||||||
expected: 'hello',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
cases.forEach((tc) => {
|
|
||||||
it(tc.name, async () => {
|
|
||||||
expect(fromBase64(tc.input)).to.eq(tc.expected);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#trimmedString', () => {
|
|
||||||
const cases = [
|
|
||||||
{
|
|
||||||
name: 'null',
|
|
||||||
input: null,
|
|
||||||
expected: '',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'undefined',
|
|
||||||
input: undefined,
|
|
||||||
expected: '',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'empty string',
|
|
||||||
input: '',
|
|
||||||
expected: '',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'trims',
|
|
||||||
input: ' hello world ',
|
|
||||||
expected: 'hello world',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
cases.forEach((tc) => {
|
|
||||||
it(tc.name, async () => {
|
|
||||||
expect(trimmedString(tc.input)).to.eq(tc.expected);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#parseDuration', () => {
|
|
||||||
const cases = [
|
|
||||||
{
|
|
||||||
name: 'empty string',
|
|
||||||
input: '',
|
|
||||||
expected: 0,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'unitless',
|
|
||||||
input: '149585',
|
|
||||||
expected: 149585,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'with commas',
|
|
||||||
input: '149,585',
|
|
||||||
expected: 149585,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'suffix seconds',
|
|
||||||
input: '149585s',
|
|
||||||
expected: 149585,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'suffix minutes',
|
|
||||||
input: '25m',
|
|
||||||
expected: 1500,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'suffix hours',
|
|
||||||
input: '12h',
|
|
||||||
expected: 43200,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'suffix hours minutes seconds',
|
|
||||||
input: '12h10m55s',
|
|
||||||
expected: 43855,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'commas and spaces',
|
|
||||||
input: '12h, 10m 55s',
|
|
||||||
expected: 43855,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'invalid',
|
|
||||||
input: '12h blueberries',
|
|
||||||
error: 'Unsupported character "b" at position 4',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
cases.forEach((tc) => {
|
|
||||||
it(tc.name, async () => {
|
|
||||||
if (tc.expected) {
|
|
||||||
expect(parseDuration(tc.input)).to.eq(tc.expected);
|
|
||||||
} else if (tc.error) {
|
|
||||||
expect(() => {
|
|
||||||
parseDuration(tc.input);
|
|
||||||
}).to.throw(tc.error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('#buildDomainWideDelegationJWT', () => {
|
describe('#buildDomainWideDelegationJWT', () => {
|
||||||
const cases = [
|
const cases = [
|
||||||
{
|
{
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"compilerOptions": {
|
||||||
|
"alwaysStrict": true,
|
||||||
"target": "es6",
|
"target": "es6",
|
||||||
"module": "commonjs",
|
"module": "commonjs",
|
||||||
"lib": [
|
"lib": [
|
||||||
|
Loading…
Reference in New Issue
Block a user