diff --git a/.changeset/dull-cars-shout.md b/.changeset/dull-cars-shout.md new file mode 100644 index 0000000000..be213a167c --- /dev/null +++ b/.changeset/dull-cars-shout.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend-module-github': patch +--- + +Migrate to using new actions diff --git a/plugins/scaffolder-backend-module-github/report.api.md b/plugins/scaffolder-backend-module-github/report.api.md index 219506d948..2c437d16dd 100644 --- a/plugins/scaffolder-backend-module-github/report.api.md +++ b/plugins/scaffolder-backend-module-github/report.api.md @@ -9,7 +9,6 @@ import { CatalogApi } from '@backstage/catalog-client'; import { Config } from '@backstage/config'; import { createPullRequest } from 'octokit-plugin-create-pull-request'; import { GithubCredentialsProvider } from '@backstage/integration'; -import { JsonObject } from '@backstage/types'; import { Octokit } from 'octokit'; import { OctokitOptions } from '@octokit/core/dist-types/types'; import { ScmIntegrationRegistry } from '@backstage/integration'; @@ -25,13 +24,13 @@ export function createGithubActionsDispatchAction(options: { repoUrl: string; workflowId: string; branchOrTagName: string; - workflowInputs?: { - [key: string]: string; - }; - token?: string; + workflowInputs?: Record | undefined; + token?: string | undefined; }, - JsonObject, - 'v1' + { + [x: string]: any; + }, + 'v2' >; // @public @@ -43,11 +42,13 @@ export function createGithubAutolinksAction(options: { repoUrl: string; keyPrefix: string; urlTemplate: string; - isAlphanumeric?: boolean; - token?: string; + isAlphanumeric?: boolean | undefined; + token?: string | undefined; }, - JsonObject, - 'v1' + { + [x: string]: any; + }, + 'v2' >; // @public @@ -56,35 +57,37 @@ export function createGithubBranchProtectionAction(options: { }): TemplateAction< { repoUrl: string; - branch?: string; - enforceAdmins?: boolean; - requiredApprovingReviewCount?: number; - requireCodeOwnerReviews?: boolean; - dismissStaleReviews?: boolean; + branch?: string | undefined; + enforceAdmins?: boolean | undefined; + requiredApprovingReviewCount?: number | undefined; + requireCodeOwnerReviews?: boolean | undefined; + dismissStaleReviews?: boolean | undefined; bypassPullRequestAllowances?: | { - users?: string[]; - teams?: string[]; - apps?: string[]; + apps?: string[] | undefined; + teams?: string[] | undefined; + users?: string[] | undefined; } | undefined; restrictions?: | { - users: string[]; teams: string[]; - apps?: string[]; + users: string[]; + apps?: string[] | undefined; } | undefined; - requiredStatusCheckContexts?: string[]; - requireBranchesToBeUpToDate?: boolean; - requiredConversationResolution?: boolean; - requireLastPushApproval?: boolean; - requiredCommitSigning?: boolean; - requiredLinearHistory?: boolean; - token?: string; + requiredStatusCheckContexts?: string[] | undefined; + requireBranchesToBeUpToDate?: boolean | undefined; + requiredConversationResolution?: boolean | undefined; + requireLastPushApproval?: boolean | undefined; + requiredCommitSigning?: boolean | undefined; + requiredLinearHistory?: boolean | undefined; + token?: string | undefined; }, - JsonObject, - 'v1' + { + [x: string]: any; + }, + 'v2' >; // @public @@ -96,11 +99,13 @@ export function createGithubDeployKeyAction(options: { publicKey: string; privateKey: string; deployKeyName: string; - privateKeySecretName?: string; - token?: string; + privateKeySecretName?: string | undefined; + token?: string | undefined; }, - JsonObject, - 'v1' + { + privateKeySecretName: string; + }, + 'v2' >; // @public @@ -112,25 +117,25 @@ export function createGithubEnvironmentAction(options: { { repoUrl: string; name: string; - deploymentBranchPolicy?: { - protected_branches: boolean; - custom_branch_policies: boolean; - }; - customBranchPolicyNames?: string[]; - customTagPolicyNames?: string[]; - environmentVariables?: { - [key: string]: string; - }; - secrets?: { - [key: string]: string; - }; - token?: string; - waitTimer?: number; - preventSelfReview?: boolean; - reviewers?: string[]; + deploymentBranchPolicy?: + | { + protected_branches: boolean; + custom_branch_policies: boolean; + } + | undefined; + customBranchPolicyNames?: string[] | undefined; + customTagPolicyNames?: string[] | undefined; + environmentVariables?: Record | undefined; + secrets?: Record | undefined; + token?: string | undefined; + waitTimer?: number | undefined; + preventSelfReview?: boolean | undefined; + reviewers?: string[] | undefined; }, - JsonObject, - 'v1' + { + [x: string]: any; + }, + 'v2' >; // @public @@ -142,10 +147,12 @@ export function createGithubIssuesLabelAction(options: { repoUrl: string; number: number; labels: string[]; - token?: string; + token?: string | undefined; }, - JsonObject, - 'v1' + { + [x: string]: any; + }, + 'v2' >; // @public @@ -155,13 +162,15 @@ export function createGithubPagesEnableAction(options: { }): TemplateAction< { repoUrl: string; - buildType?: 'legacy' | 'workflow'; - sourceBranch?: string; - sourcePath?: '/' | '/docs'; - token?: string; + buildType?: 'legacy' | 'workflow' | undefined; + sourceBranch?: string | undefined; + sourcePath?: '/' | '/docs' | undefined; + token?: string | undefined; }, - JsonObject, - 'v1' + { + [x: string]: any; + }, + 'v2' >; // @public @@ -198,73 +207,76 @@ export function createGithubRepoCreateAction(options: { }): TemplateAction< { repoUrl: string; - description?: string; - homepage?: string; - access?: string; - deleteBranchOnMerge?: boolean; - gitAuthorName?: string; - gitAuthorEmail?: string; - allowRebaseMerge?: boolean; - allowSquashMerge?: boolean; - squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE'; - squashMergeCommitMessage?: 'PR_BODY' | 'COMMIT_MESSAGES' | 'BLANK'; - allowMergeCommit?: boolean; - allowAutoMerge?: boolean; - allowUpdateBranch?: boolean; - requireCodeOwnerReviews?: boolean; - bypassPullRequestAllowances?: { - users?: string[]; - teams?: string[]; - apps?: string[]; - }; - requiredApprovingReviewCount?: number; - restrictions?: { - users: string[]; - teams: string[]; - apps?: string[]; - }; - requiredStatusCheckContexts?: string[]; - requireBranchesToBeUpToDate?: boolean; - requiredConversationResolution?: boolean; - repoVisibility?: 'private' | 'internal' | 'public'; - collaborators?: Array< + description?: string | undefined; + homepage?: string | undefined; + access?: string | undefined; + requireCodeOwnerReviews?: boolean | undefined; + bypassPullRequestAllowances?: | { - user: string; - access: string; + apps?: string[] | undefined; + teams?: string[] | undefined; + users?: string[] | undefined; } + | undefined; + requiredApprovingReviewCount?: number | undefined; + restrictions?: | { - team: string; - access: string; + teams: string[]; + users: string[]; + apps?: string[] | undefined; } + | undefined; + requiredStatusCheckContexts?: string[] | undefined; + requireBranchesToBeUpToDate?: boolean | undefined; + requiredConversationResolution?: boolean | undefined; + repoVisibility?: 'internal' | 'private' | 'public' | undefined; + deleteBranchOnMerge?: boolean | undefined; + allowMergeCommit?: boolean | undefined; + allowSquashMerge?: boolean | undefined; + squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE' | undefined; + squashMergeCommitMessage?: + | 'PR_BODY' + | 'COMMIT_MESSAGES' + | 'BLANK' + | undefined; + allowRebaseMerge?: boolean | undefined; + allowAutoMerge?: boolean | undefined; + allowUpdateBranch?: boolean | undefined; + collaborators?: + | ( + | { + user: string; + access: string; + } + | { + team: string; + access: string; + } + )[] + | undefined; + hasProjects?: boolean | undefined; + hasWiki?: boolean | undefined; + hasIssues?: boolean | undefined; + token?: string | undefined; + topics?: string[] | undefined; + repoVariables?: Record | undefined; + secrets?: Record | undefined; + oidcCustomization?: | { - username: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; + useDefault: boolean; + includeClaimKeys?: string[] | undefined; } - >; - hasProjects?: boolean; - hasWiki?: boolean; - hasIssues?: boolean; - token?: string; - topics?: string[]; - repoVariables?: { - [key: string]: string; - }; - secrets?: { - [key: string]: string; - }; - oidcCustomization?: { - useDefault: boolean; - includeClaimKeys?: string[]; - }; - requireCommitSigning?: boolean; - requiredLinearHistory?: boolean; - customProperties?: { - [key: string]: string; - }; - subscribe?: boolean; + | undefined; + requiredCommitSigning?: boolean | undefined; + requiredLinearHistory?: boolean | undefined; + customProperties?: Record | undefined; + subscribe?: boolean | undefined; }, - JsonObject, - 'v1' + { + remoteUrl: string; + repoContentsUrl: string; + }, + 'v2' >; // @public @@ -275,41 +287,44 @@ export function createGithubRepoPushAction(options: { }): TemplateAction< { repoUrl: string; - description?: string; - defaultBranch?: string; - protectDefaultBranch?: boolean; - protectEnforceAdmins?: boolean; - gitCommitMessage?: string; - gitAuthorName?: string; - gitAuthorEmail?: string; - requireCodeOwnerReviews?: boolean; - dismissStaleReviews?: boolean; + requireCodeOwnerReviews?: boolean | undefined; + dismissStaleReviews?: boolean | undefined; + requiredStatusCheckContexts?: string[] | undefined; bypassPullRequestAllowances?: | { - users?: string[]; - teams?: string[]; - apps?: string[]; + apps?: string[] | undefined; + teams?: string[] | undefined; + users?: string[] | undefined; } | undefined; - requiredApprovingReviewCount?: number; + requiredApprovingReviewCount?: number | undefined; restrictions?: | { - users: string[]; teams: string[]; - apps?: string[]; + users: string[]; + apps?: string[] | undefined; } | undefined; - requiredStatusCheckContexts?: string[]; - requireBranchesToBeUpToDate?: boolean; - requiredConversationResolution?: boolean; - sourcePath?: string; - token?: string; - requiredCommitSigning?: boolean; - requiredLinearHistory?: boolean; - requireLastPushApproval?: boolean; + requireBranchesToBeUpToDate?: boolean | undefined; + requiredConversationResolution?: boolean | undefined; + requireLastPushApproval?: boolean | undefined; + defaultBranch?: string | undefined; + protectDefaultBranch?: boolean | undefined; + protectEnforceAdmins?: boolean | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + sourcePath?: string | undefined; + token?: string | undefined; + requiredCommitSigning?: boolean | undefined; + requiredLinearHistory?: boolean | undefined; }, - JsonObject, - 'v1' + { + remoteUrl: string; + repoContentsUrl: string; + commitHash: string; + }, + 'v2' >; // @public @@ -321,15 +336,17 @@ export function createGithubWebhookAction(options: { { repoUrl: string; webhookUrl: string; - webhookSecret?: string; - events?: string[]; - active?: boolean; - contentType?: 'form' | 'json'; - insecureSsl?: boolean; - token?: string; + webhookSecret?: string | undefined; + events?: string[] | '*'[] | undefined; + active?: boolean | undefined; + contentType?: 'form' | 'json' | undefined; + insecureSsl?: boolean | undefined; + token?: string | undefined; }, - JsonObject, - 'v1' + { + [x: string]: any; + }, + 'v2' >; // @public @@ -340,84 +357,86 @@ export function createPublishGithubAction(options: { }): TemplateAction< { repoUrl: string; - description?: string; - homepage?: string; - access?: string; - defaultBranch?: string; - protectDefaultBranch?: boolean; - protectEnforceAdmins?: boolean; - deleteBranchOnMerge?: boolean; - gitCommitMessage?: string; - gitAuthorName?: string; - gitAuthorEmail?: string; - allowRebaseMerge?: boolean; - allowSquashMerge?: boolean; - squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE'; - squashMergeCommitMessage?: 'PR_BODY' | 'COMMIT_MESSAGES' | 'BLANK'; - allowMergeCommit?: boolean; - allowAutoMerge?: boolean; - allowUpdateBranch?: boolean; - sourcePath?: string; + description?: string | undefined; + homepage?: string | undefined; + access?: string | undefined; bypassPullRequestAllowances?: | { - users?: string[]; - teams?: string[]; - apps?: string[]; + apps?: string[] | undefined; + teams?: string[] | undefined; + users?: string[] | undefined; } | undefined; - requiredApprovingReviewCount?: number; + requiredApprovingReviewCount?: number | undefined; restrictions?: | { - users: string[]; teams: string[]; - apps?: string[]; + users: string[]; + apps?: string[] | undefined; } | undefined; - requireCodeOwnerReviews?: boolean; - dismissStaleReviews?: boolean; - requiredStatusCheckContexts?: string[]; - requireBranchesToBeUpToDate?: boolean; - requiredConversationResolution?: boolean; - requireLastPushApproval?: boolean; - repoVisibility?: 'private' | 'internal' | 'public'; - collaborators?: Array< - | { - user: string; - access: string; - } - | { - team: string; - access: string; - } - | { - username: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; - } - >; + requireCodeOwnerReviews?: boolean | undefined; + dismissStaleReviews?: boolean | undefined; + requiredStatusCheckContexts?: string[] | undefined; + requireBranchesToBeUpToDate?: boolean | undefined; + requiredConversationResolution?: boolean | undefined; + requireLastPushApproval?: boolean | undefined; + repoVisibility?: 'internal' | 'private' | 'public' | undefined; + defaultBranch?: string | undefined; + protectDefaultBranch?: boolean | undefined; + protectEnforceAdmins?: boolean | undefined; + deleteBranchOnMerge?: boolean | undefined; + gitCommitMessage?: string | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + allowMergeCommit?: boolean | undefined; + allowSquashMerge?: boolean | undefined; + squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE' | undefined; + squashMergeCommitMessage?: + | 'PR_BODY' + | 'COMMIT_MESSAGES' + | 'BLANK' + | undefined; + allowRebaseMerge?: boolean | undefined; + allowAutoMerge?: boolean | undefined; + allowUpdateBranch?: boolean | undefined; + sourcePath?: string | undefined; + collaborators?: + | ( + | { + user: string; + access: string; + } + | { + team: string; + access: string; + } + )[] + | undefined; hasProjects?: boolean | undefined; hasWiki?: boolean | undefined; hasIssues?: boolean | undefined; - token?: string; - topics?: string[]; - repoVariables?: { - [key: string]: string; - }; - secrets?: { - [key: string]: string; - }; - oidcCustomization?: { - useDefault: boolean; - includeClaimKeys?: string[]; - }; - requiredCommitSigning?: boolean; - requiredLinearHistory?: boolean; - customProperties?: { - [key: string]: string; - }; - subscribe?: boolean; + token?: string | undefined; + topics?: string[] | undefined; + repoVariables?: Record | undefined; + secrets?: Record | undefined; + oidcCustomization?: + | { + useDefault: boolean; + includeClaimKeys?: string[] | undefined; + } + | undefined; + requiredCommitSigning?: boolean | undefined; + requiredLinearHistory?: boolean | undefined; + customProperties?: Record | undefined; + subscribe?: boolean | undefined; }, - JsonObject, - 'v1' + { + remoteUrl: string; + repoContentsUrl: string; + commitHash: string; + }, + 'v2' >; // @public @@ -425,28 +444,32 @@ export const createPublishGithubPullRequestAction: ( options: CreateGithubPullRequestActionOptions, ) => TemplateAction< { - title: string; - branchName: string; - targetBranchName?: string; - description: string; repoUrl: string; - draft?: boolean; - targetPath?: string; - sourcePath?: string; - token?: string; - reviewers?: string[]; - assignees?: string[]; - teamReviewers?: string[]; - commitMessage?: string; - update?: boolean; - forceFork?: boolean; - gitAuthorName?: string; - gitAuthorEmail?: string; - forceEmptyGitAuthor?: boolean; - createWhenEmpty?: boolean; + branchName: string; + title: string; + description: string; + targetBranchName?: string | undefined; + draft?: boolean | undefined; + sourcePath?: string | undefined; + targetPath?: string | undefined; + token?: string | undefined; + reviewers?: string[] | undefined; + assignees?: string[] | undefined; + teamReviewers?: string[] | undefined; + commitMessage?: string | undefined; + update?: boolean | undefined; + forceFork?: boolean | undefined; + gitAuthorName?: string | undefined; + gitAuthorEmail?: string | undefined; + forceEmptyGitAuthor?: boolean | undefined; + createWhenEmpty?: boolean | undefined; }, - JsonObject, - 'v1' + { + targetBranchName: string; + remoteUrl: string; + pullRequestNumber: number; + }, + 'v2' >; // @public diff --git a/plugins/scaffolder-backend-module-github/src/actions/github.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/github.examples.test.ts index 4f3cc9f03e..0d279f09b4 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/github.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/github.examples.test.ts @@ -98,7 +98,7 @@ describe('publish:github', () => { jest.requireActual('./helpers'); const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/github.test.ts b/plugins/scaffolder-backend-module-github/src/actions/github.test.ts index f6a67fb398..2fd377ee04 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/github.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/github.test.ts @@ -101,7 +101,7 @@ describe('publish:github', () => { jest.requireActual('./gitHelpers'); const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { @@ -605,6 +605,7 @@ describe('publish:github', () => { const customAuthorIntegrations = ScmIntegrations.fromConfig(customAuthorConfig); + const customAuthorAction = createPublishGithubAction({ integrations: customAuthorIntegrations, config: customAuthorConfig, diff --git a/plugins/scaffolder-backend-module-github/src/actions/github.ts b/plugins/scaffolder-backend-module-github/src/actions/github.ts index c47e789bdd..c3583a6e78 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/github.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/github.ts @@ -47,140 +47,61 @@ export function createPublishGithubAction(options: { }) { const { integrations, config, githubCredentialsProvider } = options; - return createTemplateAction<{ - repoUrl: string; - description?: string; - homepage?: string; - access?: string; - defaultBranch?: string; - protectDefaultBranch?: boolean; - protectEnforceAdmins?: boolean; - deleteBranchOnMerge?: boolean; - gitCommitMessage?: string; - gitAuthorName?: string; - gitAuthorEmail?: string; - allowRebaseMerge?: boolean; - allowSquashMerge?: boolean; - squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE'; - squashMergeCommitMessage?: 'PR_BODY' | 'COMMIT_MESSAGES' | 'BLANK'; - allowMergeCommit?: boolean; - allowAutoMerge?: boolean; - allowUpdateBranch?: boolean; - sourcePath?: string; - bypassPullRequestAllowances?: - | { - users?: string[]; - teams?: string[]; - apps?: string[]; - } - | undefined; - requiredApprovingReviewCount?: number; - restrictions?: - | { - users: string[]; - teams: string[]; - apps?: string[]; - } - | undefined; - requireCodeOwnerReviews?: boolean; - dismissStaleReviews?: boolean; - requiredStatusCheckContexts?: string[]; - requireBranchesToBeUpToDate?: boolean; - requiredConversationResolution?: boolean; - requireLastPushApproval?: boolean; - repoVisibility?: 'private' | 'internal' | 'public'; - collaborators?: Array< - | { - user: string; - access: string; - } - | { - team: string; - access: string; - } - | { - /** @deprecated This field is deprecated in favor of team */ - username: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; - } - >; - hasProjects?: boolean | undefined; - hasWiki?: boolean | undefined; - hasIssues?: boolean | undefined; - token?: string; - topics?: string[]; - repoVariables?: { [key: string]: string }; - secrets?: { [key: string]: string }; - oidcCustomization?: { - useDefault: boolean; - includeClaimKeys?: string[]; - }; - requiredCommitSigning?: boolean; - requiredLinearHistory?: boolean; - customProperties?: { [key: string]: string }; - subscribe?: boolean; - }>({ + return createTemplateAction({ id: 'publish:github', description: 'Initializes a git repository of contents in workspace and publishes it to GitHub.', examples, schema: { input: { - type: 'object', - required: ['repoUrl'], - properties: { - repoUrl: inputProps.repoUrl, - description: inputProps.description, - homepage: inputProps.homepage, - access: inputProps.access, - bypassPullRequestAllowances: inputProps.bypassPullRequestAllowances, - requiredApprovingReviewCount: inputProps.requiredApprovingReviewCount, - restrictions: inputProps.restrictions, - requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, - dismissStaleReviews: inputProps.dismissStaleReviews, - requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, - requireBranchesToBeUpToDate: inputProps.requireBranchesToBeUpToDate, - requiredConversationResolution: - inputProps.requiredConversationResolution, - requireLastPushApproval: inputProps.requireLastPushApproval, - repoVisibility: inputProps.repoVisibility, - defaultBranch: inputProps.defaultBranch, - protectDefaultBranch: inputProps.protectDefaultBranch, - protectEnforceAdmins: inputProps.protectEnforceAdmins, - deleteBranchOnMerge: inputProps.deleteBranchOnMerge, - gitCommitMessage: inputProps.gitCommitMessage, - gitAuthorName: inputProps.gitAuthorName, - gitAuthorEmail: inputProps.gitAuthorEmail, - allowMergeCommit: inputProps.allowMergeCommit, - allowSquashMerge: inputProps.allowSquashMerge, - squashMergeCommitTitle: inputProps.squashMergeCommitTitle, - squashMergeCommitMessage: inputProps.squashMergeCommitMessage, - allowRebaseMerge: inputProps.allowRebaseMerge, - allowAutoMerge: inputProps.allowAutoMerge, - allowUpdateBranch: inputProps.allowUpdateBranch, - sourcePath: inputProps.sourcePath, - collaborators: inputProps.collaborators, - hasProjects: inputProps.hasProjects, - hasWiki: inputProps.hasWiki, - hasIssues: inputProps.hasIssues, - token: inputProps.token, - topics: inputProps.topics, - repoVariables: inputProps.repoVariables, - secrets: inputProps.secrets, - oidcCustomization: inputProps.oidcCustomization, - requiredCommitSigning: inputProps.requiredCommitSigning, - requiredLinearHistory: inputProps.requiredLinearHistory, - customProperties: inputProps.customProperties, - subscribe: inputProps.subscribe, - }, + repoUrl: inputProps.repoUrl, + description: inputProps.description, + homepage: inputProps.homepage, + access: inputProps.access, + bypassPullRequestAllowances: inputProps.bypassPullRequestAllowances, + requiredApprovingReviewCount: inputProps.requiredApprovingReviewCount, + restrictions: inputProps.restrictions, + requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, + dismissStaleReviews: inputProps.dismissStaleReviews, + requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, + requireBranchesToBeUpToDate: inputProps.requireBranchesToBeUpToDate, + requiredConversationResolution: + inputProps.requiredConversationResolution, + requireLastPushApproval: inputProps.requireLastPushApproval, + repoVisibility: inputProps.repoVisibility, + defaultBranch: inputProps.defaultBranch, + protectDefaultBranch: inputProps.protectDefaultBranch, + protectEnforceAdmins: inputProps.protectEnforceAdmins, + deleteBranchOnMerge: inputProps.deleteBranchOnMerge, + gitCommitMessage: inputProps.gitCommitMessage, + gitAuthorName: inputProps.gitAuthorName, + gitAuthorEmail: inputProps.gitAuthorEmail, + allowMergeCommit: inputProps.allowMergeCommit, + allowSquashMerge: inputProps.allowSquashMerge, + squashMergeCommitTitle: inputProps.squashMergeCommitTitle, + squashMergeCommitMessage: inputProps.squashMergeCommitMessage, + allowRebaseMerge: inputProps.allowRebaseMerge, + allowAutoMerge: inputProps.allowAutoMerge, + allowUpdateBranch: inputProps.allowUpdateBranch, + sourcePath: inputProps.sourcePath, + collaborators: inputProps.collaborators, + hasProjects: inputProps.hasProjects, + hasWiki: inputProps.hasWiki, + hasIssues: inputProps.hasIssues, + token: inputProps.token, + topics: inputProps.topics, + repoVariables: inputProps.repoVariables, + secrets: inputProps.secrets, + oidcCustomization: inputProps.oidcCustomization, + requiredCommitSigning: inputProps.requiredCommitSigning, + requiredLinearHistory: inputProps.requiredLinearHistory, + customProperties: inputProps.customProperties, + subscribe: inputProps.subscribe, }, output: { - type: 'object', - properties: { - remoteUrl: outputProps.remoteUrl, - repoContentsUrl: outputProps.repoContentsUrl, - commitHash: outputProps.commitHash, - }, + remoteUrl: outputProps.remoteUrl, + repoContentsUrl: outputProps.repoContentsUrl, + commitHash: outputProps.commitHash, }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.examples.test.ts index 1e59037c04..5583b745d5 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.examples.test.ts @@ -53,7 +53,7 @@ describe('github:actions:dispatch', () => { const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.test.ts index 7739259c5d..94a51e5b4e 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.test.ts @@ -50,7 +50,7 @@ describe('github:actions:dispatch', () => { const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.ts b/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.ts index 40e48bb902..f35cbcc04c 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubActionsDispatch.ts @@ -37,52 +37,41 @@ export function createGithubActionsDispatchAction(options: { }) { const { integrations, githubCredentialsProvider } = options; - return createTemplateAction<{ - repoUrl: string; - workflowId: string; - branchOrTagName: string; - workflowInputs?: { [key: string]: string }; - token?: string; - }>({ + return createTemplateAction({ id: 'github:actions:dispatch', description: 'Dispatches a GitHub Action workflow for a given branch or tag', examples, schema: { input: { - type: 'object', - required: ['repoUrl', 'workflowId', 'branchOrTagName'], - properties: { - repoUrl: { - title: 'Repository Location', + repoUrl: z => + z.string({ description: 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the new repository name and `owner` is an organization or username', - type: 'string', - }, - workflowId: { - title: 'Workflow ID', + }), + workflowId: z => + z.string({ description: 'The GitHub Action Workflow filename', - type: 'string', - }, - branchOrTagName: { - title: 'Branch or Tag name', + }), + branchOrTagName: z => + z.string({ description: 'The git branch or tag name used to dispatch the workflow', - type: 'string', - }, - workflowInputs: { - title: 'Workflow Inputs', - description: - 'Inputs keys and values to send to GitHub Action configured on the workflow file. The maximum number of properties is 10. ', - type: 'object', - }, - token: { - title: 'Authentication Token', - type: 'string', - description: - 'The `GITHUB_TOKEN` to use for authorization to GitHub', - }, - }, + }), + workflowInputs: z => + z + .record(z.string(), { + description: + 'Inputs keys and values to send to GitHub Action configured on the workflow file. The maximum number of properties is 10.', + }) + .optional(), + token: z => + z + .string({ + description: + 'The `GITHUB_TOKEN` to use for authorization to GitHub', + }) + .optional(), }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.examples.test.ts index a686ea7f6d..05d19e5ad6 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.examples.test.ts @@ -53,7 +53,7 @@ describe('github:autolinks:create', () => { const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const input = yaml.parse(examples[0].example).steps[0].input; const mockContext = createMockActionContext({ input, diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.test.ts index c378afa17d..532da41946 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.test.ts @@ -51,7 +51,7 @@ describe('github:autolinks:create', () => { const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const workspacePath = createMockDirectory().resolve('workspace'); it('should pass context logger to Octokit client', async () => { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.ts b/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.ts index 50ed052458..a57386a856 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubAutolinks.ts @@ -37,52 +37,41 @@ export function createGithubAutolinksAction(options: { }) { const { integrations, githubCredentialsProvider } = options; - return createTemplateAction<{ - repoUrl: string; - keyPrefix: string; - urlTemplate: string; - isAlphanumeric?: boolean; - token?: string; - }>({ + return createTemplateAction({ id: 'github:autolinks:create', description: 'Create an autolink reference for a repository', examples, schema: { input: { - type: 'object', - required: ['repoUrl', 'keyPrefix', 'urlTemplate'], - properties: { - repoUrl: { - title: 'Repository Location', + repoUrl: z => + z.string({ description: 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the new repository name and `owner` is an organization or username', - type: 'string', - }, - keyPrefix: { - title: 'Key Prefix', + }), + keyPrefix: z => + z.string({ description: 'This prefix appended by certain characters will generate a link any time it is found in an issue, pull request, or commit.', - type: 'string', - }, - urlTemplate: { - title: 'URL Template', + }), + urlTemplate: z => + z.string({ description: 'The URL must contain `` for the reference number. `` matches different characters depending on the value of isAlphanumeric.', - type: 'string', - }, - isAlphanumeric: { - title: 'Alphanumeric', - description: - 'Whether this autolink reference matches alphanumeric characters. If `true`, the `` parameter of the `url_template` matches alphanumeric characters `A-Z` (case insensitive), `0-9`, and `-`. If `false`, this autolink reference only matches numeric characters. Default: `true`', - type: 'boolean', - default: true, - }, - token: { - title: 'Authentication Token', - type: 'string', - description: 'The token to use for authorization to GitHub', - }, - }, + }), + isAlphanumeric: z => + z + .boolean({ + description: + 'Whether this autolink reference matches alphanumeric characters. If `true`, the `` parameter of the `url_template` matches alphanumeric characters `A-Z` (case insensitive), `0-9`, and `-`. If `false`, this autolink reference only matches numeric characters. Default: `true`', + }) + .default(true) + .optional(), + token: z => + z + .string({ + description: 'The token to use for authorization to GitHub', + }) + .optional(), }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.test.ts index 14ebc9a1cd..31a15f6019 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.examples.test.ts @@ -50,7 +50,7 @@ describe('github:branch-protection:create', () => { }); const integrations = ScmIntegrations.fromConfig(config); - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.test.ts index 190743c556..d20a02d460 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.test.ts @@ -47,7 +47,7 @@ describe('github:branch-protection:create', () => { }); const integrations = ScmIntegrations.fromConfig(config); - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts index 79eebb4096..f82bfc6950 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubBranchProtection.ts @@ -36,64 +36,28 @@ export function createGithubBranchProtectionAction(options: { }) { const { integrations } = options; - return createTemplateAction<{ - repoUrl: string; - branch?: string; - enforceAdmins?: boolean; - requiredApprovingReviewCount?: number; - requireCodeOwnerReviews?: boolean; - dismissStaleReviews?: boolean; - bypassPullRequestAllowances?: - | { - users?: string[]; - teams?: string[]; - apps?: string[]; - } - | undefined; - restrictions?: - | { - users: string[]; - teams: string[]; - apps?: string[]; - } - | undefined; - requiredStatusCheckContexts?: string[]; - requireBranchesToBeUpToDate?: boolean; - requiredConversationResolution?: boolean; - requireLastPushApproval?: boolean; - requiredCommitSigning?: boolean; - requiredLinearHistory?: boolean; - token?: string; - }>({ + return createTemplateAction({ id: 'github:branch-protection:create', description: 'Configures Branch Protection', examples, schema: { input: { - type: 'object', - required: ['repoUrl'], - properties: { - repoUrl: inputProps.repoUrl, - branch: { - title: 'Branch name', - description: `The branch to protect. Defaults to the repository's default branch`, - type: 'string', - }, - enforceAdmins: inputProps.protectEnforceAdmins, - requiredApprovingReviewCount: inputProps.requiredApprovingReviewCount, - requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, - dismissStaleReviews: inputProps.dismissStaleReviews, - bypassPullRequestAllowances: inputProps.bypassPullRequestAllowances, - restrictions: inputProps.restrictions, - requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, - requireBranchesToBeUpToDate: inputProps.requireBranchesToBeUpToDate, - requiredConversationResolution: - inputProps.requiredConversationResolution, - requireLastPushApproval: inputProps.requireLastPushApproval, - requiredCommitSigning: inputProps.requiredCommitSigning, - requiredLinearHistory: inputProps.requiredLinearHistory, - token: inputProps.token, - }, + repoUrl: inputProps.repoUrl, + branch: inputProps.branch, + enforceAdmins: inputProps.protectEnforceAdmins, + requiredApprovingReviewCount: inputProps.requiredApprovingReviewCount, + requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, + dismissStaleReviews: inputProps.dismissStaleReviews, + bypassPullRequestAllowances: inputProps.bypassPullRequestAllowances, + restrictions: inputProps.restrictions, + requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, + requireBranchesToBeUpToDate: inputProps.requireBranchesToBeUpToDate, + requiredConversationResolution: + inputProps.requiredConversationResolution, + requireLastPushApproval: inputProps.requireLastPushApproval, + requiredCommitSigning: inputProps.requiredCommitSigning, + requiredLinearHistory: inputProps.requiredLinearHistory, + token: inputProps.token, }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.examples.test.ts index 62e79dcd68..21d33a24a7 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.examples.test.ts @@ -52,7 +52,7 @@ describe('Usage examples', () => { }, }); const integrations = ScmIntegrations.fromConfig(config); - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext(); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.test.ts index 794ec2cf65..cf506de4b3 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.test.ts @@ -51,7 +51,7 @@ describe('github:deployKey:create', () => { }); const integrations = ScmIntegrations.fromConfig(config); - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.ts b/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.ts index 1cb72dac3e..b33e5d1112 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubDeployKey.ts @@ -36,65 +36,50 @@ export function createGithubDeployKeyAction(options: { const { integrations } = options; // For more information on how to define custom actions, see // https://backstage.io/docs/features/software-templates/writing-custom-actions - return createTemplateAction<{ - repoUrl: string; - publicKey: string; - privateKey: string; - deployKeyName: string; - privateKeySecretName?: string; - token?: string; - }>({ + return createTemplateAction({ id: 'github:deployKey:create', description: 'Creates and stores Deploy Keys', examples, schema: { input: { - type: 'object', - required: ['repoUrl', 'publicKey', 'privateKey', 'deployKeyName'], - properties: { - repoUrl: { - title: 'Repository Location', + repoUrl: z => + z.string({ description: 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the new repository name and `owner` is an organization or username', - type: 'string', - }, - publicKey: { - title: 'SSH Public Key', + }), + publicKey: z => + z.string({ description: 'Generated from `ssh-keygen`. Begins with `ssh-rsa`, `ecdsa-sha2-nistp256`, `ecdsa-sha2-nistp384`, `ecdsa-sha2-nistp521`, `ssh-ed25519`, `sk-ecdsa-sha2-nistp256@openssh.com`, or `sk-ssh-ed25519@openssh.com`.', - type: 'string', - }, - privateKey: { - title: 'SSH Private Key', + }), + privateKey: z => + z.string({ description: 'SSH Private Key generated from `ssh-keygen`', - type: 'string', - }, - deployKeyName: { - title: 'Deploy Key Name', + }), + deployKeyName: z => + z.string({ description: `Name of the Deploy Key`, - type: 'string', - }, - privateKeySecretName: { - title: 'Private Key GitHub Secret Name', - description: - 'Name of the GitHub Secret to store the private key related to the Deploy Key. Defaults to: `KEY_NAME_PRIVATE_KEY` where `KEY_NAME` is the name of the Deploy Key', - type: 'string', - }, - token: { - title: 'Authentication Token', - type: 'string', - description: 'The token to use for authorization to GitHub', - }, - }, + }), + privateKeySecretName: z => + z + .string({ + description: + 'Name of the GitHub Secret to store the private key related to the Deploy Key. Defaults to: `KEY_NAME_PRIVATE_KEY` where `KEY_NAME` is the name of the Deploy Key', + }) + .optional(), + token: z => + z + .string({ + description: 'The token to use for authorization to GitHub', + }) + .optional(), }, output: { - type: 'object', - properties: { - privateKeySecretName: { - title: 'The GitHub Action Repo Secret Name for the Private Key', - type: 'string', - }, - }, + privateKeySecretName: z => + z.string({ + description: + 'The GitHub Action Repo Secret Name for the Private Key', + }), }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.examples.test.ts index 9aefd39bb5..4bb41a7273 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.examples.test.ts @@ -69,7 +69,7 @@ describe('github:environment:create examples', () => { }); const integrations = ScmIntegrations.fromConfig(config); - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext(); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts index 6a75bde69f..997d21ec4b 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.test.ts @@ -80,7 +80,7 @@ describe('github:environment:create', () => { targetPluginId: 'catalog', }); - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts index 522b6ed8b5..11a30fa4e2 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubEnvironment.ts @@ -41,118 +41,95 @@ export function createGithubEnvironmentAction(options: { const { integrations, catalogClient, auth } = options; // For more information on how to define custom actions, see // https://backstage.io/docs/features/software-templates/writing-custom-actions - return createTemplateAction<{ - repoUrl: string; - name: string; - deploymentBranchPolicy?: { - protected_branches: boolean; - custom_branch_policies: boolean; - }; - customBranchPolicyNames?: string[]; - customTagPolicyNames?: string[]; - environmentVariables?: { [key: string]: string }; - secrets?: { [key: string]: string }; - token?: string; - waitTimer?: number; - preventSelfReview?: boolean; - reviewers?: string[]; - }>({ + return createTemplateAction({ id: 'github:environment:create', description: 'Creates Deployment Environments', examples, schema: { input: { - type: 'object', - required: ['repoUrl', 'name'], - properties: { - repoUrl: { - title: 'Repository Location', + repoUrl: z => + z.string({ description: 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the new repository name and `owner` is an organization or username', - type: 'string', - }, - name: { - title: 'Environment Name', + }), + name: z => + z.string({ description: `Name of the deployment environment to create`, - type: 'string', - }, - deploymentBranchPolicy: { - title: 'Deployment Branch Policy', - description: - 'The type of deployment branch policy for this environment. To allow all branches to deploy, set to `null`.', - type: 'object', - required: ['protected_branches', 'custom_branch_policies'], - properties: { - protected_branches: { - title: 'Protected Branches', - description: - 'Whether only branches with branch protection rules can deploy to this environment. If `protected_branches` is `true`, `custom_branch_policies` must be `false`; if `protected_branches` is `false`, `custom_branch_policies` must be `true`.', - type: 'boolean', + }), + deploymentBranchPolicy: z => + z + .object( + { + protected_branches: z.boolean({ + description: + 'Whether only branches with branch protection rules can deploy to this environment. If `protected_branches` is `true`, `custom_branch_policies` must be `false`; if `protected_branches` is `false`, `custom_branch_policies` must be `true`.', + }), + custom_branch_policies: z.boolean({ + description: + 'Whether only branches that match the specified name patterns can deploy to this environment. If `custom_branch_policies` is `true`, `protected_branches` must be `false`; if `custom_branch_policies` is `false`, `protected_branches` must be `true`.', + }), }, - custom_branch_policies: { - title: 'Custom Branch Policies', + { description: - 'Whether only branches that match the specified name patterns can deploy to this environment. If `custom_branch_policies` is `true`, `protected_branches` must be `false`; if `custom_branch_policies` is `false`, `protected_branches` must be `true`.', - type: 'boolean', + 'The type of deployment branch policy for this environment. To allow all branches to deploy, set to `null`.', }, - }, - }, - customBranchPolicyNames: { - title: 'Custom Branch Policy Name', - description: `The name pattern that branches must match in order to deploy to the environment. + ) + .optional(), + customBranchPolicyNames: z => + z + .array(z.string(), { + description: `The name pattern that branches must match in order to deploy to the environment. Wildcard characters will not match \`/\`. For example, to match branches that begin with \`release/\` and contain an additional single slash, use \`release/*/*\`. For more information about pattern matching syntax, see the Ruby File.fnmatch documentation.`, - type: 'array', - items: { - type: 'string', - }, - }, - customTagPolicyNames: { - title: 'Custom Tag Policy Name', - description: `The name pattern that tags must match in order to deploy to the environment. + }) + .optional(), + customTagPolicyNames: z => + z + .array(z.string(), { + description: `The name pattern that tags must match in order to deploy to the environment. Wildcard characters will not match \`/\`. For example, to match tags that begin with \`release/\` and contain an additional single slash, use \`release/*/*\`. For more information about pattern matching syntax, see the Ruby File.fnmatch documentation.`, - type: 'array', - items: { - type: 'string', - }, - }, - environmentVariables: { - title: 'Environment Variables', - description: `Environment variables attached to the deployment environment`, - type: 'object', - }, - secrets: { - title: 'Deployment Secrets', - description: `Secrets attached to the deployment environment`, - type: 'object', - }, - token: { - title: 'Authentication Token', - type: 'string', - description: 'The token to use for authorization to GitHub', - }, - waitTimer: { - title: 'Wait Timer', - type: 'integer', - description: - 'The time to wait before creating or updating the environment (in milliseconds)', - }, - preventSelfReview: { - title: 'Prevent Self Review', - type: 'boolean', - description: 'Whether to prevent self-review for this environment', - }, - reviewers: { - title: 'Reviewers', - type: 'array', - description: - 'Reviewers for this environment. Must be a list of Backstage entity references.', - items: { - type: 'string', - }, - }, - }, + }) + .optional(), + environmentVariables: z => + z + .record(z.string(), { + description: `Environment variables attached to the deployment environment`, + }) + .optional(), + secrets: z => + z + .record(z.string(), { + description: `Secrets attached to the deployment environment`, + }) + .optional(), + token: z => + z + .string({ + description: 'The token to use for authorization to GitHub', + }) + .optional(), + waitTimer: z => + z + .number({ + description: + 'The time to wait before creating or updating the environment (in milliseconds)', + }) + .optional(), + preventSelfReview: z => + z + .boolean({ + description: + 'Whether to prevent self-review for this environment', + }) + .optional(), + reviewers: z => + z + .array(z.string(), { + description: + 'Reviewers for this environment. Must be a list of Backstage entity references.', + }) + .optional(), }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.examples.test.ts index 4aee57130c..c8a778a069 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.examples.test.ts @@ -61,7 +61,7 @@ describe('github:issues:label examples', () => { const getOctokitOptionsMock = getOctokitOptions as jest.Mock; const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext(); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.test.ts index b1e1c6e87c..d7da860227 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.test.ts @@ -58,7 +58,7 @@ describe('github:issues:label', () => { const getOctokitOptionsMock = getOctokitOptions as jest.Mock; const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.ts b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.ts index f91bd01a73..bbda5a1839 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubIssuesLabel.ts @@ -37,46 +37,32 @@ export function createGithubIssuesLabelAction(options: { }) { const { integrations, githubCredentialsProvider } = options; - return createTemplateAction<{ - repoUrl: string; - number: number; - labels: string[]; - token?: string; - }>({ + return createTemplateAction({ id: 'github:issues:label', description: 'Adds labels to a pull request or issue on GitHub.', examples, schema: { input: { - type: 'object', - required: ['repoUrl', 'number', 'labels'], - properties: { - repoUrl: { - title: 'Repository Location', + repoUrl: z => + z.string({ description: 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the repository name and `owner` is an organization or username', - type: 'string', - }, - number: { - title: 'Pull Request or issue number', + }), + number: z => + z.number({ description: 'The pull request or issue number to add labels to', - type: 'number', - }, - labels: { - title: 'Labels', + }), + labels: z => + z.array(z.string(), { description: 'The labels to add to the pull request or issue', - type: 'array', - items: { - type: 'string', - }, - }, - token: { - title: 'Authentication Token', - type: 'string', - description: - 'The `GITHUB_TOKEN` to use for authorization to GitHub', - }, - }, + }), + token: z => + z + .string({ + description: + 'The `GITHUB_TOKEN` to use for authorization to GitHub', + }) + .optional(), }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.examples.test.ts index f0aa0ea5a2..38f7bd8de0 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.examples.test.ts @@ -50,7 +50,7 @@ describe('github:pages', () => { const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.test.ts index 23e3077861..e81dfa14fd 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.test.ts @@ -48,7 +48,7 @@ describe('github:pages', () => { const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts index 01830a252d..21cde027ec 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPagesEnable.ts @@ -38,55 +38,46 @@ export function createGithubPagesEnableAction(options: { }) { const { integrations, githubCredentialsProvider } = options; - return createTemplateAction<{ - repoUrl: string; - buildType?: 'legacy' | 'workflow'; - sourceBranch?: string; - sourcePath?: '/' | '/docs'; - token?: string; - }>({ + return createTemplateAction({ id: 'github:pages:enable', examples, description: 'Enables GitHub Pages for a repository.', schema: { input: { - type: 'object', - required: ['repoUrl'], - properties: { - repoUrl: { - title: 'Repository Location', + repoUrl: z => + z.string({ description: 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the new repository name and `owner` is an organization or username', - type: 'string', - }, - buildType: { - title: 'Build Type', - type: 'string', - default: 'workflow', - description: - 'The GitHub Pages build type - `legacy` or `workflow`. Default is `workflow`', - enum: ['legacy', 'workflow'], - }, - sourceBranch: { - title: 'Source Branch', - type: 'string', - default: 'main', - description: 'The GitHub Pages source branch. Default is "main"', - }, - sourcePath: { - title: 'Source Path', - type: 'string', - default: '/', - description: - 'The GitHub Pages source path - "/" or "/docs". Default is "/"', - enum: ['/', '/docs'], - }, - token: { - title: 'Authorization Token', - type: 'string', - description: 'The token to use for authorization to GitHub', - }, - }, + }), + buildType: z => + z + .enum(['legacy', 'workflow'], { + description: + 'The GitHub Pages build type - `legacy` or `workflow`. Default is `workflow`', + }) + .default('workflow') + .optional(), + sourceBranch: z => + z + .string({ + description: 'The GitHub Pages source branch. Default is "main"', + }) + .default('main') + .optional(), + sourcePath: z => + z + .enum(['/', '/docs'], { + description: + 'The GitHub Pages source path - "/" or "/docs". Default is "/"', + }) + .default('/') + .optional(), + token: z => + z + .string({ + description: 'The token to use for authorization to GitHub', + }) + .optional(), }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.test.ts index bbbbed6511..27547aa80d 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.examples.test.ts @@ -57,7 +57,7 @@ describe('publish:github:pull-request examples', () => { }); const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext(); let fakeClient: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts index 44e4cb17b3..8f85f08ea4 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.test.ts @@ -30,12 +30,12 @@ import { createMockActionContext } from '@backstage/plugin-scaffolder-node-test- type GithubPullRequestActionInput = ReturnType< typeof createPublishGithubPullRequestAction -> extends TemplateAction +> extends TemplateAction ? U : never; describe('createPublishGithubPullRequestAction', () => { - let instance: TemplateAction; + let instance: TemplateAction; let fakeClient: { createPullRequest: jest.Mock; rest: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts index adf80c0e0a..54b90e3544 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubPullRequest.ts @@ -128,169 +128,141 @@ export const createPublishGithubPullRequestAction = ( config, } = options; - return createTemplateAction<{ - title: string; - branchName: string; - targetBranchName?: string; - description: string; - repoUrl: string; - draft?: boolean; - targetPath?: string; - sourcePath?: string; - token?: string; - reviewers?: string[]; - assignees?: string[]; - teamReviewers?: string[]; - commitMessage?: string; - update?: boolean; - forceFork?: boolean; - gitAuthorName?: string; - gitAuthorEmail?: string; - forceEmptyGitAuthor?: boolean; - createWhenEmpty?: boolean; - }>({ + return createTemplateAction({ id: 'publish:github:pull-request', examples, supportsDryRun: true, schema: { input: { - required: ['repoUrl', 'title', 'description', 'branchName'], - type: 'object', - properties: { - repoUrl: { - title: 'Repository Location', + repoUrl: z => + z.string({ description: 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the repository name and `owner` is an organization or username', - type: 'string', - }, - branchName: { - type: 'string', - title: 'Branch Name', + }), + branchName: z => + z.string({ description: 'The name for the branch', - }, - targetBranchName: { - type: 'string', - title: 'Target Branch Name', - description: 'The target branch name of the pull request', - }, - title: { - type: 'string', - title: 'Pull Request Name', + }), + targetBranchName: z => + z + .string({ + description: 'The target branch name of the pull request', + }) + .optional(), + title: z => + z.string({ description: 'The name for the pull request', - }, - description: { - type: 'string', - title: 'Pull Request Description', + }), + description: z => + z.string({ description: 'The description of the pull request', - }, - draft: { - type: 'boolean', - title: 'Create as Draft', - description: 'Create a draft pull request', - }, - sourcePath: { - type: 'string', - title: 'Working Subdirectory', - description: - 'Subdirectory of working directory to copy changes from', - }, - targetPath: { - type: 'string', - title: 'Repository Subdirectory', - description: 'Subdirectory of repository to apply changes to', - }, - token: { - title: 'Authentication Token', - type: 'string', - description: 'The token to use for authorization to GitHub', - }, - reviewers: { - title: 'Pull Request Reviewers', - type: 'array', - items: { - type: 'string', - }, - description: - 'The users that will be added as reviewers to the pull request', - }, - assignees: { - title: 'Pull Request Assignees', - type: 'array', - items: { - type: 'string', - }, - description: - 'The users that will be added as assignees to the pull request', - }, - teamReviewers: { - title: 'Pull Request Team Reviewers', - type: 'array', - items: { - type: 'string', - }, - description: - 'The teams that will be added as reviewers to the pull request', - }, - commitMessage: { - type: 'string', - title: 'Commit Message', - description: 'The commit message for the pull request commit', - }, - update: { - type: 'boolean', - title: 'Update', - description: 'Update pull request if already exists', - }, - forceFork: { - type: 'boolean', - title: 'Force Fork', - description: 'Create pull request from a fork', - }, - gitAuthorName: { - type: 'string', - title: 'Default Author Name', - description: - 'Sets the default author name for the commit. The default value is the authenticated user or `Scaffolder`', - }, - gitAuthorEmail: { - type: 'string', - title: 'Default Author Email', - description: - 'Sets the default author email for the commit. The default value is the authenticated user or `scaffolder@backstage.io`', - }, - forceEmptyGitAuthor: { - type: 'boolean', - title: 'Force Empty Git Author', - description: - 'Forces the author to be empty. This is useful when using a Github App, it permit the commit to be verified on Github', - }, - createWhenEmpty: { - type: 'boolean', - title: 'Create When Empty', - description: - 'Set whether to create pull request when there are no changes to commit. The default value is true. If set to false, remoteUrl is no longer a required output.', - }, - }, + }), + draft: z => + z + .boolean({ + description: 'Create a draft pull request', + }) + .optional(), + sourcePath: z => + z + .string({ + description: + 'Subdirectory of working directory to copy changes from', + }) + .optional(), + targetPath: z => + z + .string({ + description: 'Subdirectory of repository to apply changes to', + }) + .optional(), + token: z => + z + .string({ + description: 'The token to use for authorization to GitHub', + }) + .optional(), + reviewers: z => + z + .array(z.string(), { + description: + 'The users that will be added as reviewers to the pull request', + }) + .optional(), + assignees: z => + z + .array(z.string(), { + description: + 'The users that will be added as assignees to the pull request', + }) + .optional(), + teamReviewers: z => + z + .array(z.string(), { + description: + 'The teams that will be added as reviewers to the pull request', + }) + .optional(), + commitMessage: z => + z + .string({ + description: 'The commit message for the pull request commit', + }) + .optional(), + update: z => + z + .boolean({ + description: 'Update pull request if already exists', + }) + .optional(), + forceFork: z => + z + .boolean({ + description: 'Create pull request from a fork', + }) + .optional(), + gitAuthorName: z => + z + .string({ + description: + 'Sets the default author name for the commit. The default value is the authenticated user or `Scaffolder`', + }) + .optional(), + gitAuthorEmail: z => + z + .string({ + description: + 'Sets the default author email for the commit. The default value is the authenticated user or `scaffolder@backstage.io`', + }) + .optional(), + forceEmptyGitAuthor: z => + z + .boolean({ + description: + 'Forces the author to be empty. This is useful when using a Github App, it permit the commit to be verified on Github', + }) + .optional(), + createWhenEmpty: z => + z + .boolean({ + description: + 'Set whether to create pull request when there are no changes to commit. The default value is true. If set to false, remoteUrl is no longer a required output.', + }) + .optional(), }, output: { - required: [], - type: 'object', - properties: { - targetBranchName: { - title: 'Target branch name of the merge request', - type: 'string', - }, - remoteUrl: { - type: 'string', - title: 'Pull Request URL', + targetBranchName: z => + z.string({ + description: 'Target branch name of the merge request', + }), + remoteUrl: z => + z.string({ description: 'Link to the pull request in Github', - }, - pullRequestNumber: { - type: 'number', - title: 'Pull Request Number', + }), + pullRequestNumber: z => + z.number({ description: 'The pull request number', - }, - }, + }), }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.examples.test.ts index 8694011133..da4837adb7 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.examples.test.ts @@ -80,7 +80,7 @@ describe('github:repo:create examples', () => { const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts index 6f901d1d84..cc8f65a5ba 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.test.ts @@ -80,7 +80,7 @@ describe('github:repo:create', () => { const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts index 442af4057c..a85010797d 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoCreate.ts @@ -41,118 +41,50 @@ export function createGithubRepoCreateAction(options: { }) { const { integrations, githubCredentialsProvider } = options; - return createTemplateAction<{ - repoUrl: string; - description?: string; - homepage?: string; - access?: string; - deleteBranchOnMerge?: boolean; - gitAuthorName?: string; - gitAuthorEmail?: string; - allowRebaseMerge?: boolean; - allowSquashMerge?: boolean; - squashMergeCommitTitle?: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE'; - squashMergeCommitMessage?: 'PR_BODY' | 'COMMIT_MESSAGES' | 'BLANK'; - allowMergeCommit?: boolean; - allowAutoMerge?: boolean; - allowUpdateBranch?: boolean; - requireCodeOwnerReviews?: boolean; - bypassPullRequestAllowances?: { - users?: string[]; - teams?: string[]; - apps?: string[]; - }; - requiredApprovingReviewCount?: number; - restrictions?: { - users: string[]; - teams: string[]; - apps?: string[]; - }; - requiredStatusCheckContexts?: string[]; - requireBranchesToBeUpToDate?: boolean; - requiredConversationResolution?: boolean; - repoVisibility?: 'private' | 'internal' | 'public'; - collaborators?: Array< - | { - user: string; - access: string; - } - | { - team: string; - access: string; - } - | { - /** @deprecated This field is deprecated in favor of team */ - username: string; - access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage'; - } - >; - hasProjects?: boolean; - hasWiki?: boolean; - hasIssues?: boolean; - token?: string; - topics?: string[]; - repoVariables?: { [key: string]: string }; - secrets?: { [key: string]: string }; - oidcCustomization?: { - useDefault: boolean; - includeClaimKeys?: string[]; - }; - requireCommitSigning?: boolean; - requiredLinearHistory?: boolean; - customProperties?: { [key: string]: string }; - subscribe?: boolean; - }>({ + return createTemplateAction({ id: 'github:repo:create', description: 'Creates a GitHub repository.', examples, schema: { input: { - type: 'object', - required: ['repoUrl'], - properties: { - repoUrl: inputProps.repoUrl, - description: inputProps.description, - homepage: inputProps.homepage, - access: inputProps.access, - requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, - bypassPullRequestAllowances: inputProps.bypassPullRequestAllowances, - requiredApprovingReviewCount: inputProps.requiredApprovingReviewCount, - restrictions: inputProps.restrictions, - requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, - requireBranchesToBeUpToDate: inputProps.requireBranchesToBeUpToDate, - requiredConversationResolution: - inputProps.requiredConversationResolution, - repoVisibility: inputProps.repoVisibility, - deleteBranchOnMerge: inputProps.deleteBranchOnMerge, - allowMergeCommit: inputProps.allowMergeCommit, - allowSquashMerge: inputProps.allowSquashMerge, - squashMergeCommitTitle: inputProps.squashMergeCommitTitle, - squashMergeCommitMessage: inputProps.squashMergeCommitMessage, - allowRebaseMerge: inputProps.allowRebaseMerge, - allowAutoMerge: inputProps.allowAutoMerge, - allowUpdateBranch: inputProps.allowUpdateBranch, - collaborators: inputProps.collaborators, - hasProjects: inputProps.hasProjects, - hasWiki: inputProps.hasWiki, - hasIssues: inputProps.hasIssues, - token: inputProps.token, - topics: inputProps.topics, - repoVariables: inputProps.repoVariables, - secrets: inputProps.secrets, - oidcCustomization: inputProps.oidcCustomization, - requiredCommitSigning: inputProps.requiredCommitSigning, - requiredLinearHistory: inputProps.requiredLinearHistory, - customProperties: inputProps.customProperties, - subscribe: inputProps.subscribe, - }, + repoUrl: inputProps.repoUrl, + description: inputProps.description, + homepage: inputProps.homepage, + access: inputProps.access, + requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, + bypassPullRequestAllowances: inputProps.bypassPullRequestAllowances, + requiredApprovingReviewCount: inputProps.requiredApprovingReviewCount, + restrictions: inputProps.restrictions, + requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, + requireBranchesToBeUpToDate: inputProps.requireBranchesToBeUpToDate, + requiredConversationResolution: + inputProps.requiredConversationResolution, + repoVisibility: inputProps.repoVisibility, + deleteBranchOnMerge: inputProps.deleteBranchOnMerge, + allowMergeCommit: inputProps.allowMergeCommit, + allowSquashMerge: inputProps.allowSquashMerge, + squashMergeCommitTitle: inputProps.squashMergeCommitTitle, + squashMergeCommitMessage: inputProps.squashMergeCommitMessage, + allowRebaseMerge: inputProps.allowRebaseMerge, + allowAutoMerge: inputProps.allowAutoMerge, + allowUpdateBranch: inputProps.allowUpdateBranch, + collaborators: inputProps.collaborators, + hasProjects: inputProps.hasProjects, + hasWiki: inputProps.hasWiki, + hasIssues: inputProps.hasIssues, + token: inputProps.token, + topics: inputProps.topics, + repoVariables: inputProps.repoVariables, + secrets: inputProps.secrets, + oidcCustomization: inputProps.oidcCustomization, + requiredCommitSigning: inputProps.requiredCommitSigning, + requiredLinearHistory: inputProps.requiredLinearHistory, + customProperties: inputProps.customProperties, + subscribe: inputProps.subscribe, }, output: { - type: 'object', - properties: { - remoteUrl: outputProps.remoteUrl, - repoContentsUrl: outputProps.repoContentsUrl, - }, + remoteUrl: outputProps.remoteUrl, + repoContentsUrl: outputProps.repoContentsUrl, }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.examples.test.ts index 6570ce8f4b..a581e751b4 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.examples.test.ts @@ -79,7 +79,7 @@ describe('github:repo:push examples', () => { const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext(); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts index 7ef6e2d793..405ef32f40 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.test.ts @@ -78,7 +78,7 @@ describe('github:repo:push', () => { const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext({ input: { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts index 990f3ff7ca..77aabe6b84 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubRepoPush.ts @@ -44,80 +44,39 @@ export function createGithubRepoPushAction(options: { }) { const { integrations, config, githubCredentialsProvider } = options; - return createTemplateAction<{ - repoUrl: string; - description?: string; - defaultBranch?: string; - protectDefaultBranch?: boolean; - protectEnforceAdmins?: boolean; - gitCommitMessage?: string; - gitAuthorName?: string; - gitAuthorEmail?: string; - requireCodeOwnerReviews?: boolean; - dismissStaleReviews?: boolean; - bypassPullRequestAllowances?: - | { - users?: string[]; - teams?: string[]; - apps?: string[]; - } - | undefined; - requiredApprovingReviewCount?: number; - restrictions?: - | { - users: string[]; - teams: string[]; - apps?: string[]; - } - | undefined; - requiredStatusCheckContexts?: string[]; - requireBranchesToBeUpToDate?: boolean; - requiredConversationResolution?: boolean; - sourcePath?: string; - token?: string; - requiredCommitSigning?: boolean; - requiredLinearHistory?: boolean; - requireLastPushApproval?: boolean; - }>({ + return createTemplateAction({ id: 'github:repo:push', description: 'Initializes a git repository of contents in workspace and publishes it to GitHub.', examples, schema: { input: { - type: 'object', - required: ['repoUrl'], - properties: { - repoUrl: inputProps.repoUrl, - requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, - dismissStaleReviews: inputProps.dismissStaleReviews, - requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, - bypassPullRequestAllowances: inputProps.bypassPullRequestAllowances, - requiredApprovingReviewCount: inputProps.requiredApprovingReviewCount, - restrictions: inputProps.restrictions, - requireBranchesToBeUpToDate: inputProps.requireBranchesToBeUpToDate, - requiredConversationResolution: - inputProps.requiredConversationResolution, - requireLastPushApproval: inputProps.requireLastPushApproval, - defaultBranch: inputProps.defaultBranch, - protectDefaultBranch: inputProps.protectDefaultBranch, - protectEnforceAdmins: inputProps.protectEnforceAdmins, - gitCommitMessage: inputProps.gitCommitMessage, - gitAuthorName: inputProps.gitAuthorName, - gitAuthorEmail: inputProps.gitAuthorEmail, - sourcePath: inputProps.sourcePath, - token: inputProps.token, - requiredCommitSigning: inputProps.requiredCommitSigning, - requiredLinearHistory: inputProps.requiredLinearHistory, - }, + repoUrl: inputProps.repoUrl, + requireCodeOwnerReviews: inputProps.requireCodeOwnerReviews, + dismissStaleReviews: inputProps.dismissStaleReviews, + requiredStatusCheckContexts: inputProps.requiredStatusCheckContexts, + bypassPullRequestAllowances: inputProps.bypassPullRequestAllowances, + requiredApprovingReviewCount: inputProps.requiredApprovingReviewCount, + restrictions: inputProps.restrictions, + requireBranchesToBeUpToDate: inputProps.requireBranchesToBeUpToDate, + requiredConversationResolution: + inputProps.requiredConversationResolution, + requireLastPushApproval: inputProps.requireLastPushApproval, + defaultBranch: inputProps.defaultBranch, + protectDefaultBranch: inputProps.protectDefaultBranch, + protectEnforceAdmins: inputProps.protectEnforceAdmins, + gitCommitMessage: inputProps.gitCommitMessage, + gitAuthorName: inputProps.gitAuthorName, + gitAuthorEmail: inputProps.gitAuthorEmail, + sourcePath: inputProps.sourcePath, + token: inputProps.token, + requiredCommitSigning: inputProps.requiredCommitSigning, + requiredLinearHistory: inputProps.requiredLinearHistory, }, output: { - type: 'object', - properties: { - remoteUrl: outputProps.remoteUrl, - repoContentsUrl: outputProps.repoContentsUrl, - commitHash: outputProps.commitHash, - }, + remoteUrl: outputProps.remoteUrl, + repoContentsUrl: outputProps.repoContentsUrl, + commitHash: outputProps.commitHash, }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.examples.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.examples.test.ts index d58d737f93..b76405364b 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.examples.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.examples.test.ts @@ -53,7 +53,7 @@ describe('github:webhook examples', () => { const defaultWebhookSecret = 'aafdfdivierernfdk23f'; const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; - let action: TemplateAction; + let action: TemplateAction; const mockContext = createMockActionContext(); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.test.ts b/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.test.ts index a42d251c49..b005d5aa76 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.test.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.test.ts @@ -51,7 +51,7 @@ describe('github:repository:webhook:create', () => { const integrations = ScmIntegrations.fromConfig(config); let githubCredentialsProvider: GithubCredentialsProvider; const defaultWebhookSecret = 'aafdfdivierernfdk23f'; - let action: TemplateAction; + let action: TemplateAction; beforeEach(() => { jest.resetAllMocks(); diff --git a/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.ts b/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.ts index 7345f7dd9f..3faab03f13 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/githubWebhook.ts @@ -42,92 +42,74 @@ export function createGithubWebhookAction(options: { const eventNames = emitterEventNames.filter(event => !event.includes('.')); - return createTemplateAction<{ - repoUrl: string; - webhookUrl: string; - webhookSecret?: string; - events?: string[]; - active?: boolean; - contentType?: 'form' | 'json'; - insecureSsl?: boolean; - token?: string; - }>({ + return createTemplateAction({ id: 'github:webhook', description: 'Creates webhook for a repository on GitHub.', examples, supportsDryRun: true, schema: { input: { - type: 'object', - required: ['repoUrl', 'webhookUrl'], - properties: { - repoUrl: { - title: 'Repository Location', + repoUrl: z => + z.string({ description: 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the new repository name and `owner` is an organization or username', - type: 'string', - }, - webhookUrl: { - title: 'Webhook URL', + }), + webhookUrl: z => + z.string({ description: 'The URL to which the payloads will be delivered', - type: 'string', - }, - webhookSecret: { - title: 'Webhook Secret', - description: - 'Webhook secret value. The default can be provided internally in action creation', - type: 'string', - }, - events: { - title: 'Triggering Events', - description: - 'Determines what events the hook is triggered for. Default: `[push]`', - type: 'array', - default: ['push'], - oneOf: [ - { - items: { - type: 'string', - enum: eventNames, - }, - }, - { - items: { - type: 'string', - const: '*', - }, - }, - ], - }, - active: { - title: 'Active', - type: 'boolean', - default: true, - description: - 'Determines if notifications are sent when the webhook is triggered. Default: `true`', - }, - contentType: { - title: 'Content Type', - type: 'string', - enum: ['form', 'json'], - default: 'form', - description: - 'The media type used to serialize the payloads. The default is `form`', - }, - insecureSsl: { - title: 'Insecure SSL', - type: 'boolean', - default: false, - description: - 'Determines whether the SSL certificate of the host for url will be verified when delivering payloads. Default `false`', - }, - token: { - title: 'Authentication Token', - type: 'string', - description: - 'The `GITHUB_TOKEN` to use for authorization to GitHub', - }, - }, + }), + webhookSecret: z => + z + .string({ + description: + 'Webhook secret value. The default can be provided internally in action creation', + }) + .optional(), + events: z => + z + .union([ + z.array(z.enum(eventNames as [string, ...string[]]), { + description: + 'Determines what events the hook is triggered for. Default: `[push]`', + }), + z.array(z.literal('*'), { + description: + 'Determines what events the hook is triggered for. Use "*" for all events. Default: `[push]`', + }), + ]) + .default(['push']) + .optional(), + active: z => + z + .boolean({ + description: + 'Determines if notifications are sent when the webhook is triggered. Default: `true`', + }) + .default(true) + .optional(), + contentType: z => + z + .enum(['form', 'json'], { + description: + 'The media type used to serialize the payloads. The default is `form`', + }) + .default('form') + .optional(), + insecureSsl: z => + z + .boolean({ + description: + 'Determines whether the SSL certificate of the host for url will be verified when delivering payloads. Default `false`', + }) + .default(false) + .optional(), + token: z => + z + .string({ + description: + 'The `GITHUB_TOKEN` to use for authorization to GitHub', + }) + .optional(), }, }, async handler(ctx) { diff --git a/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts b/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts index cac93ec7c6..151a56b664 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/inputProperties.ts @@ -14,394 +14,438 @@ * limitations under the License. */ -const repoUrl = { - title: 'Repository Location', - description: - 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the new repository name and `owner` is an organization or username', - type: 'string', -}; -const description = { - title: 'Repository Description', - type: 'string', -}; -const homepage = { - title: 'Repository Homepage', - type: 'string', -}; -const access = { - title: 'Repository Access', - description: - 'Sets an admin collaborator on the repository. Can either be a user reference different from `owner` in `repoUrl` or team reference, eg. `org/team-name`', - type: 'string', -}; -const requireCodeOwnerReviews = { - title: 'Require CODEOWNER Reviews?', - description: - 'Require an approved review in PR including files with a designated Code Owner', - type: 'boolean', -}; -const dismissStaleReviews = { - title: 'Dismiss Stale Reviews', - description: - 'New reviewable commits pushed to a matching branch will dismiss pull request review approvals.', - type: 'boolean', -}; -const requiredStatusCheckContexts = { - title: 'Required Status Check Contexts', - description: - 'The list of status checks to require in order to merge into this branch', - type: 'array', - items: { - type: 'string', - }, -}; -const requireBranchesToBeUpToDate = { - title: 'Require Branches To Be Up To Date?', - description: - 'Require branches to be up to date before merging. The default value is `true`', - type: 'boolean', - default: true, -}; -const requiredConversationResolution = { - title: 'Required Conversation Resolution', - description: - 'Requires all conversations on code to be resolved before a pull request can be merged into this branch', - type: 'boolean', -}; -const requireLastPushApproval = { - title: 'Require last push approval', - type: 'boolean', - default: false, - description: - 'Whether the most recent push to a PR must be approved by someone other than the person who pushed it. The default value is `false`', -}; -const repoVisibility = { - title: 'Repository Visibility', - type: 'string', - enum: ['private', 'public', 'internal'], -}; -const deleteBranchOnMerge = { - title: 'Delete Branch On Merge', - type: 'boolean', - default: false, - description: - 'Delete the branch after merging the PR. The default value is `false`', -}; -const gitAuthorName = { - title: 'Default Author Name', - type: 'string', - default: 'Scaffolder', - description: - 'Sets the default author name for the commit. The default value is `Scaffolder`', -}; -const gitAuthorEmail = { - title: 'Default Author Email', - type: 'string', - description: `Sets the default author email for the commit.`, -}; -const allowMergeCommit = { - title: 'Allow Merge Commits', - type: 'boolean', - default: true, - description: 'Allow merge commits. The default value is `true`', -}; -const allowSquashMerge = { - title: 'Allow Squash Merges', - type: 'boolean', - default: true, - description: 'Allow squash merges. The default value is `true`', -}; -const allowUpdateBranch = { - title: 'Allow Update Branch', - type: 'boolean', - default: false, - description: 'Allow branch to be updated. The default value is `false`', -}; -const squashMergeCommitTitle = { - title: 'Default squash merge commit title', - enum: ['PR_TITLE', 'COMMIT_OR_PR_TITLE'], - type: 'string', - default: 'COMMIT_OR_PR_TITLE', - description: - 'Sets the default value for a squash merge commit title. The default value is `COMMIT_OR_PR_TITLE`', -}; -const squashMergeCommitMessage = { - title: 'Default squash merge commit message', - enum: ['PR_BODY', 'COMMIT_MESSAGES', 'BLANK'], - type: 'string', - default: 'COMMIT_MESSAGES', - description: - 'Sets the default value for a squash merge commit message. The default value is `COMMIT_MESSAGES`', -}; +const repoUrl = (z: typeof import('zod').z) => + z.string({ + description: + 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the new repository name and `owner` is an organization or username', + }); -const allowRebaseMerge = { - title: 'Allow Rebase Merges', - type: 'boolean', - default: true, - description: 'Allow rebase merges. The default value is `true`', -}; -const allowAutoMerge = { - title: 'Allow Auto Merges', - type: 'boolean', - default: false, - description: - 'Allow individual PRs to merge automatically when all merge requirements are met. The default value is `false`', -}; -const collaborators = { - title: 'Collaborators', - description: 'Provide additional users or teams with permissions', - type: 'array', - items: { - type: 'object', - additionalProperties: false, - required: ['access'], - properties: { - access: { - type: 'string', - description: 'The type of access for the user', +const description = (z: typeof import('zod').z) => + z + .string({ + description: 'Repository Description', + }) + .optional(); + +const homepage = (z: typeof import('zod').z) => + z + .string({ + description: 'Repository Homepage', + }) + .optional(); + +const access = (z: typeof import('zod').z) => + z + .string({ + description: + 'Sets an admin collaborator on the repository. Can either be a user reference different from `owner` in `repoUrl` or team reference, eg. `org/team-name`', + }) + .optional(); + +const requireCodeOwnerReviews = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'Require an approved review in PR including files with a designated Code Owner', + }) + .optional(); + +const dismissStaleReviews = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'New reviewable commits pushed to a matching branch will dismiss pull request review approvals.', + }) + .optional(); + +const requiredStatusCheckContexts = (z: typeof import('zod').z) => + z + .array(z.string(), { + description: + 'The list of status checks to require in order to merge into this branch', + }) + .optional(); + +const requireBranchesToBeUpToDate = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'Require branches to be up to date before merging. The default value is `true`', + }) + .default(true) + .optional(); + +const requiredConversationResolution = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'Requires all conversations on code to be resolved before a pull request can be merged into this branch', + }) + .optional(); + +const requireLastPushApproval = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'Whether the most recent push to a PR must be approved by someone other than the person who pushed it. The default value is `false`', + }) + .default(false) + .optional(); + +const repoVisibility = (z: typeof import('zod').z) => + z + .enum(['private', 'public', 'internal'], { + description: 'Repository Visibility', + }) + .optional(); + +const deleteBranchOnMerge = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'Delete the branch after merging the PR. The default value is `false`', + }) + .default(false) + .optional(); + +const gitAuthorName = (z: typeof import('zod').z) => + z + .string({ + description: + 'Sets the default author name for the commit. The default value is `Scaffolder`', + }) + .default('Scaffolder') + .optional(); + +const gitAuthorEmail = (z: typeof import('zod').z) => + z + .string({ + description: `Sets the default author email for the commit.`, + }) + .optional(); + +const allowMergeCommit = (z: typeof import('zod').z) => + z + .boolean({ + description: 'Allow merge commits. The default value is `true`', + }) + .default(true) + .optional(); + +const allowSquashMerge = (z: typeof import('zod').z) => + z + .boolean({ + description: 'Allow squash merges. The default value is `true`', + }) + .default(true) + .optional(); + +const allowUpdateBranch = (z: typeof import('zod').z) => + z + .boolean({ + description: 'Allow branch to be updated. The default value is `false`', + }) + .default(false) + .optional(); + +const squashMergeCommitTitle = (z: typeof import('zod').z) => + z + .enum(['PR_TITLE', 'COMMIT_OR_PR_TITLE'], { + description: + 'Sets the default value for a squash merge commit title. The default value is `COMMIT_OR_PR_TITLE`', + }) + .default('COMMIT_OR_PR_TITLE') + .optional(); + +const squashMergeCommitMessage = (z: typeof import('zod').z) => + z + .enum(['PR_BODY', 'COMMIT_MESSAGES', 'BLANK'], { + description: + 'Sets the default value for a squash merge commit message. The default value is `COMMIT_MESSAGES`', + }) + .default('COMMIT_MESSAGES') + .optional(); + +const allowRebaseMerge = (z: typeof import('zod').z) => + z + .boolean({ + description: 'Allow rebase merges. The default value is `true`', + }) + .default(true) + .optional(); + +const allowAutoMerge = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'Allow individual PRs to merge automatically when all merge requirements are met. The default value is `false`', + }) + .default(false) + .optional(); + +const collaborators = (z: typeof import('zod').z) => + z + .array( + z.union([ + z.object({ + access: z.string({ + description: 'The type of access for the user', + }), + user: z.string({ + description: + 'The name of the user that will be added as a collaborator', + }), + }), + z.object({ + access: z.string({ + description: 'The type of access for the team', + }), + team: z.string({ + description: + 'The name of the team that will be added as a collaborator', + }), + }), + ]), + { + description: 'Provide additional users or teams with permissions', }, - user: { - type: 'string', + ) + .optional(); + +const hasProjects = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'Enable projects for the repository. The default value is `true` unless the organization has disabled repository projects', + }) + .optional(); + +const hasWiki = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'Enable the wiki for the repository. The default value is `true`', + }) + .default(true) + .optional(); + +const hasIssues = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'Enable issues for the repository. The default value is `true`', + }) + .default(true) + .optional(); + +const token = (z: typeof import('zod').z) => + z + .string({ + description: 'The token to use for authorization to GitHub', + }) + .optional(); + +const topics = (z: typeof import('zod').z) => + z + .array(z.string(), { + description: 'Adds topics to the repository', + }) + .optional(); + +const defaultBranch = (z: typeof import('zod').z) => + z + .string({ + description: `Sets the default branch on the repository. The default value is 'master'`, + }) + .default('master') + .optional(); + +const protectDefaultBranch = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'Protect the default branch after creating the repository. The default value is `true`', + }) + .default(true) + .optional(); + +const protectEnforceAdmins = (z: typeof import('zod').z) => + z + .boolean({ + description: + 'Enforce admins to adhere to default branch protection. The default value is `true`', + }) + .default(true) + .optional(); + +const bypassPullRequestAllowances = (z: typeof import('zod').z) => + z + .object( + { + apps: z.array(z.string()).optional(), + users: z.array(z.string()).optional(), + teams: z.array(z.string()).optional(), + }, + { description: - 'The name of the user that will be added as a collaborator', + 'Allow specific users, teams, or apps to bypass pull request requirements.', }, - team: { - type: 'string', + ) + .optional(); + +const gitCommitMessage = (z: typeof import('zod').z) => + z + .string({ + description: + 'Sets the commit message on the repository. The default value is `initial commit`', + }) + .default('initial commit') + .optional(); + +const sourcePath = (z: typeof import('zod').z) => + z + .string({ + description: + 'Path within the workspace that will be used as the repository root. If omitted, the entire workspace will be published as the repository.', + }) + .optional(); + +const requiredApprovingReviewCount = (z: typeof import('zod').z) => + z + .number({ + description: + 'Specify the number of reviewers required to approve pull requests. Use a number between `1` and `6` or `0` to not require reviewers. Defaults to `1`.', + }) + .optional(); + +const restrictions = (z: typeof import('zod').z) => + z + .object( + { + apps: z.array(z.string()).optional(), + users: z.array(z.string()), + teams: z.array(z.string()), + }, + { description: - 'The name of the team that will be added as a collaborator', + 'Restrict who can push to the protected branch. User, app, and team restrictions are only available for organization-owned repositories.', }, - }, - oneOf: [{ required: ['user'] }, { required: ['team'] }], - }, -}; -const hasProjects = { - title: 'Enable projects', - type: 'boolean', - description: - 'Enable projects for the repository. The default value is `true` unless the organization has disabled repository projects', -}; -const hasWiki = { - title: 'Enable the wiki', - type: 'boolean', - default: true, - description: - 'Enable the wiki for the repository. The default value is `true`', -}; -const hasIssues = { - title: 'Enable issues', - type: 'boolean', - default: true, - description: 'Enable issues for the repository. The default value is `true`', -}; -const token = { - title: 'Authentication Token', - type: 'string', - description: 'The token to use for authorization to GitHub', -}; -const topics = { - title: 'Topics', - type: 'array', - items: { - type: 'string', - }, -}; -const defaultBranch = { - title: 'Default Branch', - type: 'string', - default: 'master', - description: - 'Sets the default branch on the repository. The default value is `master`', -}; -const protectDefaultBranch = { - title: 'Protect Default Branch', - type: 'boolean', - default: true, - description: - 'Protect the default branch after creating the repository. The default value is `true`', -}; -const protectEnforceAdmins = { - title: 'Enforce Admins On Protected Branches', - type: 'boolean', - default: true, - description: - 'Enforce admins to adhere to default branch protection. The default value is `true`', -}; + ) + .optional(); -const bypassPullRequestAllowances = { - title: 'Bypass pull request requirements', - description: - 'Allow specific users, teams, or apps to bypass pull request requirements.', - type: 'object', - additionalProperties: false, - properties: { - apps: { - type: 'array', - items: { - type: 'string', +const requiredCommitSigning = (z: typeof import('zod').z) => + z + .boolean({ + description: `Require commit signing so that you must sign commits on this branch.`, + }) + .optional(); + +const requiredLinearHistory = (z: typeof import('zod').z) => + z + .boolean({ + description: `Prevent merge commits from being pushed to matching branches.`, + }) + .optional(); + +const repoVariables = (z: typeof import('zod').z) => + z + .record(z.string(), { + description: 'Variables attached to the repository', + }) + .optional(); + +const secrets = (z: typeof import('zod').z) => + z + .record(z.string(), { + description: 'Secrets attached to the repository', + }) + .optional(); + +const oidcCustomization = (z: typeof import('zod').z) => + z + .object( + { + useDefault: z + .boolean({ + description: `Whether to use the default template or not. If true, includeClaimKeys must not be set.`, + }) + .default(true), + includeClaimKeys: z + .array(z.string(), { + description: `Array of unique strings. Each claim key can only contain alphanumeric characters and underscores.`, + }) + .optional(), }, - }, - users: { - type: 'array', - items: { - type: 'string', + { + description: `OIDC customization template attached to the repository.`, }, - }, - teams: { - type: 'array', - items: { - type: 'string', - }, - }, - }, -}; + ) + .optional(); -const gitCommitMessage = { - title: 'Git Commit Message', - type: 'string', - default: 'initial commit', - description: - 'Sets the commit message on the repository. The default value is `initial commit`', -}; -const sourcePath = { - title: 'Source Path', - description: - 'Path within the workspace that will be used as the repository root. If omitted, the entire workspace will be published as the repository.', - type: 'string', -}; +const customProperties = (z: typeof import('zod').z) => + z + .record(z.string(), { + description: + 'Custom properties to be added to the repository (note, this only works for organization repositories)', + }) + .optional(); -const requiredApprovingReviewCount = { - title: 'Required approving review count', - type: 'number', - description: - 'Specify the number of reviewers required to approve pull requests. Use a number between `1` and `6` or `0` to not require reviewers. Defaults to `1`.', -}; +const subscribe = (z: typeof import('zod').z) => + z + .boolean({ + description: `Subscribe to the repository. The default value is 'false'`, + }) + .optional(); -const restrictions = { - title: 'Restrict who can push to the protected branch', - description: - 'Restrict who can push to the protected branch. User, app, and team restrictions are only available for organization-owned repositories.', - type: 'object', - additionalProperties: false, - properties: { - apps: { - type: 'array', - items: { - type: 'string', - }, - }, - users: { - type: 'array', - items: { - type: 'string', - }, - }, - teams: { - type: 'array', - items: { - type: 'string', - }, - }, - }, -}; +const branch = (z: typeof import('zod').z) => + z + .string({ + description: `The branch to protect. Defaults to the repository's default branch`, + }) + .optional(); -const requiredCommitSigning = { - title: 'Require commit signing', - type: 'boolean', - description: `Require commit signing so that you must sign commits on this branch.`, +export { + repoUrl, + description, + homepage, + access, + requireCodeOwnerReviews, + dismissStaleReviews, + requiredStatusCheckContexts, + requireBranchesToBeUpToDate, + requiredConversationResolution, + requireLastPushApproval, + repoVisibility, + deleteBranchOnMerge, + gitAuthorName, + gitAuthorEmail, + allowMergeCommit, + allowSquashMerge, + allowUpdateBranch, + squashMergeCommitTitle, + squashMergeCommitMessage, + allowRebaseMerge, + allowAutoMerge, + collaborators, + hasProjects, + hasWiki, + hasIssues, + token, + topics, + defaultBranch, + gitCommitMessage, + sourcePath, + repoVariables, + secrets, + oidcCustomization, + customProperties, + subscribe, + requiredApprovingReviewCount, + restrictions, + requiredCommitSigning, + requiredLinearHistory, + protectDefaultBranch, + protectEnforceAdmins, + bypassPullRequestAllowances, + branch, }; - -const requiredLinearHistory = { - title: 'Require linear history', - type: 'boolean', - description: `Prevent merge commits from being pushed to matching branches.`, -}; - -const repoVariables = { - title: 'Repository Variables', - description: `Variables attached to the repository`, - type: 'object', -}; - -const secrets = { - title: 'Repository Secrets', - description: `Secrets attached to the repository`, - type: 'object', -}; - -const oidcCustomization = { - title: 'Repository OIDC customization template', - description: `OIDC customization template attached to the repository.`, - type: 'object', - additionalProperties: false, - properties: { - useDefault: { - title: 'Use Default', - type: 'boolean', - description: `Whether to use the default OIDC template or not.`, - }, - includeClaimKeys: { - title: 'Include claim keys', - type: 'array', - items: { - type: 'string', - }, - description: `Array of unique strings. Each claim key can only contain alphanumeric characters and underscores.`, - }, - }, -}; - -const customProperties = { - title: 'Custom Repository Properties', - description: - 'Custom properties to be added to the repository (note, this only works for organization repositories)', - type: 'object', -}; - -const subscribe = { - title: 'Subscribe to repository', - description: `Subscribe to the repository. The default value is 'false'`, - type: 'boolean', -}; - -export { access }; -export { allowMergeCommit }; -export { allowRebaseMerge }; -export { allowSquashMerge }; -export { squashMergeCommitTitle }; -export { squashMergeCommitMessage }; -export { allowAutoMerge }; -export { allowUpdateBranch }; -export { collaborators }; -export { defaultBranch }; -export { deleteBranchOnMerge }; -export { description }; -export { gitAuthorEmail }; -export { gitAuthorName }; -export { gitCommitMessage }; -export { homepage }; -export { protectDefaultBranch }; -export { protectEnforceAdmins }; -export { bypassPullRequestAllowances }; -export { requiredApprovingReviewCount }; -export { restrictions }; -export { repoUrl }; -export { repoVisibility }; -export { requireCodeOwnerReviews }; -export { dismissStaleReviews }; -export { requiredStatusCheckContexts }; -export { requireBranchesToBeUpToDate }; -export { requiredConversationResolution }; -export { requireLastPushApproval }; -export { hasProjects }; -export { hasIssues }; -export { hasWiki }; -export { sourcePath }; -export { token }; -export { topics }; -export { requiredCommitSigning }; -export { requiredLinearHistory }; -export { repoVariables }; -export { secrets }; -export { oidcCustomization }; -export { customProperties }; -export { subscribe }; diff --git a/plugins/scaffolder-backend-module-github/src/actions/outputProperties.ts b/plugins/scaffolder-backend-module-github/src/actions/outputProperties.ts index c0cdcb1cb2..3c52686ddc 100644 --- a/plugins/scaffolder-backend-module-github/src/actions/outputProperties.ts +++ b/plugins/scaffolder-backend-module-github/src/actions/outputProperties.ts @@ -14,19 +14,20 @@ * limitations under the License. */ -const remoteUrl = { - title: 'A URL to the repository with the provider', - type: 'string', -}; -const repoContentsUrl = { - title: 'A URL to the root of the repository', - type: 'string', -}; +const remoteUrl = (z: typeof import('zod').z) => + z.string({ + description: 'A URL to the repository with the provider', + }); -const commitHash = { - title: 'The git commit hash of the initial commit', - type: 'string', -}; +const repoContentsUrl = (z: typeof import('zod').z) => + z.string({ + description: 'A URL to the root of the repository', + }); + +const commitHash = (z: typeof import('zod').z) => + z.string({ + description: 'The git commit hash of the initial commit', + }); export { remoteUrl }; export { repoContentsUrl };