@backstage/plugin-scaffolder-backend-module-github 0.9.4 → 0.9.5-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# @backstage/plugin-scaffolder-backend-module-github
|
|
2
2
|
|
|
3
|
+
## 0.9.5-next.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 7455dae: Use node prefix on native imports
|
|
8
|
+
- 82ca951: cleaned up repo creation to make the unique portions explicit
|
|
9
|
+
- 69d880e: Bump to latest zod to ensure it has the latest features
|
|
10
|
+
- Updated dependencies
|
|
11
|
+
- @backstage/plugin-catalog-node@1.21.0-next.0
|
|
12
|
+
- @backstage/backend-plugin-api@1.7.0-next.0
|
|
13
|
+
- @backstage/plugin-scaffolder-node@0.12.4-next.0
|
|
14
|
+
- @backstage/integration@1.19.3-next.0
|
|
15
|
+
- @backstage/catalog-model@1.7.6
|
|
16
|
+
- @backstage/config@1.3.6
|
|
17
|
+
- @backstage/errors@1.2.7
|
|
18
|
+
- @backstage/types@1.2.2
|
|
19
|
+
|
|
3
20
|
## 0.9.4
|
|
4
21
|
|
|
5
22
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"githubPullRequest.cjs.js","sources":["../../src/actions/githubPullRequest.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path from 'path';\nimport {\n GithubCredentialsProvider,\n ScmIntegrationRegistry,\n} from '@backstage/integration';\nimport {\n createTemplateAction,\n parseRepoUrl,\n SerializedFile,\n serializeDirectoryContents,\n} from '@backstage/plugin-scaffolder-node';\nimport { Octokit } from 'octokit';\nimport { CustomErrorBase, InputError } from '@backstage/errors';\nimport {\n createPullRequest,\n DELETE_FILE,\n} from 'octokit-plugin-create-pull-request';\nimport { getOctokitOptions } from '../util';\nimport { examples } from './githubPullRequest.examples';\nimport {\n LoggerService,\n resolveSafeChildPath,\n} from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport { JsonValue } from '@backstage/types';\n\nexport type Encoding = 'utf-8' | 'base64';\n\nclass GithubResponseError extends CustomErrorBase {}\n\nexport const defaultClientFactory: CreateGithubPullRequestActionOptions['clientFactory'] =\n async ({\n integrations,\n githubCredentialsProvider,\n owner,\n repo,\n host = 'github.com',\n token: providedToken,\n }) => {\n const octokitOptions = await getOctokitOptions({\n integrations,\n credentialsProvider: githubCredentialsProvider,\n host,\n owner,\n repo,\n token: providedToken,\n });\n\n const OctokitPR = Octokit.plugin(createPullRequest);\n return new OctokitPR({\n ...octokitOptions,\n ...{ throttle: { enabled: false } },\n });\n };\n\n/**\n * The options passed to {@link createPublishGithubPullRequestAction} method\n * @public\n */\nexport interface CreateGithubPullRequestActionOptions {\n /**\n * An instance of {@link @backstage/integration#ScmIntegrationRegistry} that will be used in the action.\n */\n integrations: ScmIntegrationRegistry;\n /**\n * An instance of {@link @backstage/integration#GithubCredentialsProvider} that will be used to get credentials for the action.\n */\n githubCredentialsProvider?: GithubCredentialsProvider;\n /**\n * A method to return the Octokit client with the Pull Request Plugin.\n */\n clientFactory?: (input: {\n integrations: ScmIntegrationRegistry;\n githubCredentialsProvider?: GithubCredentialsProvider;\n host: string;\n owner: string;\n repo: string;\n token?: string;\n }) => Promise<\n Octokit & {\n createPullRequest(options: createPullRequest.Options): Promise<{\n data: {\n html_url: string;\n number: number;\n base: {\n ref: string;\n };\n };\n } | null>;\n }\n >;\n /**\n * An instance of {@link @backstage/config#Config} that will be used in the action.\n */\n config?: Config;\n}\n\ntype GithubPullRequest = {\n owner: string;\n repo: string;\n number: number;\n};\n\n/**\n * Creates a Github Pull Request action.\n * @public\n */\nexport const createPublishGithubPullRequestAction = (\n options: CreateGithubPullRequestActionOptions,\n) => {\n const {\n integrations,\n githubCredentialsProvider,\n clientFactory = defaultClientFactory,\n config,\n } = options;\n\n return createTemplateAction({\n id: 'publish:github:pull-request',\n examples,\n supportsDryRun: true,\n schema: {\n input: {\n repoUrl: z =>\n z.string({\n description:\n 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the repository name and `owner` is an organization or username',\n }),\n branchName: z =>\n z.string({\n description: 'The name for the branch',\n }),\n filesToDelete: z =>\n z\n .array(z.string(), {\n description: 'List of files that will be deleted',\n })\n .optional(),\n targetBranchName: z =>\n z\n .string({\n description: 'The target branch name of the pull request',\n })\n .optional(),\n title: z =>\n z.string({\n description: 'The name for the pull request',\n }),\n description: z =>\n z.string({\n description: 'The description of the pull request',\n }),\n draft: z =>\n z\n .boolean({\n description: 'Create a draft pull request',\n })\n .optional(),\n sourcePath: z =>\n z\n .string({\n description:\n 'Subdirectory of working directory to copy changes from',\n })\n .optional(),\n targetPath: z =>\n z\n .string({\n description: 'Subdirectory of repository to apply changes to',\n })\n .optional(),\n token: z =>\n z\n .string({\n description: 'The token to use for authorization to GitHub',\n })\n .optional(),\n reviewers: z =>\n z\n .array(z.string(), {\n description:\n 'The users that will be added as reviewers to the pull request',\n })\n .optional(),\n assignees: z =>\n z\n .array(z.string(), {\n description:\n 'The users that will be added as assignees to the pull request',\n })\n .optional(),\n teamReviewers: z =>\n z\n .array(z.string(), {\n description:\n 'The teams that will be added as reviewers to the pull request',\n })\n .optional(),\n commitMessage: z =>\n z\n .string({\n description: 'The commit message for the pull request commit',\n })\n .optional(),\n update: z =>\n z\n .boolean({\n description: 'Update pull request if already exists',\n })\n .optional(),\n forceFork: z =>\n z\n .boolean({\n description: 'Create pull request from a fork',\n })\n .optional(),\n gitAuthorName: z =>\n z\n .string({\n description:\n 'Sets the default author name for the commit. The default value is the authenticated user or `Scaffolder`',\n })\n .optional(),\n gitAuthorEmail: z =>\n z\n .string({\n description:\n 'Sets the default author email for the commit. The default value is the authenticated user or `scaffolder@backstage.io`',\n })\n .optional(),\n forceEmptyGitAuthor: z =>\n z\n .boolean({\n description:\n 'Forces the author to be empty. This is useful when using a Github App, it permit the commit to be verified on Github',\n })\n .optional(),\n createWhenEmpty: z =>\n z\n .boolean({\n description:\n '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.',\n })\n .optional(),\n },\n output: {\n targetBranchName: z =>\n z.string({\n description: 'Target branch name of the merge request',\n }),\n remoteUrl: z =>\n z.string({\n description: 'Link to the pull request in Github',\n }),\n pullRequestNumber: z =>\n z.number({\n description: 'The pull request number',\n }),\n },\n },\n async handler(ctx) {\n const {\n repoUrl,\n branchName,\n filesToDelete,\n targetBranchName,\n title,\n description,\n draft,\n targetPath,\n sourcePath,\n token: providedToken,\n reviewers,\n assignees,\n teamReviewers,\n commitMessage,\n update,\n forceFork,\n gitAuthorEmail,\n gitAuthorName,\n forceEmptyGitAuthor,\n createWhenEmpty,\n } = ctx.input;\n\n const { owner, repo, host } = parseRepoUrl(repoUrl, integrations);\n\n if (!owner) {\n throw new InputError(\n `No owner provided for host: ${host}, and repo ${repo}`,\n );\n }\n\n const client = await clientFactory({\n integrations,\n githubCredentialsProvider,\n host,\n owner,\n repo,\n token: providedToken,\n });\n\n const fileRoot = sourcePath\n ? resolveSafeChildPath(ctx.workspacePath, sourcePath)\n : ctx.workspacePath;\n\n const directoryContents = await serializeDirectoryContents(fileRoot, {\n gitignore: true,\n });\n\n const determineFileMode = (file: SerializedFile): string => {\n if (file.symlink) return '120000';\n if (file.executable) return '100755';\n return '100644';\n };\n\n const determineFileEncoding = (\n file: SerializedFile,\n ): 'utf-8' | 'base64' => (file.symlink ? 'utf-8' : 'base64');\n\n const files = Object.fromEntries([\n ...directoryContents.map(file => [\n targetPath ? path.posix.join(targetPath, file.path) : file.path,\n {\n // See the properties of tree items\n // in https://docs.github.com/en/rest/reference/git#trees\n mode: determineFileMode(file),\n // Always use base64 encoding where possible to avoid doubling a binary file in size\n // due to interpreting a binary file as utf-8 and sending github\n // the utf-8 encoded content. Symlinks are kept as utf-8 to avoid them\n // being formatted as a series of scrambled characters\n //\n // For example, the original gradle-wrapper.jar is 57.8k in https://github.com/kennethzfeng/pull-request-test/pull/5/files.\n // Its size could be doubled to 98.3K (See https://github.com/kennethzfeng/pull-request-test/pull/4/files)\n encoding: determineFileEncoding(file),\n content: file.content.toString(determineFileEncoding(file)),\n },\n ]),\n // order of arrays is important so filesToDelete will overwrite\n // changes from files above\n ...(filesToDelete || []).map(filePath => [\n targetPath ? path.posix.join(targetPath, filePath) : filePath,\n DELETE_FILE,\n ]),\n ]);\n\n // If this is a dry run, log and return\n if (ctx.isDryRun) {\n ctx.logger.info(`Performing dry run of creating pull request`);\n ctx.output('targetBranchName', branchName);\n ctx.output('remoteUrl', repoUrl);\n ctx.output('pullRequestNumber', 43);\n ctx.logger.info(`Dry run complete`);\n return;\n }\n\n try {\n const createOptions: createPullRequest.Options = {\n owner,\n repo,\n title,\n changes: [\n {\n files,\n commit:\n commitMessage ??\n config?.getOptionalString('scaffolder.defaultCommitMessage') ??\n title,\n },\n ],\n body: description,\n head: branchName,\n draft,\n update,\n forceFork,\n createWhenEmpty,\n };\n\n const gitAuthorInfo = {\n name:\n gitAuthorName ??\n config?.getOptionalString('scaffolder.defaultAuthor.name'),\n email:\n gitAuthorEmail ??\n config?.getOptionalString('scaffolder.defaultAuthor.email'),\n };\n\n if (!forceEmptyGitAuthor) {\n if (gitAuthorInfo.name || gitAuthorInfo.email) {\n if (Array.isArray(createOptions.changes)) {\n createOptions.changes = createOptions.changes.map(change => ({\n ...change,\n author: {\n name: gitAuthorInfo.name || 'Scaffolder',\n email: gitAuthorInfo.email || 'scaffolder@backstage.io',\n },\n }));\n } else {\n createOptions.changes = {\n ...createOptions.changes,\n author: {\n name: gitAuthorInfo.name || 'Scaffolder',\n email: gitAuthorInfo.email || 'scaffolder@backstage.io',\n },\n };\n }\n }\n }\n\n if (targetBranchName) {\n createOptions.base = targetBranchName;\n }\n\n const pr = await ctx.checkpoint({\n key: `create.pr.${owner}.${repo}.${branchName}`,\n fn: async () => {\n const response = await client.createPullRequest(createOptions);\n if (!response) {\n return null;\n }\n\n return {\n base: response?.data.base,\n html_url: response?.data.html_url,\n number: response?.data.number,\n };\n },\n });\n\n if (createWhenEmpty === false && !pr) {\n ctx.logger.info('No changes to commit, pull request was not created');\n return;\n }\n\n if (!pr) {\n throw new GithubResponseError('null response from Github');\n }\n\n const pullRequestNumber = pr.number;\n const pullRequest = { owner, repo, number: pullRequestNumber };\n if (reviewers || teamReviewers) {\n await requestReviewersOnPullRequest(\n pullRequest,\n reviewers,\n teamReviewers,\n client,\n ctx.logger,\n ctx.checkpoint,\n );\n }\n\n if (assignees) {\n if (assignees.length > 10) {\n ctx.logger.warn(\n 'Assignees list is too long, only the first 10 will be used.',\n );\n }\n await addAssigneesToPullRequest(\n pullRequest,\n assignees,\n client,\n ctx.logger,\n ctx.checkpoint,\n );\n }\n\n const targetBranch = pr.base.ref;\n ctx.output('targetBranchName', targetBranch);\n ctx.output('remoteUrl', pr.html_url);\n ctx.output('pullRequestNumber', pullRequestNumber);\n } catch (e) {\n throw new GithubResponseError('Pull request creation failed', e);\n }\n },\n });\n\n async function addAssigneesToPullRequest(\n pr: GithubPullRequest,\n assignees: string[],\n client: Octokit,\n logger: LoggerService,\n checkpoint: <T extends JsonValue | void>(opts: {\n key: string;\n fn: () => Promise<T> | T;\n }) => Promise<T>,\n ) {\n try {\n await checkpoint({\n key: `add.assignees.${pr.owner}.${pr.repo}.${pr.number}`,\n fn: async () => {\n const result = await client.rest.issues.addAssignees({\n owner: pr.owner,\n repo: pr.repo,\n issue_number: pr.number,\n assignees,\n });\n\n const addedAssignees = result.data.assignees?.join(', ') ?? '';\n\n logger.info(\n `Added assignees [${addedAssignees}] to Pull request ${pr.number}`,\n );\n },\n });\n } catch (e) {\n logger.error(\n `Failure when adding assignees to Pull request ${pr.number}`,\n e,\n );\n }\n }\n\n async function requestReviewersOnPullRequest(\n pr: GithubPullRequest,\n reviewers: string[] | undefined,\n teamReviewers: string[] | undefined,\n client: Octokit,\n logger: LoggerService,\n checkpoint: <T extends JsonValue | void>(opts: {\n key: string;\n fn: () => Promise<T> | T;\n }) => Promise<T>,\n ) {\n try {\n await checkpoint({\n key: `request.reviewers.${pr.owner}.${pr.repo}.${pr.number}`,\n fn: async () => {\n const result = await client.rest.pulls.requestReviewers({\n owner: pr.owner,\n repo: pr.repo,\n pull_number: pr.number,\n reviewers,\n team_reviewers: teamReviewers\n ? [...new Set(teamReviewers)]\n : undefined,\n });\n\n const addedUsers = result.data.requested_reviewers?.join(', ') ?? '';\n const addedTeams = result.data.requested_teams?.join(', ') ?? '';\n\n logger.info(\n `Added users [${addedUsers}] and teams [${addedTeams}] as reviewers to Pull request ${pr.number}`,\n );\n },\n });\n } catch (e) {\n logger.error(\n `Failure when adding reviewers to Pull request ${pr.number}`,\n e,\n );\n }\n }\n};\n"],"names":["CustomErrorBase","getOctokitOptions","Octokit","createPullRequest","createTemplateAction","examples","parseRepoUrl","InputError","resolveSafeChildPath","serializeDirectoryContents","path","DELETE_FILE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"githubPullRequest.cjs.js","sources":["../../src/actions/githubPullRequest.ts"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport path from 'node:path';\nimport {\n GithubCredentialsProvider,\n ScmIntegrationRegistry,\n} from '@backstage/integration';\nimport {\n createTemplateAction,\n parseRepoUrl,\n SerializedFile,\n serializeDirectoryContents,\n} from '@backstage/plugin-scaffolder-node';\nimport { Octokit } from 'octokit';\nimport { CustomErrorBase, InputError } from '@backstage/errors';\nimport {\n createPullRequest,\n DELETE_FILE,\n} from 'octokit-plugin-create-pull-request';\nimport { getOctokitOptions } from '../util';\nimport { examples } from './githubPullRequest.examples';\nimport {\n LoggerService,\n resolveSafeChildPath,\n} from '@backstage/backend-plugin-api';\nimport { Config } from '@backstage/config';\nimport { JsonValue } from '@backstage/types';\n\nexport type Encoding = 'utf-8' | 'base64';\n\nclass GithubResponseError extends CustomErrorBase {}\n\nexport const defaultClientFactory: CreateGithubPullRequestActionOptions['clientFactory'] =\n async ({\n integrations,\n githubCredentialsProvider,\n owner,\n repo,\n host = 'github.com',\n token: providedToken,\n }) => {\n const octokitOptions = await getOctokitOptions({\n integrations,\n credentialsProvider: githubCredentialsProvider,\n host,\n owner,\n repo,\n token: providedToken,\n });\n\n const OctokitPR = Octokit.plugin(createPullRequest);\n return new OctokitPR({\n ...octokitOptions,\n ...{ throttle: { enabled: false } },\n });\n };\n\n/**\n * The options passed to {@link createPublishGithubPullRequestAction} method\n * @public\n */\nexport interface CreateGithubPullRequestActionOptions {\n /**\n * An instance of {@link @backstage/integration#ScmIntegrationRegistry} that will be used in the action.\n */\n integrations: ScmIntegrationRegistry;\n /**\n * An instance of {@link @backstage/integration#GithubCredentialsProvider} that will be used to get credentials for the action.\n */\n githubCredentialsProvider?: GithubCredentialsProvider;\n /**\n * A method to return the Octokit client with the Pull Request Plugin.\n */\n clientFactory?: (input: {\n integrations: ScmIntegrationRegistry;\n githubCredentialsProvider?: GithubCredentialsProvider;\n host: string;\n owner: string;\n repo: string;\n token?: string;\n }) => Promise<\n Octokit & {\n createPullRequest(options: createPullRequest.Options): Promise<{\n data: {\n html_url: string;\n number: number;\n base: {\n ref: string;\n };\n };\n } | null>;\n }\n >;\n /**\n * An instance of {@link @backstage/config#Config} that will be used in the action.\n */\n config?: Config;\n}\n\ntype GithubPullRequest = {\n owner: string;\n repo: string;\n number: number;\n};\n\n/**\n * Creates a Github Pull Request action.\n * @public\n */\nexport const createPublishGithubPullRequestAction = (\n options: CreateGithubPullRequestActionOptions,\n) => {\n const {\n integrations,\n githubCredentialsProvider,\n clientFactory = defaultClientFactory,\n config,\n } = options;\n\n return createTemplateAction({\n id: 'publish:github:pull-request',\n examples,\n supportsDryRun: true,\n schema: {\n input: {\n repoUrl: z =>\n z.string({\n description:\n 'Accepts the format `github.com?repo=reponame&owner=owner` where `reponame` is the repository name and `owner` is an organization or username',\n }),\n branchName: z =>\n z.string({\n description: 'The name for the branch',\n }),\n filesToDelete: z =>\n z\n .array(z.string(), {\n description: 'List of files that will be deleted',\n })\n .optional(),\n targetBranchName: z =>\n z\n .string({\n description: 'The target branch name of the pull request',\n })\n .optional(),\n title: z =>\n z.string({\n description: 'The name for the pull request',\n }),\n description: z =>\n z.string({\n description: 'The description of the pull request',\n }),\n draft: z =>\n z\n .boolean({\n description: 'Create a draft pull request',\n })\n .optional(),\n sourcePath: z =>\n z\n .string({\n description:\n 'Subdirectory of working directory to copy changes from',\n })\n .optional(),\n targetPath: z =>\n z\n .string({\n description: 'Subdirectory of repository to apply changes to',\n })\n .optional(),\n token: z =>\n z\n .string({\n description: 'The token to use for authorization to GitHub',\n })\n .optional(),\n reviewers: z =>\n z\n .array(z.string(), {\n description:\n 'The users that will be added as reviewers to the pull request',\n })\n .optional(),\n assignees: z =>\n z\n .array(z.string(), {\n description:\n 'The users that will be added as assignees to the pull request',\n })\n .optional(),\n teamReviewers: z =>\n z\n .array(z.string(), {\n description:\n 'The teams that will be added as reviewers to the pull request',\n })\n .optional(),\n commitMessage: z =>\n z\n .string({\n description: 'The commit message for the pull request commit',\n })\n .optional(),\n update: z =>\n z\n .boolean({\n description: 'Update pull request if already exists',\n })\n .optional(),\n forceFork: z =>\n z\n .boolean({\n description: 'Create pull request from a fork',\n })\n .optional(),\n gitAuthorName: z =>\n z\n .string({\n description:\n 'Sets the default author name for the commit. The default value is the authenticated user or `Scaffolder`',\n })\n .optional(),\n gitAuthorEmail: z =>\n z\n .string({\n description:\n 'Sets the default author email for the commit. The default value is the authenticated user or `scaffolder@backstage.io`',\n })\n .optional(),\n forceEmptyGitAuthor: z =>\n z\n .boolean({\n description:\n 'Forces the author to be empty. This is useful when using a Github App, it permit the commit to be verified on Github',\n })\n .optional(),\n createWhenEmpty: z =>\n z\n .boolean({\n description:\n '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.',\n })\n .optional(),\n },\n output: {\n targetBranchName: z =>\n z.string({\n description: 'Target branch name of the merge request',\n }),\n remoteUrl: z =>\n z.string({\n description: 'Link to the pull request in Github',\n }),\n pullRequestNumber: z =>\n z.number({\n description: 'The pull request number',\n }),\n },\n },\n async handler(ctx) {\n const {\n repoUrl,\n branchName,\n filesToDelete,\n targetBranchName,\n title,\n description,\n draft,\n targetPath,\n sourcePath,\n token: providedToken,\n reviewers,\n assignees,\n teamReviewers,\n commitMessage,\n update,\n forceFork,\n gitAuthorEmail,\n gitAuthorName,\n forceEmptyGitAuthor,\n createWhenEmpty,\n } = ctx.input;\n\n const { owner, repo, host } = parseRepoUrl(repoUrl, integrations);\n\n if (!owner) {\n throw new InputError(\n `No owner provided for host: ${host}, and repo ${repo}`,\n );\n }\n\n const client = await clientFactory({\n integrations,\n githubCredentialsProvider,\n host,\n owner,\n repo,\n token: providedToken,\n });\n\n const fileRoot = sourcePath\n ? resolveSafeChildPath(ctx.workspacePath, sourcePath)\n : ctx.workspacePath;\n\n const directoryContents = await serializeDirectoryContents(fileRoot, {\n gitignore: true,\n });\n\n const determineFileMode = (file: SerializedFile): string => {\n if (file.symlink) return '120000';\n if (file.executable) return '100755';\n return '100644';\n };\n\n const determineFileEncoding = (\n file: SerializedFile,\n ): 'utf-8' | 'base64' => (file.symlink ? 'utf-8' : 'base64');\n\n const files = Object.fromEntries([\n ...directoryContents.map(file => [\n targetPath ? path.posix.join(targetPath, file.path) : file.path,\n {\n // See the properties of tree items\n // in https://docs.github.com/en/rest/reference/git#trees\n mode: determineFileMode(file),\n // Always use base64 encoding where possible to avoid doubling a binary file in size\n // due to interpreting a binary file as utf-8 and sending github\n // the utf-8 encoded content. Symlinks are kept as utf-8 to avoid them\n // being formatted as a series of scrambled characters\n //\n // For example, the original gradle-wrapper.jar is 57.8k in https://github.com/kennethzfeng/pull-request-test/pull/5/files.\n // Its size could be doubled to 98.3K (See https://github.com/kennethzfeng/pull-request-test/pull/4/files)\n encoding: determineFileEncoding(file),\n content: file.content.toString(determineFileEncoding(file)),\n },\n ]),\n // order of arrays is important so filesToDelete will overwrite\n // changes from files above\n ...(filesToDelete || []).map(filePath => [\n targetPath ? path.posix.join(targetPath, filePath) : filePath,\n DELETE_FILE,\n ]),\n ]);\n\n // If this is a dry run, log and return\n if (ctx.isDryRun) {\n ctx.logger.info(`Performing dry run of creating pull request`);\n ctx.output('targetBranchName', branchName);\n ctx.output('remoteUrl', repoUrl);\n ctx.output('pullRequestNumber', 43);\n ctx.logger.info(`Dry run complete`);\n return;\n }\n\n try {\n const createOptions: createPullRequest.Options = {\n owner,\n repo,\n title,\n changes: [\n {\n files,\n commit:\n commitMessage ??\n config?.getOptionalString('scaffolder.defaultCommitMessage') ??\n title,\n },\n ],\n body: description,\n head: branchName,\n draft,\n update,\n forceFork,\n createWhenEmpty,\n };\n\n const gitAuthorInfo = {\n name:\n gitAuthorName ??\n config?.getOptionalString('scaffolder.defaultAuthor.name'),\n email:\n gitAuthorEmail ??\n config?.getOptionalString('scaffolder.defaultAuthor.email'),\n };\n\n if (!forceEmptyGitAuthor) {\n if (gitAuthorInfo.name || gitAuthorInfo.email) {\n if (Array.isArray(createOptions.changes)) {\n createOptions.changes = createOptions.changes.map(change => ({\n ...change,\n author: {\n name: gitAuthorInfo.name || 'Scaffolder',\n email: gitAuthorInfo.email || 'scaffolder@backstage.io',\n },\n }));\n } else {\n createOptions.changes = {\n ...createOptions.changes,\n author: {\n name: gitAuthorInfo.name || 'Scaffolder',\n email: gitAuthorInfo.email || 'scaffolder@backstage.io',\n },\n };\n }\n }\n }\n\n if (targetBranchName) {\n createOptions.base = targetBranchName;\n }\n\n const pr = await ctx.checkpoint({\n key: `create.pr.${owner}.${repo}.${branchName}`,\n fn: async () => {\n const response = await client.createPullRequest(createOptions);\n if (!response) {\n return null;\n }\n\n return {\n base: response?.data.base,\n html_url: response?.data.html_url,\n number: response?.data.number,\n };\n },\n });\n\n if (createWhenEmpty === false && !pr) {\n ctx.logger.info('No changes to commit, pull request was not created');\n return;\n }\n\n if (!pr) {\n throw new GithubResponseError('null response from Github');\n }\n\n const pullRequestNumber = pr.number;\n const pullRequest = { owner, repo, number: pullRequestNumber };\n if (reviewers || teamReviewers) {\n await requestReviewersOnPullRequest(\n pullRequest,\n reviewers,\n teamReviewers,\n client,\n ctx.logger,\n ctx.checkpoint,\n );\n }\n\n if (assignees) {\n if (assignees.length > 10) {\n ctx.logger.warn(\n 'Assignees list is too long, only the first 10 will be used.',\n );\n }\n await addAssigneesToPullRequest(\n pullRequest,\n assignees,\n client,\n ctx.logger,\n ctx.checkpoint,\n );\n }\n\n const targetBranch = pr.base.ref;\n ctx.output('targetBranchName', targetBranch);\n ctx.output('remoteUrl', pr.html_url);\n ctx.output('pullRequestNumber', pullRequestNumber);\n } catch (e) {\n throw new GithubResponseError('Pull request creation failed', e);\n }\n },\n });\n\n async function addAssigneesToPullRequest(\n pr: GithubPullRequest,\n assignees: string[],\n client: Octokit,\n logger: LoggerService,\n checkpoint: <T extends JsonValue | void>(opts: {\n key: string;\n fn: () => Promise<T> | T;\n }) => Promise<T>,\n ) {\n try {\n await checkpoint({\n key: `add.assignees.${pr.owner}.${pr.repo}.${pr.number}`,\n fn: async () => {\n const result = await client.rest.issues.addAssignees({\n owner: pr.owner,\n repo: pr.repo,\n issue_number: pr.number,\n assignees,\n });\n\n const addedAssignees = result.data.assignees?.join(', ') ?? '';\n\n logger.info(\n `Added assignees [${addedAssignees}] to Pull request ${pr.number}`,\n );\n },\n });\n } catch (e) {\n logger.error(\n `Failure when adding assignees to Pull request ${pr.number}`,\n e,\n );\n }\n }\n\n async function requestReviewersOnPullRequest(\n pr: GithubPullRequest,\n reviewers: string[] | undefined,\n teamReviewers: string[] | undefined,\n client: Octokit,\n logger: LoggerService,\n checkpoint: <T extends JsonValue | void>(opts: {\n key: string;\n fn: () => Promise<T> | T;\n }) => Promise<T>,\n ) {\n try {\n await checkpoint({\n key: `request.reviewers.${pr.owner}.${pr.repo}.${pr.number}`,\n fn: async () => {\n const result = await client.rest.pulls.requestReviewers({\n owner: pr.owner,\n repo: pr.repo,\n pull_number: pr.number,\n reviewers,\n team_reviewers: teamReviewers\n ? [...new Set(teamReviewers)]\n : undefined,\n });\n\n const addedUsers = result.data.requested_reviewers?.join(', ') ?? '';\n const addedTeams = result.data.requested_teams?.join(', ') ?? '';\n\n logger.info(\n `Added users [${addedUsers}] and teams [${addedTeams}] as reviewers to Pull request ${pr.number}`,\n );\n },\n });\n } catch (e) {\n logger.error(\n `Failure when adding reviewers to Pull request ${pr.number}`,\n e,\n );\n }\n }\n};\n"],"names":["CustomErrorBase","getOctokitOptions","Octokit","createPullRequest","createTemplateAction","examples","parseRepoUrl","InputError","resolveSafeChildPath","serializeDirectoryContents","path","DELETE_FILE"],"mappings":"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"}
|
|
@@ -16,46 +16,32 @@ async function createGithubRepoWithCollaboratorsAndTopics(client, repo, owner, r
|
|
|
16
16
|
if (access?.startsWith(`${owner}/`)) {
|
|
17
17
|
await validateAccessTeam(client, access);
|
|
18
18
|
}
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
org: owner,
|
|
22
|
-
private: repoVisibility === "private",
|
|
23
|
-
// @ts-ignore https://github.com/octokit/types.ts/issues/522
|
|
24
|
-
visibility: repoVisibility,
|
|
25
|
-
description,
|
|
26
|
-
delete_branch_on_merge: deleteBranchOnMerge,
|
|
19
|
+
const baseRepoParams = {
|
|
20
|
+
allow_auto_merge: allowAutoMerge,
|
|
27
21
|
allow_merge_commit: allowMergeCommit,
|
|
28
|
-
allow_squash_merge: allowSquashMerge,
|
|
29
|
-
squash_merge_commit_title: squashMergeCommitTitle,
|
|
30
|
-
squash_merge_commit_message: squashMergeCommitMessage,
|
|
31
22
|
allow_rebase_merge: allowRebaseMerge,
|
|
32
|
-
|
|
23
|
+
allow_squash_merge: allowSquashMerge,
|
|
33
24
|
allow_update_branch: allowUpdateBranch,
|
|
34
|
-
|
|
25
|
+
auto_init: autoInit,
|
|
26
|
+
delete_branch_on_merge: deleteBranchOnMerge,
|
|
27
|
+
description,
|
|
28
|
+
has_issues: hasIssues,
|
|
35
29
|
has_projects: hasProjects,
|
|
36
30
|
has_wiki: hasWiki,
|
|
37
|
-
|
|
38
|
-
auto_init: autoInit,
|
|
39
|
-
// Custom properties only available on org repos
|
|
40
|
-
custom_properties: customProperties
|
|
41
|
-
}) : client.rest.repos.createForAuthenticatedUser({
|
|
31
|
+
homepage,
|
|
42
32
|
name: repo,
|
|
43
33
|
private: repoVisibility === "private",
|
|
44
|
-
description,
|
|
45
|
-
delete_branch_on_merge: deleteBranchOnMerge,
|
|
46
|
-
allow_merge_commit: allowMergeCommit,
|
|
47
|
-
allow_squash_merge: allowSquashMerge,
|
|
48
|
-
squash_merge_commit_title: squashMergeCommitTitle,
|
|
49
34
|
squash_merge_commit_message: squashMergeCommitMessage,
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
35
|
+
squash_merge_commit_title: squashMergeCommitTitle
|
|
36
|
+
};
|
|
37
|
+
const repoCreationPromise = user.data.type === "Organization" ? client.rest.repos.createInOrg({
|
|
38
|
+
...baseRepoParams,
|
|
39
|
+
// Custom properties only available on org repos
|
|
40
|
+
custom_properties: customProperties,
|
|
41
|
+
org: owner,
|
|
42
|
+
// @ts-ignore https://github.com/octokit/types.ts/issues/522
|
|
43
|
+
visibility: repoVisibility
|
|
44
|
+
}) : client.rest.repos.createForAuthenticatedUser(baseRepoParams);
|
|
59
45
|
let newRepo;
|
|
60
46
|
try {
|
|
61
47
|
newRepo = (await repoCreationPromise).data;
|
|
@@ -192,7 +178,7 @@ async function createGithubRepoWithCollaboratorsAndTopics(client, repo, owner, r
|
|
|
192
178
|
}
|
|
193
179
|
return newRepo;
|
|
194
180
|
}
|
|
195
|
-
async function initRepoPushAndProtect(remoteUrl, password, workspacePath, sourcePath, defaultBranch, protectDefaultBranch,
|
|
181
|
+
async function initRepoPushAndProtect(remoteUrl, password, workspacePath, sourcePath, defaultBranch, protectDefaultBranch, enforceAdmins, owner, client, repo, requireCodeOwnerReviews, bypassPullRequestAllowances, requiredApprovingReviewCount, restrictions, requiredStatusCheckContexts, requireBranchesToBeUpToDate, requiredConversationResolution, requireLastPushApproval, config, logger, gitCommitMessage, gitAuthorName, gitAuthorEmail, dismissStaleReviews, requiredCommitSigning, requiredLinearHistory) {
|
|
196
182
|
const gitAuthorInfo = {
|
|
197
183
|
name: gitAuthorName ? gitAuthorName : config.getOptionalString("scaffolder.defaultAuthor.name"),
|
|
198
184
|
email: gitAuthorEmail ? gitAuthorEmail : config.getOptionalString("scaffolder.defaultAuthor.email")
|
|
@@ -226,7 +212,7 @@ async function initRepoPushAndProtect(remoteUrl, password, workspacePath, source
|
|
|
226
212
|
requireBranchesToBeUpToDate,
|
|
227
213
|
requiredConversationResolution,
|
|
228
214
|
requireLastPushApproval,
|
|
229
|
-
enforceAdmins
|
|
215
|
+
enforceAdmins,
|
|
230
216
|
dismissStaleReviews,
|
|
231
217
|
requiredCommitSigning,
|
|
232
218
|
requiredLinearHistory
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.cjs.js","sources":["../../src/actions/helpers.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { assertError, NotFoundError } from '@backstage/errors';\nimport { Octokit } from 'octokit';\n\nimport {\n getRepoSourceDirectory,\n initRepoAndPush,\n} from '@backstage/plugin-scaffolder-node';\n\nimport Sodium from 'libsodium-wrappers';\nimport {\n enableBranchProtectionOnDefaultRepoBranch,\n entityRefToName,\n} from './gitHelpers';\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nexport async function createGithubRepoWithCollaboratorsAndTopics(\n client: Octokit,\n repo: string,\n owner: string,\n repoVisibility: 'private' | 'internal' | 'public' | undefined,\n description: string | undefined,\n homepage: string | undefined,\n deleteBranchOnMerge: boolean,\n allowMergeCommit: boolean,\n allowSquashMerge: boolean,\n squashMergeCommitTitle: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE' | undefined,\n squashMergeCommitMessage: 'PR_BODY' | 'COMMIT_MESSAGES' | 'BLANK' | undefined,\n allowRebaseMerge: boolean,\n allowAutoMerge: boolean,\n allowUpdateBranch: boolean,\n access: string | undefined,\n collaborators:\n | (\n | {\n user: string;\n access: string;\n }\n | {\n team: string;\n access: string;\n }\n | {\n /** @deprecated This field is deprecated in favor of team */\n username: string;\n access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage';\n }\n )[]\n | undefined,\n hasProjects: boolean | undefined,\n hasWiki: boolean | undefined,\n hasIssues: boolean | undefined,\n topics: string[] | undefined,\n repoVariables: { [key: string]: string } | undefined,\n secrets: { [key: string]: string } | undefined,\n oidcCustomization:\n | {\n useDefault: boolean;\n includeClaimKeys?: string[];\n }\n | undefined,\n customProperties: { [key: string]: string | string[] } | undefined,\n subscribe: boolean | undefined,\n logger: LoggerService,\n autoInit?: boolean | undefined,\n workflowAccess?: 'none' | 'organization' | 'user',\n) {\n // eslint-disable-next-line testing-library/no-await-sync-queries\n const user = await client.rest.users.getByUsername({\n username: owner,\n });\n\n if (access?.startsWith(`${owner}/`)) {\n await validateAccessTeam(client, access);\n }\n\n const repoCreationPromise =\n user.data.type === 'Organization'\n ? client.rest.repos.createInOrg({\n name: repo,\n org: owner,\n private: repoVisibility === 'private',\n // @ts-ignore https://github.com/octokit/types.ts/issues/522\n visibility: repoVisibility,\n description: description,\n delete_branch_on_merge: deleteBranchOnMerge,\n allow_merge_commit: allowMergeCommit,\n allow_squash_merge: allowSquashMerge,\n squash_merge_commit_title: squashMergeCommitTitle,\n squash_merge_commit_message: squashMergeCommitMessage,\n allow_rebase_merge: allowRebaseMerge,\n allow_auto_merge: allowAutoMerge,\n allow_update_branch: allowUpdateBranch,\n homepage: homepage,\n has_projects: hasProjects,\n has_wiki: hasWiki,\n has_issues: hasIssues,\n auto_init: autoInit,\n // Custom properties only available on org repos\n custom_properties: customProperties,\n })\n : client.rest.repos.createForAuthenticatedUser({\n name: repo,\n private: repoVisibility === 'private',\n description: description,\n delete_branch_on_merge: deleteBranchOnMerge,\n allow_merge_commit: allowMergeCommit,\n allow_squash_merge: allowSquashMerge,\n squash_merge_commit_title: squashMergeCommitTitle,\n squash_merge_commit_message: squashMergeCommitMessage,\n allow_rebase_merge: allowRebaseMerge,\n allow_auto_merge: allowAutoMerge,\n allow_update_branch: allowUpdateBranch,\n homepage: homepage,\n has_projects: hasProjects,\n has_wiki: hasWiki,\n has_issues: hasIssues,\n auto_init: autoInit,\n });\n\n let newRepo;\n\n try {\n newRepo = (await repoCreationPromise).data;\n } catch (e) {\n assertError(e);\n if (e.message === 'Resource not accessible by integration') {\n logger.warn(\n `The GitHub app or token provided may not have the required permissions to create the ${user.data.type} repository ${owner}/${repo}.`,\n );\n }\n throw new Error(\n `Failed to create the ${user.data.type} repository ${owner}/${repo}, ${e.message}`,\n );\n }\n\n if (access?.startsWith(`${owner}/`)) {\n const [, team] = access.split('/');\n await client.rest.teams.addOrUpdateRepoPermissionsInOrg({\n org: owner,\n team_slug: team,\n owner,\n repo,\n permission: 'admin',\n });\n // No need to add access if it's the person who owns the personal account\n } else if (access && access !== owner) {\n await client.rest.repos.addCollaborator({\n owner,\n repo,\n username: access,\n permission: 'admin',\n });\n }\n\n if (collaborators) {\n for (const collaborator of collaborators) {\n try {\n if ('user' in collaborator) {\n await client.rest.repos.addCollaborator({\n owner,\n repo,\n username: entityRefToName(collaborator.user),\n permission: collaborator.access,\n });\n } else if ('team' in collaborator) {\n await client.rest.teams.addOrUpdateRepoPermissionsInOrg({\n org: owner,\n team_slug: entityRefToName(collaborator.team),\n owner,\n repo,\n permission: collaborator.access,\n });\n }\n } catch (e) {\n assertError(e);\n const name = extractCollaboratorName(collaborator);\n logger.warn(\n `Skipping ${collaborator.access} access for ${name}, ${e.message}`,\n );\n }\n }\n }\n\n if (topics) {\n try {\n await client.rest.repos.replaceAllTopics({\n owner,\n repo,\n names: topics.map(t => t.toLowerCase()),\n });\n } catch (e) {\n assertError(e);\n logger.warn(`Skipping topics ${topics.join(' ')}, ${e.message}`);\n }\n }\n\n for (const [key, value] of Object.entries(repoVariables ?? {})) {\n await client.rest.actions.createRepoVariable({\n owner,\n repo,\n name: key,\n value: value,\n });\n }\n\n if (secrets) {\n const publicKeyResponse = await client.rest.actions.getRepoPublicKey({\n owner,\n repo,\n });\n\n await Sodium.ready;\n const binaryKey = Sodium.from_base64(\n publicKeyResponse.data.key,\n Sodium.base64_variants.ORIGINAL,\n );\n for (const [key, value] of Object.entries(secrets)) {\n const binarySecret = Sodium.from_string(value);\n const encryptedBinarySecret = Sodium.crypto_box_seal(\n binarySecret,\n binaryKey,\n );\n const encryptedBase64Secret = Sodium.to_base64(\n encryptedBinarySecret,\n Sodium.base64_variants.ORIGINAL,\n );\n\n await client.rest.actions.createOrUpdateRepoSecret({\n owner,\n repo,\n secret_name: key,\n encrypted_value: encryptedBase64Secret,\n key_id: publicKeyResponse.data.key_id,\n });\n }\n }\n\n if (oidcCustomization) {\n await client.request(\n 'PUT /repos/{owner}/{repo}/actions/oidc/customization/sub',\n {\n owner,\n repo,\n use_default: oidcCustomization.useDefault,\n include_claim_keys: oidcCustomization.includeClaimKeys,\n },\n );\n }\n\n if (subscribe) {\n await client.rest.activity.setRepoSubscription({\n subscribed: true,\n ignored: false,\n owner,\n repo,\n });\n }\n\n if (workflowAccess) {\n await client.rest.actions.setWorkflowAccessToRepository({\n access_level: workflowAccess,\n owner,\n repo,\n });\n }\n\n return newRepo;\n}\n\nexport async function initRepoPushAndProtect(\n remoteUrl: string,\n password: string,\n workspacePath: string,\n sourcePath: string | undefined,\n defaultBranch: string,\n protectDefaultBranch: boolean,\n protectEnforceAdmins: boolean,\n owner: string,\n client: Octokit,\n repo: string,\n requireCodeOwnerReviews: boolean,\n bypassPullRequestAllowances:\n | {\n users?: string[];\n teams?: string[];\n apps?: string[];\n }\n | undefined,\n requiredApprovingReviewCount: number,\n restrictions:\n | {\n users: string[];\n teams: string[];\n apps?: string[];\n }\n | undefined,\n requiredStatusCheckContexts: string[],\n requireBranchesToBeUpToDate: boolean,\n requiredConversationResolution: boolean,\n requireLastPushApproval: boolean,\n config: Config,\n logger: any,\n gitCommitMessage?: string,\n gitAuthorName?: string,\n gitAuthorEmail?: string,\n dismissStaleReviews?: boolean,\n requiredCommitSigning?: boolean,\n requiredLinearHistory?: boolean,\n): Promise<{ commitHash: string }> {\n const gitAuthorInfo = {\n name: gitAuthorName\n ? gitAuthorName\n : config.getOptionalString('scaffolder.defaultAuthor.name'),\n email: gitAuthorEmail\n ? gitAuthorEmail\n : config.getOptionalString('scaffolder.defaultAuthor.email'),\n };\n\n const commitMessage =\n getGitCommitMessage(gitCommitMessage, config) || 'initial commit';\n\n const commitResult = await initRepoAndPush({\n dir: getRepoSourceDirectory(workspacePath, sourcePath),\n remoteUrl,\n defaultBranch,\n auth: {\n username: 'x-access-token',\n password,\n },\n logger,\n commitMessage,\n gitAuthorInfo,\n });\n\n if (protectDefaultBranch) {\n try {\n await enableBranchProtectionOnDefaultRepoBranch({\n owner,\n client,\n repoName: repo,\n logger,\n defaultBranch,\n bypassPullRequestAllowances,\n requiredApprovingReviewCount,\n restrictions,\n requireCodeOwnerReviews,\n requiredStatusCheckContexts,\n requireBranchesToBeUpToDate,\n requiredConversationResolution,\n requireLastPushApproval,\n enforceAdmins: protectEnforceAdmins,\n dismissStaleReviews: dismissStaleReviews,\n requiredCommitSigning: requiredCommitSigning,\n requiredLinearHistory: requiredLinearHistory,\n });\n } catch (e) {\n assertError(e);\n logger.warn(\n `Skipping: default branch protection on '${repo}', ${e.message}`,\n );\n }\n }\n\n return { commitHash: commitResult.commitHash };\n}\n\nfunction extractCollaboratorName(\n collaborator: { user: string } | { team: string } | { username: string },\n) {\n if ('username' in collaborator) return collaborator.username;\n if ('user' in collaborator) return collaborator.user;\n return collaborator.team;\n}\n\nasync function validateAccessTeam(client: Octokit, access: string) {\n const [org, team_slug] = access.split('/');\n try {\n // Below rule disabled because of a 'getByName' check for a different library\n // incorrectly triggers here.\n // eslint-disable-next-line testing-library/no-await-sync-queries\n await client.rest.teams.getByName({\n org,\n team_slug,\n });\n } catch (e) {\n if (e.response.data.message === 'Not Found') {\n const message = `Received 'Not Found' from the API; one of org:\n ${org} or team: ${team_slug} was not found within GitHub.`;\n throw new NotFoundError(message);\n }\n }\n}\n\nexport function getGitCommitMessage(\n gitCommitMessage: string | undefined,\n config: Config,\n): string | undefined {\n return gitCommitMessage\n ? gitCommitMessage\n : config.getOptionalString('scaffolder.defaultCommitMessage');\n}\n"],"names":["assertError","entityRefToName","Sodium","initRepoAndPush","getRepoSourceDirectory","enableBranchProtectionOnDefaultRepoBranch","NotFoundError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.cjs.js","sources":["../../src/actions/helpers.ts"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Config } from '@backstage/config';\nimport { assertError, NotFoundError } from '@backstage/errors';\nimport { Octokit } from 'octokit';\n\nimport {\n getRepoSourceDirectory,\n initRepoAndPush,\n} from '@backstage/plugin-scaffolder-node';\n\nimport Sodium from 'libsodium-wrappers';\nimport {\n enableBranchProtectionOnDefaultRepoBranch,\n entityRefToName,\n} from './gitHelpers';\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nexport async function createGithubRepoWithCollaboratorsAndTopics(\n client: Octokit,\n repo: string,\n owner: string,\n repoVisibility: 'private' | 'internal' | 'public' | undefined,\n description: string | undefined,\n homepage: string | undefined,\n deleteBranchOnMerge: boolean,\n allowMergeCommit: boolean,\n allowSquashMerge: boolean,\n squashMergeCommitTitle: 'PR_TITLE' | 'COMMIT_OR_PR_TITLE' | undefined,\n squashMergeCommitMessage: 'PR_BODY' | 'COMMIT_MESSAGES' | 'BLANK' | undefined,\n allowRebaseMerge: boolean,\n allowAutoMerge: boolean,\n allowUpdateBranch: boolean,\n access: string | undefined,\n collaborators:\n | (\n | {\n user: string;\n access: string;\n }\n | {\n team: string;\n access: string;\n }\n | {\n /** @deprecated This field is deprecated in favor of team */\n username: string;\n access: 'pull' | 'push' | 'admin' | 'maintain' | 'triage';\n }\n )[]\n | undefined,\n hasProjects: boolean | undefined,\n hasWiki: boolean | undefined,\n hasIssues: boolean | undefined,\n topics: string[] | undefined,\n repoVariables: { [key: string]: string } | undefined,\n secrets: { [key: string]: string } | undefined,\n oidcCustomization:\n | {\n useDefault: boolean;\n includeClaimKeys?: string[];\n }\n | undefined,\n customProperties: { [key: string]: string | string[] } | undefined,\n subscribe: boolean | undefined,\n logger: LoggerService,\n autoInit?: boolean | undefined,\n workflowAccess?: 'none' | 'organization' | 'user',\n) {\n const user = await client.rest.users.getByUsername({\n username: owner,\n });\n\n if (access?.startsWith(`${owner}/`)) {\n await validateAccessTeam(client, access);\n }\n\n const baseRepoParams = {\n allow_auto_merge: allowAutoMerge,\n allow_merge_commit: allowMergeCommit,\n allow_rebase_merge: allowRebaseMerge,\n allow_squash_merge: allowSquashMerge,\n allow_update_branch: allowUpdateBranch,\n auto_init: autoInit,\n delete_branch_on_merge: deleteBranchOnMerge,\n description,\n has_issues: hasIssues,\n has_projects: hasProjects,\n has_wiki: hasWiki,\n homepage,\n name: repo,\n private: repoVisibility === 'private',\n squash_merge_commit_message: squashMergeCommitMessage,\n squash_merge_commit_title: squashMergeCommitTitle,\n };\n const repoCreationPromise =\n user.data.type === 'Organization'\n ? client.rest.repos.createInOrg({\n ...baseRepoParams,\n // Custom properties only available on org repos\n custom_properties: customProperties,\n org: owner,\n // @ts-ignore https://github.com/octokit/types.ts/issues/522\n visibility: repoVisibility,\n })\n : client.rest.repos.createForAuthenticatedUser(baseRepoParams);\n\n let newRepo;\n\n try {\n newRepo = (await repoCreationPromise).data;\n } catch (e) {\n assertError(e);\n if (e.message === 'Resource not accessible by integration') {\n logger.warn(\n `The GitHub app or token provided may not have the required permissions to create the ${user.data.type} repository ${owner}/${repo}.`,\n );\n }\n throw new Error(\n `Failed to create the ${user.data.type} repository ${owner}/${repo}, ${e.message}`,\n );\n }\n\n if (access?.startsWith(`${owner}/`)) {\n const [, team] = access.split('/');\n await client.rest.teams.addOrUpdateRepoPermissionsInOrg({\n org: owner,\n team_slug: team,\n owner,\n repo,\n permission: 'admin',\n });\n // No need to add access if it's the person who owns the personal account\n } else if (access && access !== owner) {\n await client.rest.repos.addCollaborator({\n owner,\n repo,\n username: access,\n permission: 'admin',\n });\n }\n\n if (collaborators) {\n for (const collaborator of collaborators) {\n try {\n if ('user' in collaborator) {\n await client.rest.repos.addCollaborator({\n owner,\n repo,\n username: entityRefToName(collaborator.user),\n permission: collaborator.access,\n });\n } else if ('team' in collaborator) {\n await client.rest.teams.addOrUpdateRepoPermissionsInOrg({\n org: owner,\n team_slug: entityRefToName(collaborator.team),\n owner,\n repo,\n permission: collaborator.access,\n });\n }\n } catch (e) {\n assertError(e);\n const name = extractCollaboratorName(collaborator);\n logger.warn(\n `Skipping ${collaborator.access} access for ${name}, ${e.message}`,\n );\n }\n }\n }\n\n if (topics) {\n try {\n await client.rest.repos.replaceAllTopics({\n owner,\n repo,\n names: topics.map(t => t.toLowerCase()),\n });\n } catch (e) {\n assertError(e);\n logger.warn(`Skipping topics ${topics.join(' ')}, ${e.message}`);\n }\n }\n\n for (const [key, value] of Object.entries(repoVariables ?? {})) {\n await client.rest.actions.createRepoVariable({\n owner,\n repo,\n name: key,\n value: value,\n });\n }\n\n if (secrets) {\n const publicKeyResponse = await client.rest.actions.getRepoPublicKey({\n owner,\n repo,\n });\n\n await Sodium.ready;\n const binaryKey = Sodium.from_base64(\n publicKeyResponse.data.key,\n Sodium.base64_variants.ORIGINAL,\n );\n for (const [key, value] of Object.entries(secrets)) {\n const binarySecret = Sodium.from_string(value);\n const encryptedBinarySecret = Sodium.crypto_box_seal(\n binarySecret,\n binaryKey,\n );\n const encryptedBase64Secret = Sodium.to_base64(\n encryptedBinarySecret,\n Sodium.base64_variants.ORIGINAL,\n );\n\n await client.rest.actions.createOrUpdateRepoSecret({\n owner,\n repo,\n secret_name: key,\n encrypted_value: encryptedBase64Secret,\n key_id: publicKeyResponse.data.key_id,\n });\n }\n }\n\n if (oidcCustomization) {\n await client.request(\n 'PUT /repos/{owner}/{repo}/actions/oidc/customization/sub',\n {\n owner,\n repo,\n use_default: oidcCustomization.useDefault,\n include_claim_keys: oidcCustomization.includeClaimKeys,\n },\n );\n }\n\n if (subscribe) {\n await client.rest.activity.setRepoSubscription({\n subscribed: true,\n ignored: false,\n owner,\n repo,\n });\n }\n\n if (workflowAccess) {\n await client.rest.actions.setWorkflowAccessToRepository({\n access_level: workflowAccess,\n owner,\n repo,\n });\n }\n\n return newRepo;\n}\n\nexport async function initRepoPushAndProtect(\n remoteUrl: string,\n password: string,\n workspacePath: string,\n sourcePath: string | undefined,\n defaultBranch: string,\n protectDefaultBranch: boolean,\n enforceAdmins: boolean,\n owner: string,\n client: Octokit,\n repo: string,\n requireCodeOwnerReviews: boolean,\n bypassPullRequestAllowances:\n | {\n users?: string[];\n teams?: string[];\n apps?: string[];\n }\n | undefined,\n requiredApprovingReviewCount: number,\n restrictions:\n | {\n users: string[];\n teams: string[];\n apps?: string[];\n }\n | undefined,\n requiredStatusCheckContexts: string[],\n requireBranchesToBeUpToDate: boolean,\n requiredConversationResolution: boolean,\n requireLastPushApproval: boolean,\n config: Config,\n logger: any,\n gitCommitMessage?: string,\n gitAuthorName?: string,\n gitAuthorEmail?: string,\n dismissStaleReviews?: boolean,\n requiredCommitSigning?: boolean,\n requiredLinearHistory?: boolean,\n): Promise<{ commitHash: string }> {\n const gitAuthorInfo = {\n name: gitAuthorName\n ? gitAuthorName\n : config.getOptionalString('scaffolder.defaultAuthor.name'),\n email: gitAuthorEmail\n ? gitAuthorEmail\n : config.getOptionalString('scaffolder.defaultAuthor.email'),\n };\n\n const commitMessage =\n getGitCommitMessage(gitCommitMessage, config) || 'initial commit';\n\n const commitResult = await initRepoAndPush({\n dir: getRepoSourceDirectory(workspacePath, sourcePath),\n remoteUrl,\n defaultBranch,\n auth: {\n username: 'x-access-token',\n password,\n },\n logger,\n commitMessage,\n gitAuthorInfo,\n });\n\n if (protectDefaultBranch) {\n try {\n await enableBranchProtectionOnDefaultRepoBranch({\n owner,\n client,\n repoName: repo,\n logger,\n defaultBranch,\n bypassPullRequestAllowances,\n requiredApprovingReviewCount,\n restrictions,\n requireCodeOwnerReviews,\n requiredStatusCheckContexts,\n requireBranchesToBeUpToDate,\n requiredConversationResolution,\n requireLastPushApproval,\n enforceAdmins,\n dismissStaleReviews,\n requiredCommitSigning,\n requiredLinearHistory,\n });\n } catch (e) {\n assertError(e);\n logger.warn(\n `Skipping: default branch protection on '${repo}', ${e.message}`,\n );\n }\n }\n\n return { commitHash: commitResult.commitHash };\n}\n\nfunction extractCollaboratorName(\n collaborator: { user: string } | { team: string } | { username: string },\n) {\n if ('username' in collaborator) return collaborator.username;\n if ('user' in collaborator) return collaborator.user;\n return collaborator.team;\n}\n\nasync function validateAccessTeam(client: Octokit, access: string) {\n const [org, team_slug] = access.split('/');\n try {\n // Below rule disabled because of a 'getByName' check for a different library\n // incorrectly triggers here.\n // eslint-disable-next-line testing-library/no-await-sync-queries\n await client.rest.teams.getByName({\n org,\n team_slug,\n });\n } catch (e) {\n if (e.response.data.message === 'Not Found') {\n const message = `Received 'Not Found' from the API; one of org:\n ${org} or team: ${team_slug} was not found within GitHub.`;\n throw new NotFoundError(message);\n }\n }\n}\n\nexport function getGitCommitMessage(\n gitCommitMessage: string | undefined,\n config: Config,\n): string | undefined {\n return gitCommitMessage\n ? gitCommitMessage\n : config.getOptionalString('scaffolder.defaultCommitMessage');\n}\n"],"names":["assertError","entityRefToName","Sodium","initRepoAndPush","getRepoSourceDirectory","enableBranchProtectionOnDefaultRepoBranch","NotFoundError"],"mappings":";;;;;;;;;;;AAgCA,eAAsB,0CAAA,CACpB,MAAA,EACA,IAAA,EACA,KAAA,EACA,cAAA,EACA,WAAA,EACA,QAAA,EACA,mBAAA,EACA,gBAAA,EACA,gBAAA,EACA,sBAAA,EACA,wBAAA,EACA,gBAAA,EACA,cAAA,EACA,iBAAA,EACA,MAAA,EACA,aAAA,EAiBA,WAAA,EACA,OAAA,EACA,SAAA,EACA,MAAA,EACA,aAAA,EACA,OAAA,EACA,iBAAA,EAMA,gBAAA,EACA,SAAA,EACA,MAAA,EACA,QAAA,EACA,cAAA,EACA;AACA,EAAA,MAAM,IAAA,GAAO,MAAM,MAAA,CAAO,IAAA,CAAK,MAAM,aAAA,CAAc;AAAA,IACjD,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,IAAI,MAAA,EAAQ,UAAA,CAAW,CAAA,EAAG,KAAK,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,kBAAA,CAAmB,QAAQ,MAAM,CAAA;AAAA,EACzC;AAEA,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,gBAAA,EAAkB,cAAA;AAAA,IAClB,kBAAA,EAAoB,gBAAA;AAAA,IACpB,kBAAA,EAAoB,gBAAA;AAAA,IACpB,kBAAA,EAAoB,gBAAA;AAAA,IACpB,mBAAA,EAAqB,iBAAA;AAAA,IACrB,SAAA,EAAW,QAAA;AAAA,IACX,sBAAA,EAAwB,mBAAA;AAAA,IACxB,WAAA;AAAA,IACA,UAAA,EAAY,SAAA;AAAA,IACZ,YAAA,EAAc,WAAA;AAAA,IACd,QAAA,EAAU,OAAA;AAAA,IACV,QAAA;AAAA,IACA,IAAA,EAAM,IAAA;AAAA,IACN,SAAS,cAAA,KAAmB,SAAA;AAAA,IAC5B,2BAAA,EAA6B,wBAAA;AAAA,IAC7B,yBAAA,EAA2B;AAAA,GAC7B;AACA,EAAA,MAAM,mBAAA,GACJ,KAAK,IAAA,CAAK,IAAA,KAAS,iBACf,MAAA,CAAO,IAAA,CAAK,MAAM,WAAA,CAAY;AAAA,IAC5B,GAAG,cAAA;AAAA;AAAA,IAEH,iBAAA,EAAmB,gBAAA;AAAA,IACnB,GAAA,EAAK,KAAA;AAAA;AAAA,IAEL,UAAA,EAAY;AAAA,GACb,CAAA,GACD,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,2BAA2B,cAAc,CAAA;AAEjE,EAAA,IAAI,OAAA;AAEJ,EAAA,IAAI;AACF,IAAA,OAAA,GAAA,CAAW,MAAM,mBAAA,EAAqB,IAAA;AAAA,EACxC,SAAS,CAAA,EAAG;AACV,IAAAA,kBAAA,CAAY,CAAC,CAAA;AACb,IAAA,IAAI,CAAA,CAAE,YAAY,wCAAA,EAA0C;AAC1D,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,wFAAwF,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,YAAA,EAAe,KAAK,IAAI,IAAI,CAAA,CAAA;AAAA,OACpI;AAAA,IACF;AACA,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,qBAAA,EAAwB,IAAA,CAAK,IAAA,CAAK,IAAI,CAAA,YAAA,EAAe,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA;AAAA,KAClF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,EAAQ,UAAA,CAAW,CAAA,EAAG,KAAK,GAAG,CAAA,EAAG;AACnC,IAAA,MAAM,GAAG,IAAI,CAAA,GAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AACjC,IAAA,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,+BAAA,CAAgC;AAAA,MACtD,GAAA,EAAK,KAAA;AAAA,MACL,SAAA,EAAW,IAAA;AAAA,MACX,KAAA;AAAA,MACA,IAAA;AAAA,MACA,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EAEH,CAAA,MAAA,IAAW,MAAA,IAAU,MAAA,KAAW,KAAA,EAAO;AACrC,IAAA,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB;AAAA,MACtC,KAAA;AAAA,MACA,IAAA;AAAA,MACA,QAAA,EAAU,MAAA;AAAA,MACV,UAAA,EAAY;AAAA,KACb,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,KAAA,MAAW,gBAAgB,aAAA,EAAe;AACxC,MAAA,IAAI;AACF,QAAA,IAAI,UAAU,YAAA,EAAc;AAC1B,UAAA,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,eAAA,CAAgB;AAAA,YACtC,KAAA;AAAA,YACA,IAAA;AAAA,YACA,QAAA,EAAUC,0BAAA,CAAgB,YAAA,CAAa,IAAI,CAAA;AAAA,YAC3C,YAAY,YAAA,CAAa;AAAA,WAC1B,CAAA;AAAA,QACH,CAAA,MAAA,IAAW,UAAU,YAAA,EAAc;AACjC,UAAA,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,+BAAA,CAAgC;AAAA,YACtD,GAAA,EAAK,KAAA;AAAA,YACL,SAAA,EAAWA,0BAAA,CAAgB,YAAA,CAAa,IAAI,CAAA;AAAA,YAC5C,KAAA;AAAA,YACA,IAAA;AAAA,YACA,YAAY,YAAA,CAAa;AAAA,WAC1B,CAAA;AAAA,QACH;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAAD,kBAAA,CAAY,CAAC,CAAA;AACb,QAAA,MAAM,IAAA,GAAO,wBAAwB,YAAY,CAAA;AACjD,QAAA,MAAA,CAAO,IAAA;AAAA,UACL,YAAY,YAAA,CAAa,MAAM,eAAe,IAAI,CAAA,EAAA,EAAK,EAAE,OAAO,CAAA;AAAA,SAClE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,gBAAA,CAAiB;AAAA,QACvC,KAAA;AAAA,QACA,IAAA;AAAA,QACA,OAAO,MAAA,CAAO,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,aAAa;AAAA,OACvC,CAAA;AAAA,IACH,SAAS,CAAA,EAAG;AACV,MAAAA,kBAAA,CAAY,CAAC,CAAA;AACb,MAAA,MAAA,CAAO,IAAA,CAAK,mBAAmB,MAAA,CAAO,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAAA,IACjE;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,aAAA,IAAiB,EAAE,CAAA,EAAG;AAC9D,IAAA,MAAM,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,kBAAA,CAAmB;AAAA,MAC3C,KAAA;AAAA,MACA,IAAA;AAAA,MACA,IAAA,EAAM,GAAA;AAAA,MACN;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,OAAA,EAAS;AACX,IAAA,MAAM,iBAAA,GAAoB,MAAM,MAAA,CAAO,IAAA,CAAK,QAAQ,gBAAA,CAAiB;AAAA,MACnE,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,MAAME,uBAAA,CAAO,KAAA;AACb,IAAA,MAAM,YAAYA,uBAAA,CAAO,WAAA;AAAA,MACvB,kBAAkB,IAAA,CAAK,GAAA;AAAA,MACvBA,wBAAO,eAAA,CAAgB;AAAA,KACzB;AACA,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,MAAA,MAAM,YAAA,GAAeA,uBAAA,CAAO,WAAA,CAAY,KAAK,CAAA;AAC7C,MAAA,MAAM,wBAAwBA,uBAAA,CAAO,eAAA;AAAA,QACnC,YAAA;AAAA,QACA;AAAA,OACF;AACA,MAAA,MAAM,wBAAwBA,uBAAA,CAAO,SAAA;AAAA,QACnC,qBAAA;AAAA,QACAA,wBAAO,eAAA,CAAgB;AAAA,OACzB;AAEA,MAAA,MAAM,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,wBAAA,CAAyB;AAAA,QACjD,KAAA;AAAA,QACA,IAAA;AAAA,QACA,WAAA,EAAa,GAAA;AAAA,QACb,eAAA,EAAiB,qBAAA;AAAA,QACjB,MAAA,EAAQ,kBAAkB,IAAA,CAAK;AAAA,OAChC,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,IAAI,iBAAA,EAAmB;AACrB,IAAA,MAAM,MAAA,CAAO,OAAA;AAAA,MACX,0DAAA;AAAA,MACA;AAAA,QACE,KAAA;AAAA,QACA,IAAA;AAAA,QACA,aAAa,iBAAA,CAAkB,UAAA;AAAA,QAC/B,oBAAoB,iBAAA,CAAkB;AAAA;AACxC,KACF;AAAA,EACF;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,MAAM,MAAA,CAAO,IAAA,CAAK,QAAA,CAAS,mBAAA,CAAoB;AAAA,MAC7C,UAAA,EAAY,IAAA;AAAA,MACZ,OAAA,EAAS,KAAA;AAAA,MACT,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,cAAA,EAAgB;AAClB,IAAA,MAAM,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,6BAAA,CAA8B;AAAA,MACtD,YAAA,EAAc,cAAA;AAAA,MACd,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,OAAA;AACT;AAEA,eAAsB,sBAAA,CACpB,SAAA,EACA,QAAA,EACA,aAAA,EACA,UAAA,EACA,aAAA,EACA,oBAAA,EACA,aAAA,EACA,KAAA,EACA,MAAA,EACA,IAAA,EACA,uBAAA,EACA,2BAAA,EAOA,8BACA,YAAA,EAOA,2BAAA,EACA,2BAAA,EACA,8BAAA,EACA,uBAAA,EACA,MAAA,EACA,MAAA,EACA,gBAAA,EACA,aAAA,EACA,cAAA,EACA,mBAAA,EACA,qBAAA,EACA,qBAAA,EACiC;AACjC,EAAA,MAAM,aAAA,GAAgB;AAAA,IACpB,IAAA,EAAM,aAAA,GACF,aAAA,GACA,MAAA,CAAO,kBAAkB,+BAA+B,CAAA;AAAA,IAC5D,KAAA,EAAO,cAAA,GACH,cAAA,GACA,MAAA,CAAO,kBAAkB,gCAAgC;AAAA,GAC/D;AAEA,EAAA,MAAM,aAAA,GACJ,mBAAA,CAAoB,gBAAA,EAAkB,MAAM,CAAA,IAAK,gBAAA;AAEnD,EAAA,MAAM,YAAA,GAAe,MAAMC,oCAAA,CAAgB;AAAA,IACzC,GAAA,EAAKC,2CAAA,CAAuB,aAAA,EAAe,UAAU,CAAA;AAAA,IACrD,SAAA;AAAA,IACA,aAAA;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,QAAA,EAAU,gBAAA;AAAA,MACV;AAAA,KACF;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,IAAI,oBAAA,EAAsB;AACxB,IAAA,IAAI;AACF,MAAA,MAAMC,oDAAA,CAA0C;AAAA,QAC9C,KAAA;AAAA,QACA,MAAA;AAAA,QACA,QAAA,EAAU,IAAA;AAAA,QACV,MAAA;AAAA,QACA,aAAA;AAAA,QACA,2BAAA;AAAA,QACA,4BAAA;AAAA,QACA,YAAA;AAAA,QACA,uBAAA;AAAA,QACA,2BAAA;AAAA,QACA,2BAAA;AAAA,QACA,8BAAA;AAAA,QACA,uBAAA;AAAA,QACA,aAAA;AAAA,QACA,mBAAA;AAAA,QACA,qBAAA;AAAA,QACA;AAAA,OACD,CAAA;AAAA,IACH,SAAS,CAAA,EAAG;AACV,MAAAL,kBAAA,CAAY,CAAC,CAAA;AACb,MAAA,MAAA,CAAO,IAAA;AAAA,QACL,CAAA,wCAAA,EAA2C,IAAI,CAAA,GAAA,EAAM,CAAA,CAAE,OAAO,CAAA;AAAA,OAChE;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,UAAA,EAAY,YAAA,CAAa,UAAA,EAAW;AAC/C;AAEA,SAAS,wBACP,YAAA,EACA;AACA,EAAA,IAAI,UAAA,IAAc,YAAA,EAAc,OAAO,YAAA,CAAa,QAAA;AACpD,EAAA,IAAI,MAAA,IAAU,YAAA,EAAc,OAAO,YAAA,CAAa,IAAA;AAChD,EAAA,OAAO,YAAA,CAAa,IAAA;AACtB;AAEA,eAAe,kBAAA,CAAmB,QAAiB,MAAA,EAAgB;AACjE,EAAA,MAAM,CAAC,GAAA,EAAK,SAAS,CAAA,GAAI,MAAA,CAAO,MAAM,GAAG,CAAA;AACzC,EAAA,IAAI;AAIF,IAAA,MAAM,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU;AAAA,MAChC,GAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH,SAAS,CAAA,EAAG;AACV,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,OAAA,KAAY,WAAA,EAAa;AAC3C,MAAA,MAAM,OAAA,GAAU,CAAA;AAAA,QAAA,EACZ,GAAG,aAAa,SAAS,CAAA,6BAAA,CAAA;AAC7B,MAAA,MAAM,IAAIM,qBAAc,OAAO,CAAA;AAAA,IACjC;AAAA,EACF;AACF;AAEO,SAAS,mBAAA,CACd,kBACA,MAAA,EACoB;AACpB,EAAA,OAAO,gBAAA,GACH,gBAAA,GACA,MAAA,CAAO,iBAAA,CAAkB,iCAAiC,CAAA;AAChE;;;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-scaffolder-backend-module-github",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.5-next.0",
|
|
4
4
|
"description": "The github module for @backstage/plugin-scaffolder-backend",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "backend-plugin-module",
|
|
@@ -50,25 +50,25 @@
|
|
|
50
50
|
"test": "backstage-cli package test"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@backstage/backend-plugin-api": "
|
|
54
|
-
"@backstage/catalog-model": "
|
|
55
|
-
"@backstage/config": "
|
|
56
|
-
"@backstage/errors": "
|
|
57
|
-
"@backstage/integration": "
|
|
58
|
-
"@backstage/plugin-catalog-node": "
|
|
59
|
-
"@backstage/plugin-scaffolder-node": "
|
|
60
|
-
"@backstage/types": "
|
|
53
|
+
"@backstage/backend-plugin-api": "1.7.0-next.0",
|
|
54
|
+
"@backstage/catalog-model": "1.7.6",
|
|
55
|
+
"@backstage/config": "1.3.6",
|
|
56
|
+
"@backstage/errors": "1.2.7",
|
|
57
|
+
"@backstage/integration": "1.19.3-next.0",
|
|
58
|
+
"@backstage/plugin-catalog-node": "1.21.0-next.0",
|
|
59
|
+
"@backstage/plugin-scaffolder-node": "0.12.4-next.0",
|
|
60
|
+
"@backstage/types": "1.2.2",
|
|
61
61
|
"@octokit/webhooks": "^10.9.2",
|
|
62
62
|
"libsodium-wrappers": "^0.7.11",
|
|
63
63
|
"octokit": "^3.0.0",
|
|
64
64
|
"octokit-plugin-create-pull-request": "^5.0.0",
|
|
65
65
|
"yaml": "^2.0.0",
|
|
66
|
-
"zod": "^3.
|
|
66
|
+
"zod": "^3.25.76"
|
|
67
67
|
},
|
|
68
68
|
"devDependencies": {
|
|
69
|
-
"@backstage/backend-test-utils": "
|
|
70
|
-
"@backstage/cli": "
|
|
71
|
-
"@backstage/plugin-scaffolder-node-test-utils": "
|
|
69
|
+
"@backstage/backend-test-utils": "1.10.4-next.0",
|
|
70
|
+
"@backstage/cli": "0.35.3-next.0",
|
|
71
|
+
"@backstage/plugin-scaffolder-node-test-utils": "0.3.8-next.0",
|
|
72
72
|
"@types/libsodium-wrappers": "^0.7.10",
|
|
73
73
|
"fs-extra": "^11.2.0",
|
|
74
74
|
"jsonschema": "^1.2.6"
|