Merge pull request #393 from davelosert/write-summary-to-pr

Add Feature: Write Summary as comment to the pull request
This commit is contained in:
Federico Builes
2023-02-16 14:44:03 +01:00
committed by GitHub
9 changed files with 349 additions and 251 deletions
+15 -15
View File
@@ -66,22 +66,22 @@ jobs:
Configure this action by either inlining these options in your workflow file, or by using an external configuration file. All configuration options are optional. Configure this action by either inlining these options in your workflow file, or by using an external configuration file. All configuration options are optional.
| Option | Usage | Possible values | Default value | | Option | Usage | Possible values | Default value |
|-----------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------|---------------| | ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ------------- |
| `fail-on-severity` | Defines the threshold for the level of severity. The action will fail on any pull requests that introduce vulnerabilities of the specified severity level or higher. | `low`, `moderate`, `high`, `critical` | `low` | | `fail-on-severity` | Defines the threshold for the level of severity. The action will fail on any pull requests that introduce vulnerabilities of the specified severity level or higher. | `low`, `moderate`, `high`, `critical` | `low` |
| `allow-licenses`* | Contains a list of allowed licenses. The action will fail on pull requests that introduce dependencies with licenses that do not match the list. | Any [SPDX-compliant identifier(s)](https://spdx.org/licenses/) | none | | `allow-licenses`* | Contains a list of allowed licenses. The action will fail on pull requests that introduce dependencies with licenses that do not match the list. | Any [SPDX-compliant identifier(s)](https://spdx.org/licenses/) | none |
| `deny-licenses`* | Contains a list of prohibited licenses. The action will fail on pull requests that introduce dependencies with licenses that match the list. | Any [SPDX-compliant identifier(s)](https://spdx.org/licenses/) | none | | `deny-licenses`* | Contains a list of prohibited licenses. The action will fail on pull requests that introduce dependencies with licenses that match the list. | Any [SPDX-compliant identifier(s)](https://spdx.org/licenses/) | none |
| `fail-on-scopes`† | Contains a list of strings of the build environments you want to support. The action will fail on pull requests that introduce vulnerabilities in the scopes that match the list. |`runtime`, `development`, `unknown` | `runtime` | | `fail-on-scopes` | Contains a list of strings of the build environments you want to support. The action will fail on pull requests that introduce vulnerabilities in the scopes that match the list. | `runtime`, `development`, `unknown` | `runtime` |
| `allow-ghsas` | Contains a list of GitHub Advisory Database IDs that can be skipped during detection. | Any GHSAs from the [GitHub Advisory Database](https://github.com/advisories) | none | | `allow-ghsas` | Contains a list of GitHub Advisory Database IDs that can be skipped during detection. | Any GHSAs from the [GitHub Advisory Database](https://github.com/advisories) | none |
| `license-check` | Enable or disable the license check performed by the action. | `true`, `false` | `true` | | `license-check` | Enable or disable the license check performed by the action. | `true`, `false` | `true` |
| `vulnerability-check` | Enable or disable the vulnerability check performed by the action. | `true`, `false` | `true` | | `vulnerability-check` | Enable or disable the vulnerability check performed by the action. | `true`, `false` | `true` |
| `base-ref`/`head-ref` | Provide custom git references for the git base/head when performing the comparison check. This is only used for event types other than `pull_request` and `pull_request_target`. | Any valid git ref(s) in your project | none | | `base-ref`/`head-ref` | Provide custom git references for the git base/head when performing the comparison check. This is only used for event types other than `pull_request` and `pull_request_target`. | Any valid git ref(s) in your project | none |
| `comment-summary-in-pr` | Enable or disable reporting the review summary as a comment in the pull request. If enabled, you must give the workflow or job permission `pull-requests: write`. | `true`, `false` | `false` |
*not supported for use with GitHub Enterprise Server *not supported for use with GitHub Enterprise Server
†will be supported with GitHub Enterprise Server 3.8 †will be supported with GitHub Enterprise Server 3.8
### Inline Configuration ### Inline Configuration
You can pass options to the Dependency Review GitHub Action using your workflow file. You can pass options to the Dependency Review GitHub Action using your workflow file.
@@ -112,10 +112,10 @@ jobs:
You can use an external configuration file to specify the settings for this action. It can be a local file or a file in an external repository. Refer to the following options for the specification. You can use an external configuration file to specify the settings for this action. It can be a local file or a file in an external repository. Refer to the following options for the specification.
| Option | Usage | Possible values | | Option | Usage | Possible values |
|-----------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------| | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| `config-file` | A path to a file in the current repository or an external repository. Use this syntax for external files: `OWNER/REPOSITORY/FILENAME@BRANCH` | **Local file**: `./.github/dependency-review-config.yml` <br> **External repo**: `github/octorepo/dependency-review-config.yml@main` | | `config-file` | A path to a file in the current repository or an external repository. Use this syntax for external files: `OWNER/REPOSITORY/FILENAME@BRANCH` | **Local file**: `./.github/dependency-review-config.yml` <br> **External repo**: `github/octorepo/dependency-review-config.yml@main` |
| `external-repo-token` | Specifies a token for fetching the configuration file. It is required if the file resides in a private external repository and for all GitHub Enterprise Server repositories. Create a token in [developer settings](https://github.com/settings/tokens). | Any token with `read` permissions to the repository hosting the config file. | | `external-repo-token` | Specifies a token for fetching the configuration file. It is required if the file resides in a private external repository and for all GitHub Enterprise Server repositories. Create a token in [developer settings](https://github.com/settings/tokens). | Any token with `read` permissions to the repository hosting the config file. |
#### Example #### Example
+2 -1
View File
@@ -22,7 +22,8 @@ function clearInputs() {
'VULNERABILITY-CHECK', 'VULNERABILITY-CHECK',
'CONFIG-FILE', 'CONFIG-FILE',
'BASE-REF', 'BASE-REF',
'HEAD-REF' 'HEAD-REF',
'COMMENT-SUMMARY-IN-PR'
] ]
allowedOptions.forEach(option => { allowedOptions.forEach(option => {
+3
View File
@@ -41,6 +41,9 @@ inputs:
vulnerability-check: vulnerability-check:
description: A boolean to determine if vulnerability checks should be performed description: A boolean to determine if vulnerability checks should be performed
required: false required: false
comment-summary-in-pr:
description: A boolean to determine if the report should be posted as a comment in the PR itself. Setting this to true requires you to give the workflow the write permissions for pull-requests
required: false
runs: runs:
using: 'node16' using: 'node16'
main: 'dist/index.js' main: 'dist/index.js'
Generated Vendored
+232 -229
View File
@@ -1,6 +1,142 @@
require('./sourcemap-register.js');/******/ (() => { // webpackBootstrap require('./sourcemap-register.js');/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({ /******/ var __webpack_modules__ = ({
/***/ 5842:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __asyncValues = (this && this.__asyncValues) || function (o) {
if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
var m = o[Symbol.asyncIterator], i;
return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
exports.commentPr = void 0;
const github = __importStar(__nccwpck_require__(5438));
const core = __importStar(__nccwpck_require__(2186));
const githubUtils = __importStar(__nccwpck_require__(3030));
const retry = __importStar(__nccwpck_require__(6298));
const request_error_1 = __nccwpck_require__(537);
const retryingOctokit = githubUtils.GitHub.plugin(retry.retry);
const octo = new retryingOctokit(githubUtils.getOctokitOptions(core.getInput('repo-token', { required: true })));
// Comment Marker to identify an existing comment to update, so we don't spam the PR with comments
const COMMENT_MARKER = '<!-- dependency-review-pr-comment-marker -->';
function commentPr(summary) {
return __awaiter(this, void 0, void 0, function* () {
if (!github.context.payload.pull_request) {
core.warning('Not in the context of a pull request. Skipping comment creation.');
return;
}
const commentBody = `${summary.stringify()}\n\n${COMMENT_MARKER}`;
try {
const existingCommentId = yield findCommentByMarker(COMMENT_MARKER);
if (existingCommentId) {
yield octo.rest.issues.updateComment({
owner: github.context.repo.owner,
repo: github.context.repo.repo,
comment_id: existingCommentId,
body: commentBody
});
}
else {
yield octo.rest.issues.createComment({
owner: github.context.repo.owner,
repo: github.context.repo.repo,
issue_number: github.context.payload.pull_request.number,
body: commentBody
});
}
}
catch (error) {
if (error instanceof request_error_1.RequestError && error.status === 403) {
core.warning(`Unable to write summary to pull-request. Make sure you are giving this workflow the permission 'pull-requests: write'.`);
}
else {
if (error instanceof Error) {
core.warning(`Unable to comment summary to pull-request, received error: ${error.message}`);
}
else {
core.warning('Unable to comment summary to pull-request: Unexpected fatal error');
}
}
}
});
}
exports.commentPr = commentPr;
function findCommentByMarker(commentBodyIncludes) {
var _a, e_1, _b, _c;
return __awaiter(this, void 0, void 0, function* () {
const commentsIterator = octo.paginate.iterator(octo.rest.issues.listComments, {
owner: github.context.repo.owner,
repo: github.context.repo.repo,
// We are already checking if we are in the context of a pull request in the caller
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
issue_number: github.context.payload.pull_request.number
});
try {
for (var _d = true, commentsIterator_1 = __asyncValues(commentsIterator), commentsIterator_1_1; commentsIterator_1_1 = yield commentsIterator_1.next(), _a = commentsIterator_1_1.done, !_a;) {
_c = commentsIterator_1_1.value;
_d = false;
try {
const { data: comments } = _c;
const existingComment = comments.find(comment => { var _a; return (_a = comment.body) === null || _a === void 0 ? void 0 : _a.includes(commentBodyIncludes); });
if (existingComment)
return existingComment.id;
}
finally {
_d = true;
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (!_d && !_a && (_b = commentsIterator_1.return)) yield _b.call(commentsIterator_1);
}
finally { if (e_1) throw e_1.error; }
}
return undefined;
});
}
/***/ }),
/***/ 4966: /***/ 4966:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
@@ -322,6 +458,7 @@ const licenses_1 = __nccwpck_require__(3247);
const summary = __importStar(__nccwpck_require__(8608)); const summary = __importStar(__nccwpck_require__(8608));
const git_refs_1 = __nccwpck_require__(1086); const git_refs_1 = __nccwpck_require__(1086);
const utils_1 = __nccwpck_require__(918); const utils_1 = __nccwpck_require__(918);
const comment_pr_1 = __nccwpck_require__(5842);
function run() { function run() {
return __awaiter(this, void 0, void 0, function* () { return __awaiter(this, void 0, void 0, function* () {
try { try {
@@ -354,6 +491,9 @@ function run() {
} }
summary.addScannedDependencies(changes); summary.addScannedDependencies(changes);
printScannedDependencies(changes); printScannedDependencies(changes);
if (config.comment_summary_in_pr) {
yield (0, comment_pr_1.commentPr)(core.summary);
}
} }
catch (error) { catch (error) {
if (error instanceof request_error_1.RequestError && error.status === 404) { if (error instanceof request_error_1.RequestError && error.status === 404) {
@@ -539,7 +679,8 @@ exports.ConfigurationOptionsSchema = z
vulnerability_check: z.boolean().default(true), vulnerability_check: z.boolean().default(true),
config_file: z.string().optional(), config_file: z.string().optional(),
base_ref: z.string().optional(), base_ref: z.string().optional(),
head_ref: z.string().optional() head_ref: z.string().optional(),
comment_summary_in_pr: z.boolean().default(false)
}) })
.superRefine((config, context) => { .superRefine((config, context) => {
if (config.allow_licenses && config.deny_licenses) { if (config.allow_licenses && config.deny_licenses) {
@@ -41013,7 +41154,7 @@ const isDirty = (x) => x.status === "dirty";
exports.isDirty = isDirty; exports.isDirty = isDirty;
const isValid = (x) => x.status === "valid"; const isValid = (x) => x.status === "valid";
exports.isValid = isValid; exports.isValid = isValid;
const isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise; const isAsync = (x) => typeof Promise !== undefined && x instanceof Promise;
exports.isAsync = isAsync; exports.isAsync = isAsync;
@@ -41566,29 +41707,28 @@ class ZodType {
return this._refinement(refinement); return this._refinement(refinement);
} }
optional() { optional() {
return ZodOptional.create(this, this._def); return ZodOptional.create(this);
} }
nullable() { nullable() {
return ZodNullable.create(this, this._def); return ZodNullable.create(this);
} }
nullish() { nullish() {
return this.nullable().optional(); return this.optional().nullable();
} }
array() { array() {
return ZodArray.create(this, this._def); return ZodArray.create(this);
} }
promise() { promise() {
return ZodPromise.create(this, this._def); return ZodPromise.create(this);
} }
or(option) { or(option) {
return ZodUnion.create([this, option], this._def); return ZodUnion.create([this, option]);
} }
and(incoming) { and(incoming) {
return ZodIntersection.create(this, incoming, this._def); return ZodIntersection.create(this, incoming);
} }
transform(transform) { transform(transform) {
return new ZodEffects({ return new ZodEffects({
...processCreateParams(this._def),
schema: this, schema: this,
typeName: ZodFirstPartyTypeKind.ZodEffects, typeName: ZodFirstPartyTypeKind.ZodEffects,
effect: { type: "transform", transform }, effect: { type: "transform", transform },
@@ -41597,7 +41737,6 @@ class ZodType {
default(def) { default(def) {
const defaultValueFunc = typeof def === "function" ? def : () => def; const defaultValueFunc = typeof def === "function" ? def : () => def;
return new ZodDefault({ return new ZodDefault({
...processCreateParams(this._def),
innerType: this, innerType: this,
defaultValue: defaultValueFunc, defaultValue: defaultValueFunc,
typeName: ZodFirstPartyTypeKind.ZodDefault, typeName: ZodFirstPartyTypeKind.ZodDefault,
@@ -41607,15 +41746,14 @@ class ZodType {
return new ZodBranded({ return new ZodBranded({
typeName: ZodFirstPartyTypeKind.ZodBranded, typeName: ZodFirstPartyTypeKind.ZodBranded,
type: this, type: this,
...processCreateParams(this._def), ...processCreateParams(undefined),
}); });
} }
catch(def) { catch(def) {
const catchValueFunc = typeof def === "function" ? def : () => def; const defaultValueFunc = typeof def === "function" ? def : () => def;
return new ZodCatch({ return new ZodCatch({
...processCreateParams(this._def),
innerType: this, innerType: this,
catchValue: catchValueFunc, defaultValue: defaultValueFunc,
typeName: ZodFirstPartyTypeKind.ZodCatch, typeName: ZodFirstPartyTypeKind.ZodCatch,
}); });
} }
@@ -41640,15 +41778,12 @@ exports.ZodType = ZodType;
exports.Schema = ZodType; exports.Schema = ZodType;
exports.ZodSchema = ZodType; exports.ZodSchema = ZodType;
const cuidRegex = /^c[^\s-]{8,}$/i; const cuidRegex = /^c[^\s-]{8,}$/i;
const cuid2Regex = /^[a-z][a-z0-9]*$/;
const uuidRegex = /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i; const uuidRegex = /^([a-f0-9]{8}-[a-f0-9]{4}-[1-5][a-f0-9]{3}-[a-f0-9]{4}-[a-f0-9]{12}|00000000-0000-0000-0000-000000000000)$/i;
// from https://stackoverflow.com/a/46181/1550155 // from https://stackoverflow.com/a/46181/1550155
// old version: too slow, didn't support unicode // old version: too slow, didn't support unicode
// const emailRegex = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i; // const emailRegex = /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i;
//old email regex
// const emailRegex = /^(([^<>()[\].,;:\s@"]+(\.[^<>()[\].,;:\s@"]+)*)|(".+"))@((?!-)([^<>()[\].,;:\s@"]+\.)+[^<>()[\].,;:\s@"]{1,})[^-<>()[\].,;:\s@"]$/i;
// eslint-disable-next-line // eslint-disable-next-line
const emailRegex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|([^-]([a-zA-Z0-9-]*\.)+[a-zA-Z]{2,}))$/; const emailRegex = /^(([^<>()[\]\.,;:\s@\"]+(\.[^<>()[\]\.,;:\s@\"]+)*)|(\".+\"))@(([^<>()[\]\.,;:\s@\"]+\.)+[^<>()[\]\.,;:\s@\"]{2,})$/i;
// interface IsDateStringOptions extends StringDateOptions { // interface IsDateStringOptions extends StringDateOptions {
/** /**
* Match any configuration * Match any configuration
@@ -41659,7 +41794,7 @@ const emailRegex = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\
const datetimeRegex = (args) => { const datetimeRegex = (args) => {
if (args.precision) { if (args.precision) {
if (args.offset) { if (args.offset) {
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${args.precision}}(([+-]\\d{2}(:?\\d{2})?)|Z)$`); return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${args.precision}}(([+-]\\d{2}:\\d{2})|Z)$`);
} }
else { else {
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${args.precision}}Z$`); return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d{${args.precision}}Z$`);
@@ -41667,7 +41802,7 @@ const datetimeRegex = (args) => {
} }
else if (args.precision === 0) { else if (args.precision === 0) {
if (args.offset) { if (args.offset) {
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}(:?\\d{2})?)|Z)$`); return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(([+-]\\d{2}:\\d{2})|Z)$`);
} }
else { else {
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$`); return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}Z$`);
@@ -41675,7 +41810,7 @@ const datetimeRegex = (args) => {
} }
else { else {
if (args.offset) { if (args.offset) {
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}(:?\\d{2})?)|Z)$`); return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?(([+-]\\d{2}:\\d{2})|Z)$`);
} }
else { else {
return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$`); return new RegExp(`^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d+)?Z$`);
@@ -41808,17 +41943,6 @@ class ZodString extends ZodType {
status.dirty(); status.dirty();
} }
} }
else if (check.kind === "cuid2") {
if (!cuid2Regex.test(input.data)) {
ctx = this._getOrReturnCtx(input, ctx);
(0, parseUtil_1.addIssueToContext)(ctx, {
validation: "cuid2",
code: ZodError_1.ZodIssueCode.invalid_string,
message: check.message,
});
status.dirty();
}
}
else if (check.kind === "url") { else if (check.kind === "url") {
try { try {
new URL(input.data); new URL(input.data);
@@ -41907,9 +42031,6 @@ class ZodString extends ZodType {
cuid(message) { cuid(message) {
return this._addCheck({ kind: "cuid", ...errorUtil_1.errorUtil.errToObj(message) }); return this._addCheck({ kind: "cuid", ...errorUtil_1.errorUtil.errToObj(message) });
} }
cuid2(message) {
return this._addCheck({ kind: "cuid2", ...errorUtil_1.errorUtil.errToObj(message) });
}
datetime(options) { datetime(options) {
var _a; var _a;
if (typeof options === "string") { if (typeof options === "string") {
@@ -41984,9 +42105,6 @@ class ZodString extends ZodType {
get isCUID() { get isCUID() {
return !!this._def.checks.find((ch) => ch.kind === "cuid"); return !!this._def.checks.find((ch) => ch.kind === "cuid");
} }
get isCUID2() {
return !!this._def.checks.find((ch) => ch.kind === "cuid2");
}
get minLength() { get minLength() {
let min = null; let min = null;
for (const ch of this._def.checks) { for (const ch of this._def.checks) {
@@ -42228,27 +42346,7 @@ class ZodNumber extends ZodType {
return max; return max;
} }
get isInt() { get isInt() {
return !!this._def.checks.find((ch) => ch.kind === "int" || return !!this._def.checks.find((ch) => ch.kind === "int");
(ch.kind === "multipleOf" && util_1.util.isInteger(ch.value)));
}
get isFinite() {
let max = null, min = null;
for (const ch of this._def.checks) {
if (ch.kind === "finite" ||
ch.kind === "int" ||
ch.kind === "multipleOf") {
return true;
}
else if (ch.kind === "min") {
if (min === null || ch.value > min)
min = ch.value;
}
else if (ch.kind === "max") {
if (max === null || ch.value < max)
max = ch.value;
}
}
return Number.isFinite(min) && Number.isFinite(max);
} }
} }
exports.ZodNumber = ZodNumber; exports.ZodNumber = ZodNumber;
@@ -42620,13 +42718,13 @@ class ZodArray extends ZodType {
} }
} }
if (ctx.common.async) { if (ctx.common.async) {
return Promise.all([...ctx.data].map((item, i) => { return Promise.all(ctx.data.map((item, i) => {
return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i)); return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i));
})).then((result) => { })).then((result) => {
return parseUtil_1.ParseStatus.mergeArray(status, result); return parseUtil_1.ParseStatus.mergeArray(status, result);
}); });
} }
const result = [...ctx.data].map((item, i) => { const result = ctx.data.map((item, i) => {
return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i)); return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i));
}); });
return parseUtil_1.ParseStatus.mergeArray(status, result); return parseUtil_1.ParseStatus.mergeArray(status, result);
@@ -42683,6 +42781,15 @@ var objectUtil;
}; };
}; };
})(objectUtil = exports.objectUtil || (exports.objectUtil = {})); })(objectUtil = exports.objectUtil || (exports.objectUtil = {}));
const AugmentFactory = (def) => (augmentation) => {
return new ZodObject({
...def,
shape: () => ({
...def.shape(),
...augmentation,
}),
});
};
function deepPartialify(schema) { function deepPartialify(schema) {
if (schema instanceof ZodObject) { if (schema instanceof ZodObject) {
const newShape = {}; const newShape = {};
@@ -42720,43 +42827,8 @@ class ZodObject extends ZodType {
* If you want to pass through unknown properties, use `.passthrough()` instead. * If you want to pass through unknown properties, use `.passthrough()` instead.
*/ */
this.nonstrict = this.passthrough; this.nonstrict = this.passthrough;
// extend< this.augment = AugmentFactory(this._def);
// Augmentation extends ZodRawShape, this.extend = AugmentFactory(this._def);
// NewOutput extends util.flatten<{
// [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation
// ? Augmentation[k]["_output"]
// : k extends keyof Output
// ? Output[k]
// : never;
// }>,
// NewInput extends util.flatten<{
// [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation
// ? Augmentation[k]["_input"]
// : k extends keyof Input
// ? Input[k]
// : never;
// }>
// >(
// augmentation: Augmentation
// ): ZodObject<
// extendShape<T, Augmentation>,
// UnknownKeys,
// Catchall,
// NewOutput,
// NewInput
// > {
// return new ZodObject({
// ...this._def,
// shape: () => ({
// ...this._def.shape(),
// ...augmentation,
// }),
// }) as any;
// }
/**
* @deprecated Use `.extend` instead
* */
this.augment = this.extend;
} }
_getCached() { _getCached() {
if (this._cached !== null) if (this._cached !== null)
@@ -42894,31 +42966,8 @@ class ZodObject extends ZodType {
unknownKeys: "passthrough", unknownKeys: "passthrough",
}); });
} }
// const AugmentFactory = setKey(key, schema) {
// <Def extends ZodObjectDef>(def: Def) => return this.augment({ [key]: schema });
// <Augmentation extends ZodRawShape>(
// augmentation: Augmentation
// ): ZodObject<
// extendShape<ReturnType<Def["shape"]>, Augmentation>,
// Def["unknownKeys"],
// Def["catchall"]
// > => {
// return new ZodObject({
// ...def,
// shape: () => ({
// ...def.shape(),
// ...augmentation,
// }),
// }) as any;
// };
extend(augmentation) {
return new ZodObject({
...this._def,
shape: () => ({
...this._def.shape(),
...augmentation,
}),
});
} }
/** /**
* Prior to zod@1.0.12 there was a bug in the * Prior to zod@1.0.12 there was a bug in the
@@ -42926,6 +42975,10 @@ class ZodObject extends ZodType {
* upgrade if you are experiencing issues. * upgrade if you are experiencing issues.
*/ */
merge(merging) { merge(merging) {
// const mergedShape = objectUtil.mergeShapes(
// this._def.shape(),
// merging._def.shape()
// );
const merged = new ZodObject({ const merged = new ZodObject({
unknownKeys: merging._def.unknownKeys, unknownKeys: merging._def.unknownKeys,
catchall: merging._def.catchall, catchall: merging._def.catchall,
@@ -42934,65 +42987,6 @@ class ZodObject extends ZodType {
}); });
return merged; return merged;
} }
// merge<
// Incoming extends AnyZodObject,
// Augmentation extends Incoming["shape"],
// NewOutput extends {
// [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation
// ? Augmentation[k]["_output"]
// : k extends keyof Output
// ? Output[k]
// : never;
// },
// NewInput extends {
// [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation
// ? Augmentation[k]["_input"]
// : k extends keyof Input
// ? Input[k]
// : never;
// }
// >(
// merging: Incoming
// ): ZodObject<
// extendShape<T, ReturnType<Incoming["_def"]["shape"]>>,
// Incoming["_def"]["unknownKeys"],
// Incoming["_def"]["catchall"],
// NewOutput,
// NewInput
// > {
// const merged: any = new ZodObject({
// unknownKeys: merging._def.unknownKeys,
// catchall: merging._def.catchall,
// shape: () =>
// objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),
// typeName: ZodFirstPartyTypeKind.ZodObject,
// }) as any;
// return merged;
// }
setKey(key, schema) {
return this.augment({ [key]: schema });
}
// merge<Incoming extends AnyZodObject>(
// merging: Incoming
// ): //ZodObject<T & Incoming["_shape"], UnknownKeys, Catchall> = (merging) => {
// ZodObject<
// extendShape<T, ReturnType<Incoming["_def"]["shape"]>>,
// Incoming["_def"]["unknownKeys"],
// Incoming["_def"]["catchall"]
// > {
// // const mergedShape = objectUtil.mergeShapes(
// // this._def.shape(),
// // merging._def.shape()
// // );
// const merged: any = new ZodObject({
// unknownKeys: merging._def.unknownKeys,
// catchall: merging._def.catchall,
// shape: () =>
// objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),
// typeName: ZodFirstPartyTypeKind.ZodObject,
// }) as any;
// return merged;
// }
catchall(index) { catchall(index) {
return new ZodObject({ return new ZodObject({
...this._def, ...this._def,
@@ -43001,10 +42995,10 @@ class ZodObject extends ZodType {
} }
pick(mask) { pick(mask) {
const shape = {}; const shape = {};
util_1.util.objectKeys(mask).forEach((key) => { util_1.util.objectKeys(mask).map((key) => {
if (mask[key] && this.shape[key]) { // only add to shape if key corresponds to an element of the current shape
if (this.shape[key])
shape[key] = this.shape[key]; shape[key] = this.shape[key];
}
}); });
return new ZodObject({ return new ZodObject({
...this._def, ...this._def,
@@ -43013,8 +43007,8 @@ class ZodObject extends ZodType {
} }
omit(mask) { omit(mask) {
const shape = {}; const shape = {};
util_1.util.objectKeys(this.shape).forEach((key) => { util_1.util.objectKeys(this.shape).map((key) => {
if (!mask[key]) { if (util_1.util.objectKeys(mask).indexOf(key) === -1) {
shape[key] = this.shape[key]; shape[key] = this.shape[key];
} }
}); });
@@ -43028,15 +43022,26 @@ class ZodObject extends ZodType {
} }
partial(mask) { partial(mask) {
const newShape = {}; const newShape = {};
util_1.util.objectKeys(this.shape).forEach((key) => { if (mask) {
const fieldSchema = this.shape[key]; util_1.util.objectKeys(this.shape).map((key) => {
if (mask && !mask[key]) { if (util_1.util.objectKeys(mask).indexOf(key) === -1) {
newShape[key] = fieldSchema; newShape[key] = this.shape[key];
} }
else { else {
newShape[key] = this.shape[key].optional();
}
});
return new ZodObject({
...this._def,
shape: () => newShape,
});
}
else {
for (const key in this.shape) {
const fieldSchema = this.shape[key];
newShape[key] = fieldSchema.optional(); newShape[key] = fieldSchema.optional();
} }
}); }
return new ZodObject({ return new ZodObject({
...this._def, ...this._def,
shape: () => newShape, shape: () => newShape,
@@ -43044,11 +43049,23 @@ class ZodObject extends ZodType {
} }
required(mask) { required(mask) {
const newShape = {}; const newShape = {};
util_1.util.objectKeys(this.shape).forEach((key) => { if (mask) {
if (mask && !mask[key]) { util_1.util.objectKeys(this.shape).map((key) => {
newShape[key] = this.shape[key]; if (util_1.util.objectKeys(mask).indexOf(key) === -1) {
} newShape[key] = this.shape[key];
else { }
else {
const fieldSchema = this.shape[key];
let newField = fieldSchema;
while (newField instanceof ZodOptional) {
newField = newField._def.innerType;
}
newShape[key] = newField;
}
});
}
else {
for (const key in this.shape) {
const fieldSchema = this.shape[key]; const fieldSchema = this.shape[key];
let newField = fieldSchema; let newField = fieldSchema;
while (newField instanceof ZodOptional) { while (newField instanceof ZodOptional) {
@@ -43056,7 +43073,7 @@ class ZodObject extends ZodType {
} }
newShape[key] = newField; newShape[key] = newField;
} }
}); }
return new ZodObject({ return new ZodObject({
...this._def, ...this._def,
shape: () => newShape, shape: () => newShape,
@@ -43441,7 +43458,7 @@ class ZodTuple extends ZodType {
}); });
status.dirty(); status.dirty();
} }
const items = [...ctx.data] const items = ctx.data
.map((item, itemIndex) => { .map((item, itemIndex) => {
const schema = this._def.items[itemIndex] || this._def.rest; const schema = this._def.items[itemIndex] || this._def.rest;
if (!schema) if (!schema)
@@ -43827,7 +43844,6 @@ class ZodLiteral extends ZodType {
if (input.data !== this._def.value) { if (input.data !== this._def.value) {
const ctx = this._getOrReturnCtx(input); const ctx = this._getOrReturnCtx(input);
(0, parseUtil_1.addIssueToContext)(ctx, { (0, parseUtil_1.addIssueToContext)(ctx, {
received: ctx.data,
code: ZodError_1.ZodIssueCode.invalid_literal, code: ZodError_1.ZodIssueCode.invalid_literal,
expected: this._def.value, expected: this._def.value,
}); });
@@ -43902,12 +43918,6 @@ class ZodEnum extends ZodType {
} }
return enumValues; return enumValues;
} }
extract(values) {
return ZodEnum.create(values);
}
exclude(values) {
return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)));
}
} }
exports.ZodEnum = ZodEnum; exports.ZodEnum = ZodEnum;
ZodEnum.create = createZodEnum; ZodEnum.create = createZodEnum;
@@ -43949,9 +43959,6 @@ ZodNativeEnum.create = (values, params) => {
}); });
}; };
class ZodPromise extends ZodType { class ZodPromise extends ZodType {
unwrap() {
return this._def.type;
}
_parse(input) { _parse(input) {
const { ctx } = this._processInputParams(input); const { ctx } = this._processInputParams(input);
if (ctx.parsedType !== util_1.ZodParsedType.promise && if (ctx.parsedType !== util_1.ZodParsedType.promise &&
@@ -44197,30 +44204,24 @@ class ZodCatch extends ZodType {
const result = this._def.innerType._parse({ const result = this._def.innerType._parse({
data: ctx.data, data: ctx.data,
path: ctx.path, path: ctx.path,
parent: { parent: ctx,
...ctx,
common: {
...ctx.common,
issues: [], // don't collect issues from inner type
},
},
}); });
if ((0, parseUtil_1.isAsync)(result)) { if ((0, parseUtil_1.isAsync)(result)) {
return result.then((result) => { return result.then((result) => {
return { return {
status: "valid", status: "valid",
value: result.status === "valid" ? result.value : this._def.catchValue(), value: result.status === "valid" ? result.value : this._def.defaultValue(),
}; };
}); });
} }
else { else {
return { return {
status: "valid", status: "valid",
value: result.status === "valid" ? result.value : this._def.catchValue(), value: result.status === "valid" ? result.value : this._def.defaultValue(),
}; };
} }
} }
removeCatch() { removeDefault() {
return this._def.innerType; return this._def.innerType;
} }
} }
@@ -44229,7 +44230,9 @@ ZodCatch.create = (type, params) => {
return new ZodCatch({ return new ZodCatch({
innerType: type, innerType: type,
typeName: ZodFirstPartyTypeKind.ZodCatch, typeName: ZodFirstPartyTypeKind.ZodCatch,
catchValue: typeof params.catch === "function" ? params.catch : () => params.catch, defaultValue: typeof params.default === "function"
? params.default
: () => params.default,
...processCreateParams(params), ...processCreateParams(params),
}); });
}; };
@@ -44472,10 +44475,7 @@ exports.oboolean = oboolean;
exports.coerce = { exports.coerce = {
string: ((arg) => ZodString.create({ ...arg, coerce: true })), string: ((arg) => ZodString.create({ ...arg, coerce: true })),
number: ((arg) => ZodNumber.create({ ...arg, coerce: true })), number: ((arg) => ZodNumber.create({ ...arg, coerce: true })),
boolean: ((arg) => ZodBoolean.create({ boolean: ((arg) => ZodBoolean.create({ ...arg, coerce: true })),
...arg,
coerce: true,
})),
bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })), bigint: ((arg) => ZodBigInt.create({ ...arg, coerce: true })),
date: ((arg) => ZodDate.create({ ...arg, coerce: true })), date: ((arg) => ZodDate.create({ ...arg, coerce: true })),
}; };
@@ -44555,6 +44555,7 @@ function readInlineConfig() {
const vulnerability_check = getOptionalBoolean('vulnerability-check'); const vulnerability_check = getOptionalBoolean('vulnerability-check');
const base_ref = getOptionalInput('base-ref'); const base_ref = getOptionalInput('base-ref');
const head_ref = getOptionalInput('head-ref'); const head_ref = getOptionalInput('head-ref');
const comment_summary_in_pr = getOptionalBoolean('comment-summary-in-pr');
validateLicenses('allow-licenses', allow_licenses); validateLicenses('allow-licenses', allow_licenses);
validateLicenses('deny-licenses', deny_licenses); validateLicenses('deny-licenses', deny_licenses);
const keys = { const keys = {
@@ -44566,7 +44567,8 @@ function readInlineConfig() {
license_check, license_check,
vulnerability_check, vulnerability_check,
base_ref, base_ref,
head_ref head_ref,
comment_summary_in_pr
}; };
return Object.fromEntries(Object.entries(keys).filter(([_, value]) => value !== undefined)); return Object.fromEntries(Object.entries(keys).filter(([_, value]) => value !== undefined));
} }
@@ -44831,7 +44833,8 @@ exports.ConfigurationOptionsSchema = z
vulnerability_check: z.boolean().default(true), vulnerability_check: z.boolean().default(true),
config_file: z.string().optional(), config_file: z.string().optional(),
base_ref: z.string().optional(), base_ref: z.string().optional(),
head_ref: z.string().optional() head_ref: z.string().optional(),
comment_summary_in_pr: z.boolean().default(false)
}) })
.superRefine((config, context) => { .superRefine((config, context) => {
if (config.allow_licenses && config.deny_licenses) { if (config.allow_licenses && config.deny_licenses) {
Generated Vendored
+1 -1
View File
File diff suppressed because one or more lines are too long
+84
View File
@@ -0,0 +1,84 @@
import * as github from '@actions/github'
import * as core from '@actions/core'
import * as githubUtils from '@actions/github/lib/utils'
import * as retry from '@octokit/plugin-retry'
import {RequestError} from '@octokit/request-error'
const retryingOctokit = githubUtils.GitHub.plugin(retry.retry)
const octo = new retryingOctokit(
githubUtils.getOctokitOptions(core.getInput('repo-token', {required: true}))
)
// Comment Marker to identify an existing comment to update, so we don't spam the PR with comments
const COMMENT_MARKER = '<!-- dependency-review-pr-comment-marker -->'
export async function commentPr(summary: typeof core.summary): Promise<void> {
if (!github.context.payload.pull_request) {
core.warning(
'Not in the context of a pull request. Skipping comment creation.'
)
return
}
const commentBody = `${summary.stringify()}\n\n${COMMENT_MARKER}`
try {
const existingCommentId = await findCommentByMarker(COMMENT_MARKER)
if (existingCommentId) {
await octo.rest.issues.updateComment({
owner: github.context.repo.owner,
repo: github.context.repo.repo,
comment_id: existingCommentId,
body: commentBody
})
} else {
await octo.rest.issues.createComment({
owner: github.context.repo.owner,
repo: github.context.repo.repo,
issue_number: github.context.payload.pull_request.number,
body: commentBody
})
}
} catch (error) {
if (error instanceof RequestError && error.status === 403) {
core.warning(
`Unable to write summary to pull-request. Make sure you are giving this workflow the permission 'pull-requests: write'.`
)
} else {
if (error instanceof Error) {
core.warning(
`Unable to comment summary to pull-request, received error: ${error.message}`
)
} else {
core.warning(
'Unable to comment summary to pull-request: Unexpected fatal error'
)
}
}
}
}
async function findCommentByMarker(
commentBodyIncludes: string
): Promise<number | undefined> {
const commentsIterator = octo.paginate.iterator(
octo.rest.issues.listComments,
{
owner: github.context.repo.owner,
repo: github.context.repo.repo,
// We are already checking if we are in the context of a pull request in the caller
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
issue_number: github.context.payload.pull_request!.number
}
)
for await (const {data: comments} of commentsIterator) {
const existingComment = comments.find(comment =>
comment.body?.includes(commentBodyIncludes)
)
if (existingComment) return existingComment.id
}
return undefined
}
+3 -1
View File
@@ -34,6 +34,7 @@ function readInlineConfig(): ConfigurationOptionsPartial {
const vulnerability_check = getOptionalBoolean('vulnerability-check') const vulnerability_check = getOptionalBoolean('vulnerability-check')
const base_ref = getOptionalInput('base-ref') const base_ref = getOptionalInput('base-ref')
const head_ref = getOptionalInput('head-ref') const head_ref = getOptionalInput('head-ref')
const comment_summary_in_pr = getOptionalBoolean('comment-summary-in-pr')
validateLicenses('allow-licenses', allow_licenses) validateLicenses('allow-licenses', allow_licenses)
validateLicenses('deny-licenses', deny_licenses) validateLicenses('deny-licenses', deny_licenses)
@@ -47,7 +48,8 @@ function readInlineConfig(): ConfigurationOptionsPartial {
license_check, license_check,
vulnerability_check, vulnerability_check,
base_ref, base_ref,
head_ref head_ref,
comment_summary_in_pr
} }
return Object.fromEntries( return Object.fromEntries(
+4
View File
@@ -15,6 +15,7 @@ import * as summary from './summary'
import {getRefs} from './git-refs' import {getRefs} from './git-refs'
import {groupDependenciesByManifest} from './utils' import {groupDependenciesByManifest} from './utils'
import {commentPr} from './comment-pr'
async function run(): Promise<void> { async function run(): Promise<void> {
try { try {
@@ -69,6 +70,9 @@ async function run(): Promise<void> {
summary.addScannedDependencies(changes) summary.addScannedDependencies(changes)
printScannedDependencies(changes) printScannedDependencies(changes)
if (config.comment_summary_in_pr) {
await commentPr(core.summary)
}
} catch (error) { } catch (error) {
if (error instanceof RequestError && error.status === 404) { if (error instanceof RequestError && error.status === 404) {
core.setFailed( core.setFailed(
+2 -1
View File
@@ -45,7 +45,8 @@ export const ConfigurationOptionsSchema = z
vulnerability_check: z.boolean().default(true), vulnerability_check: z.boolean().default(true),
config_file: z.string().optional(), config_file: z.string().optional(),
base_ref: z.string().optional(), base_ref: z.string().optional(),
head_ref: z.string().optional() head_ref: z.string().optional(),
comment_summary_in_pr: z.boolean().default(false)
}) })
.superRefine((config, context) => { .superRefine((config, context) => {
if (config.allow_licenses && config.deny_licenses) { if (config.allow_licenses && config.deny_licenses) {