@backstage/plugin-scaffolder-backend-module-gitlab 0.6.1 → 0.7.0-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,21 @@
1
1
  # @backstage/plugin-scaffolder-backend-module-gitlab
2
2
 
3
+ ## 0.7.0-next.0
4
+
5
+ ### Minor Changes
6
+
7
+ - c4ffd13: Added the autocomplete feature to GitlabRepoUrlPicker
8
+ - 32459d0: **BREAKING**: Upgraded the `gitbeaker` library to version 41. As part of this, the `scopes` parameter to the `gitlab:projectDeployToken:create` is no longer optional, so you will have to pass it a value (for example `['read_repository']`).
9
+
10
+ ### Patch Changes
11
+
12
+ - Updated dependencies
13
+ - @backstage/integration@1.16.0-next.0
14
+ - @backstage/backend-plugin-api@1.0.3-next.0
15
+ - @backstage/plugin-scaffolder-node@0.6.1-next.0
16
+ - @backstage/config@1.3.0
17
+ - @backstage/errors@1.2.5
18
+
3
19
  ## 0.6.1
4
20
 
5
21
  ### Patch Changes
@@ -2,7 +2,7 @@
2
2
 
3
3
  var errors = require('@backstage/errors');
4
4
  var pluginScaffolderNode = require('@backstage/plugin-scaffolder-node');
5
- var node = require('@gitbeaker/node');
5
+ var rest = require('@gitbeaker/rest');
6
6
  var gitlab_examples = require('./gitlab.examples.cjs.js');
7
7
 
8
8
  function createPublishGitlabAction(options) {
@@ -269,7 +269,7 @@ function createPublishGitlabAction(options) {
269
269
  }
270
270
  const token = ctx.input.token || integrationConfig.config.token;
271
271
  const tokenType = ctx.input.token ? "oauthToken" : "token";
272
- const client = new node.Gitlab({
272
+ const client = new rest.Gitlab({
273
273
  host: integrationConfig.config.baseUrl,
274
274
  [tokenType]: token
275
275
  });
@@ -285,19 +285,19 @@ function createPublishGitlabAction(options) {
285
285
  }
286
286
  throw e;
287
287
  }
288
- const { id: userId } = await client.Users.current();
288
+ const { id: userId } = await client.Users.showCurrentUser();
289
289
  if (!targetNamespaceId) {
290
290
  targetNamespaceId = userId;
291
291
  }
292
292
  const { id: projectId, http_url_to_repo } = await client.Projects.create({
293
- namespace_id: targetNamespaceId,
293
+ namespaceId: targetNamespaceId,
294
294
  name: repo,
295
295
  visibility: repoVisibility,
296
296
  ...topics.length ? { topics } : {},
297
297
  ...Object.keys(settings).length ? { ...settings } : {}
298
298
  });
299
299
  if (setUserAsOwner && integrationConfig.config.token) {
300
- const adminClient = new node.Gitlab({
300
+ const adminClient = new rest.Gitlab({
301
301
  host: integrationConfig.config.baseUrl,
302
302
  token: integrationConfig.config.token
303
303
  });
@@ -365,7 +365,16 @@ function createPublishGitlabAction(options) {
365
365
  try {
366
366
  await client.ProjectVariables.create(
367
367
  projectId,
368
- variableWithDefaults
368
+ variableWithDefaults.key,
369
+ variableWithDefaults.value,
370
+ {
371
+ variableType: variableWithDefaults.variable_type,
372
+ protected: variableWithDefaults.protected,
373
+ masked: variableWithDefaults.masked,
374
+ environmentScope: variableWithDefaults.environment_scope,
375
+ description: variableWithDefaults.description,
376
+ raw: variableWithDefaults.raw
377
+ }
369
378
  );
370
379
  } catch (e) {
371
380
  throw new errors.InputError(
@@ -1 +1 @@
1
- {"version":3,"file":"gitlab.cjs.js","sources":["../../src/actions/gitlab.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 { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { Gitlab } from '@gitbeaker/node';\nimport {\n initRepoAndPush,\n getRepoSourceDirectory,\n parseRepoUrl,\n} from '@backstage/plugin-scaffolder-node';\nimport { Config } from '@backstage/config';\nimport { examples } from './gitlab.examples';\n\n/**\n * Creates a new action that initializes a git repository of the content in the workspace\n * and publishes it to GitLab.\n *\n * @public\n */\nexport function createPublishGitlabAction(options: {\n integrations: ScmIntegrationRegistry;\n config: Config;\n}) {\n const { integrations, config } = options;\n\n return createTemplateAction<{\n repoUrl: string;\n defaultBranch?: string;\n /** @deprecated in favour of settings.visibility field */\n repoVisibility?: 'private' | 'internal' | 'public';\n sourcePath?: string;\n token?: string;\n gitCommitMessage?: string;\n gitAuthorName?: string;\n gitAuthorEmail?: string;\n setUserAsOwner?: boolean;\n /** @deprecated in favour of settings.topics field */\n topics?: string[];\n settings?: {\n path?: string;\n auto_devops_enabled?: boolean;\n ci_config_path?: string;\n description?: string;\n merge_method?: 'merge' | 'rebase_merge' | 'ff';\n squash_option?: 'default_off' | 'default_on' | 'never' | 'always';\n topics?: string[];\n visibility?: 'private' | 'internal' | 'public';\n only_allow_merge_if_all_discussions_are_resolved?: boolean;\n only_allow_merge_if_pipeline_succeeds?: boolean;\n allow_merge_on_skipped_pipeline?: boolean;\n };\n branches?: Array<{\n name: string;\n protect?: boolean;\n create?: boolean;\n ref?: string;\n }>;\n projectVariables?: Array<{\n key: string;\n value: string;\n description?: string;\n variable_type?: string;\n protected?: boolean;\n masked?: boolean;\n raw?: boolean;\n environment_scope?: string;\n }>;\n }>({\n id: 'publish:gitlab',\n description:\n 'Initializes a git repository of the content in the workspace, and publishes it to GitLab.',\n examples,\n schema: {\n input: {\n type: 'object',\n required: ['repoUrl'],\n properties: {\n repoUrl: {\n title: 'Repository Location',\n type: 'string',\n description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`,\n },\n repoVisibility: {\n title: 'Repository Visibility',\n description: `Sets the visibility of the repository. The default value is 'private'. (deprecated, use settings.visibility instead)`,\n type: 'string',\n enum: ['private', 'public', 'internal'],\n },\n defaultBranch: {\n title: 'Default Branch',\n type: 'string',\n description: `Sets the default branch on the repository. The default value is 'master'`,\n },\n gitCommitMessage: {\n title: 'Git Commit Message',\n type: 'string',\n description: `Sets the commit message on the repository. The default value is 'initial commit'`,\n },\n gitAuthorName: {\n title: 'Default Author Name',\n type: 'string',\n description: `Sets the default author name for the commit. The default value is 'Scaffolder'`,\n },\n gitAuthorEmail: {\n title: 'Default Author Email',\n type: 'string',\n description: `Sets the default author email for the commit.`,\n },\n sourcePath: {\n title: 'Source Path',\n description:\n 'Path within the workspace that will be used as the repository root. If omitted, the entire workspace will be published as the repository.',\n type: 'string',\n },\n token: {\n title: 'Authentication Token',\n type: 'string',\n description: 'The token to use for authorization to GitLab',\n },\n setUserAsOwner: {\n title: 'Set User As Owner',\n type: 'boolean',\n description:\n 'Set the token user as owner of the newly created repository. Requires a token authorized to do the edit in the integration configuration for the matching host',\n },\n topics: {\n title: 'Topic labels',\n description:\n 'Topic labels to apply on the repository. (deprecated, use settings.topics instead)',\n type: 'array',\n items: {\n type: 'string',\n },\n },\n settings: {\n title: 'Project settings',\n description:\n 'Additional project settings, based on https://docs.gitlab.com/ee/api/projects.html#create-project attributes',\n type: 'object',\n properties: {\n path: {\n title: 'Project path',\n description:\n 'Repository name for new project. Generated based on name if not provided (generated as lowercase with dashes).',\n type: 'string',\n },\n auto_devops_enabled: {\n title: 'Auto DevOps enabled',\n description: 'Enable Auto DevOps for this project',\n type: 'boolean',\n },\n ci_config_path: {\n title: 'CI config path',\n description: 'Custom CI config path for this project',\n type: 'string',\n },\n description: {\n title: 'Project description',\n description: 'Short project description',\n type: 'string',\n },\n merge_method: {\n title: 'Merge Method to use',\n description: 'Merge Methods (merge, rebase_merge, ff)',\n type: 'string',\n enum: ['merge', 'rebase_merge', 'ff'],\n },\n squash_option: {\n title: 'Squash option',\n description:\n 'Set squash option for the project (never, always, default_on, default_off)',\n type: 'string',\n enum: ['default_off', 'default_on', 'never', 'always'],\n },\n topics: {\n title: 'Topic labels',\n description: 'Topic labels to apply on the repository',\n type: 'array',\n items: {\n type: 'string',\n },\n },\n visibility: {\n title: 'Project visibility',\n description:\n 'The visibility of the project. Can be private, internal, or public. The default value is private.',\n type: 'string',\n enum: ['private', 'public', 'internal'],\n },\n only_allow_merge_if_all_discussions_are_resolved: {\n title: 'All threads must be resolved',\n description:\n 'Set whether merge requests can only be merged when all the discussions are resolved.',\n type: 'boolean',\n },\n only_allow_merge_if_pipeline_succeeds: {\n title: 'Pipelines must succeed',\n description:\n 'Set whether merge requests can only be merged with successful pipelines. This setting is named Pipelines must succeed in the project settings.',\n type: 'boolean',\n },\n allow_merge_on_skipped_pipeline: {\n title: 'Skipped pipelines are considered successful',\n description:\n 'Set whether or not merge requests can be merged with skipped jobs.',\n type: 'boolean',\n },\n },\n },\n branches: {\n title: 'Project branches settings',\n type: 'array',\n items: {\n type: 'object',\n required: ['name'],\n properties: {\n name: {\n title: 'Branch name',\n type: 'string',\n },\n protect: {\n title: 'Should branch be protected',\n description: `Will mark branch as protected. The default value is 'false'`,\n type: 'boolean',\n },\n create: {\n title: 'Should branch be created',\n description: `If branch does not exist, it will be created from provided ref. The default value is 'false'`,\n type: 'boolean',\n },\n ref: {\n title: 'Branch reference',\n description: `Branch reference to create branch from. The default value is 'master'`,\n type: 'string',\n },\n },\n },\n },\n projectVariables: {\n title: 'Project variables',\n description:\n 'Project variables settings based on Gitlab Project Environments API - https://docs.gitlab.com/ee/api/project_level_variables.html#create-a-variable',\n type: 'array',\n items: {\n type: 'object',\n required: ['key', 'value'],\n properties: {\n key: {\n title: 'Variable key',\n description:\n 'The key of a variable; must have no more than 255 characters; only A-Z, a-z, 0-9, and _ are allowed',\n type: 'string',\n },\n value: {\n title: 'Variable value',\n description: 'The value of a variable',\n type: 'string',\n },\n description: {\n title: 'Variable description',\n description: `The description of the variable. The default value is 'null'`,\n type: 'string',\n },\n variable_type: {\n title: 'Variable type',\n description: `The type of a variable. The default value is 'env_var'`,\n type: 'string',\n enum: ['env_var', 'file'],\n },\n protected: {\n title: 'Variable protection',\n description: `Whether the variable is protected. The default value is 'false'`,\n type: 'boolean',\n },\n raw: {\n title: 'Variable raw',\n description: `Whether the variable is in raw format. The default value is 'false'`,\n type: 'boolean',\n },\n environment_scope: {\n title: 'Variable environment scope',\n description: `The environment_scope of the variable. The default value is '*'`,\n type: 'string',\n },\n },\n },\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n remoteUrl: {\n title: 'A URL to the repository with the provider',\n type: 'string',\n },\n repoContentsUrl: {\n title: 'A URL to the root of the repository',\n type: 'string',\n },\n projectId: {\n title: 'The ID of the project',\n type: 'number',\n },\n commitHash: {\n title: 'The git commit hash of the initial commit',\n type: 'string',\n },\n },\n },\n },\n async handler(ctx) {\n const {\n repoUrl,\n repoVisibility = 'private',\n defaultBranch = 'master',\n gitCommitMessage = 'initial commit',\n gitAuthorName,\n gitAuthorEmail,\n setUserAsOwner = false,\n topics = [],\n settings = {},\n branches = [],\n projectVariables = [],\n } = ctx.input;\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 integrationConfig = integrations.gitlab.byHost(host);\n\n if (!integrationConfig) {\n throw new InputError(\n `No matching integration configuration for host ${host}, please check your integrations config`,\n );\n }\n\n if (!integrationConfig.config.token && !ctx.input.token) {\n throw new InputError(`No token available for host ${host}`);\n }\n\n const token = ctx.input.token || integrationConfig.config.token!;\n const tokenType = ctx.input.token ? 'oauthToken' : 'token';\n\n const client = new Gitlab({\n host: integrationConfig.config.baseUrl,\n [tokenType]: token,\n });\n\n let targetNamespaceId;\n\n try {\n const namespaceResponse = (await client.Namespaces.show(owner)) as {\n id: number;\n };\n\n targetNamespaceId = namespaceResponse.id;\n } catch (e) {\n if (e.response && e.response.statusCode === 404) {\n throw new InputError(\n `The namespace ${owner} is not found or the user doesn't have permissions to access it`,\n );\n }\n throw e;\n }\n\n const { id: userId } = (await client.Users.current()) as {\n id: number;\n };\n\n if (!targetNamespaceId) {\n targetNamespaceId = userId;\n }\n\n const { id: projectId, http_url_to_repo } = await client.Projects.create({\n namespace_id: targetNamespaceId,\n name: repo,\n visibility: repoVisibility,\n ...(topics.length ? { topics } : {}),\n ...(Object.keys(settings).length ? { ...settings } : {}),\n });\n\n // When setUserAsOwner is true the input token is expected to come from an unprivileged user GitLab\n // OAuth flow. In this case GitLab works in a way that allows the unprivileged user to\n // create the repository, but not to push the default protected branch (e.g. master).\n // In order to set the user as owner of the newly created repository we need to check that the\n // GitLab integration configuration for the matching host contains a token and use\n // such token to bootstrap a new privileged client.\n if (setUserAsOwner && integrationConfig.config.token) {\n const adminClient = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: integrationConfig.config.token,\n });\n\n await adminClient.ProjectMembers.add(projectId, userId, 50);\n }\n\n const remoteUrl = (http_url_to_repo as string).replace(/\\.git$/, '');\n const repoContentsUrl = `${remoteUrl}/-/blob/${defaultBranch}`;\n\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 const commitResult = await initRepoAndPush({\n dir: getRepoSourceDirectory(ctx.workspacePath, ctx.input.sourcePath),\n remoteUrl: http_url_to_repo as string,\n defaultBranch,\n auth: {\n username: 'oauth2',\n password: token,\n },\n logger: ctx.logger,\n commitMessage: gitCommitMessage\n ? gitCommitMessage\n : config.getOptionalString('scaffolder.defaultCommitMessage'),\n gitAuthorInfo,\n });\n\n if (branches) {\n for (const branch of branches) {\n const {\n name,\n protect = false,\n create = false,\n ref = 'master',\n } = branch;\n\n if (create) {\n try {\n await client.Branches.create(projectId, name, ref);\n } catch (e) {\n throw new InputError(\n `Branch creation failed for ${name}. ${printGitlabError(e)}`,\n );\n }\n ctx.logger.info(\n `Branch ${name} created for ${projectId} with ref ${ref}`,\n );\n }\n\n if (protect) {\n try {\n await client.ProtectedBranches.protect(projectId, name);\n } catch (e) {\n throw new InputError(\n `Branch protection failed for ${name}. ${printGitlabError(e)}`,\n );\n }\n ctx.logger.info(`Branch ${name} protected for ${projectId}`);\n }\n }\n }\n\n if (projectVariables) {\n for (const variable of projectVariables) {\n const variableWithDefaults = Object.assign(variable, {\n variable_type: variable.variable_type ?? 'env_var',\n protected: variable.protected ?? false,\n masked: variable.masked ?? false,\n raw: variable.raw ?? false,\n environment_scope: variable.environment_scope ?? '*',\n });\n\n try {\n await client.ProjectVariables.create(\n projectId,\n variableWithDefaults,\n );\n } catch (e) {\n throw new InputError(\n `Environment variable creation failed for ${\n variableWithDefaults.key\n }. ${printGitlabError(e)}`,\n );\n }\n }\n }\n\n ctx.output('commitHash', commitResult?.commitHash);\n ctx.output('remoteUrl', remoteUrl);\n ctx.output('repoContentsUrl', repoContentsUrl);\n ctx.output('projectId', projectId);\n },\n });\n}\n\nfunction printGitlabError(error: any): string {\n return JSON.stringify({ code: error.code, message: error.description });\n}\n"],"names":["createTemplateAction","examples","parseRepoUrl","InputError","Gitlab","initRepoAndPush","getRepoSourceDirectory"],"mappings":"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"}
1
+ {"version":3,"file":"gitlab.cjs.js","sources":["../../src/actions/gitlab.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 { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { Gitlab, VariableType } from '@gitbeaker/rest';\nimport {\n initRepoAndPush,\n getRepoSourceDirectory,\n parseRepoUrl,\n} from '@backstage/plugin-scaffolder-node';\nimport { Config } from '@backstage/config';\nimport { examples } from './gitlab.examples';\n\n/**\n * Creates a new action that initializes a git repository of the content in the workspace\n * and publishes it to GitLab.\n *\n * @public\n */\nexport function createPublishGitlabAction(options: {\n integrations: ScmIntegrationRegistry;\n config: Config;\n}) {\n const { integrations, config } = options;\n\n return createTemplateAction<{\n repoUrl: string;\n defaultBranch?: string;\n /** @deprecated in favour of settings.visibility field */\n repoVisibility?: 'private' | 'internal' | 'public';\n sourcePath?: string;\n token?: string;\n gitCommitMessage?: string;\n gitAuthorName?: string;\n gitAuthorEmail?: string;\n setUserAsOwner?: boolean;\n /** @deprecated in favour of settings.topics field */\n topics?: string[];\n settings?: {\n path?: string;\n auto_devops_enabled?: boolean;\n ci_config_path?: string;\n description?: string;\n merge_method?: 'merge' | 'rebase_merge' | 'ff';\n squash_option?: 'default_off' | 'default_on' | 'never' | 'always';\n topics?: string[];\n visibility?: 'private' | 'internal' | 'public';\n only_allow_merge_if_all_discussions_are_resolved?: boolean;\n only_allow_merge_if_pipeline_succeeds?: boolean;\n allow_merge_on_skipped_pipeline?: boolean;\n };\n branches?: Array<{\n name: string;\n protect?: boolean;\n create?: boolean;\n ref?: string;\n }>;\n projectVariables?: Array<{\n key: string;\n value: string;\n description?: string;\n variable_type?: string;\n protected?: boolean;\n masked?: boolean;\n raw?: boolean;\n environment_scope?: string;\n }>;\n }>({\n id: 'publish:gitlab',\n description:\n 'Initializes a git repository of the content in the workspace, and publishes it to GitLab.',\n examples,\n schema: {\n input: {\n type: 'object',\n required: ['repoUrl'],\n properties: {\n repoUrl: {\n title: 'Repository Location',\n type: 'string',\n description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`,\n },\n repoVisibility: {\n title: 'Repository Visibility',\n description: `Sets the visibility of the repository. The default value is 'private'. (deprecated, use settings.visibility instead)`,\n type: 'string',\n enum: ['private', 'public', 'internal'],\n },\n defaultBranch: {\n title: 'Default Branch',\n type: 'string',\n description: `Sets the default branch on the repository. The default value is 'master'`,\n },\n gitCommitMessage: {\n title: 'Git Commit Message',\n type: 'string',\n description: `Sets the commit message on the repository. The default value is 'initial commit'`,\n },\n gitAuthorName: {\n title: 'Default Author Name',\n type: 'string',\n description: `Sets the default author name for the commit. The default value is 'Scaffolder'`,\n },\n gitAuthorEmail: {\n title: 'Default Author Email',\n type: 'string',\n description: `Sets the default author email for the commit.`,\n },\n sourcePath: {\n title: 'Source Path',\n description:\n 'Path within the workspace that will be used as the repository root. If omitted, the entire workspace will be published as the repository.',\n type: 'string',\n },\n token: {\n title: 'Authentication Token',\n type: 'string',\n description: 'The token to use for authorization to GitLab',\n },\n setUserAsOwner: {\n title: 'Set User As Owner',\n type: 'boolean',\n description:\n 'Set the token user as owner of the newly created repository. Requires a token authorized to do the edit in the integration configuration for the matching host',\n },\n topics: {\n title: 'Topic labels',\n description:\n 'Topic labels to apply on the repository. (deprecated, use settings.topics instead)',\n type: 'array',\n items: {\n type: 'string',\n },\n },\n settings: {\n title: 'Project settings',\n description:\n 'Additional project settings, based on https://docs.gitlab.com/ee/api/projects.html#create-project attributes',\n type: 'object',\n properties: {\n path: {\n title: 'Project path',\n description:\n 'Repository name for new project. Generated based on name if not provided (generated as lowercase with dashes).',\n type: 'string',\n },\n auto_devops_enabled: {\n title: 'Auto DevOps enabled',\n description: 'Enable Auto DevOps for this project',\n type: 'boolean',\n },\n ci_config_path: {\n title: 'CI config path',\n description: 'Custom CI config path for this project',\n type: 'string',\n },\n description: {\n title: 'Project description',\n description: 'Short project description',\n type: 'string',\n },\n merge_method: {\n title: 'Merge Method to use',\n description: 'Merge Methods (merge, rebase_merge, ff)',\n type: 'string',\n enum: ['merge', 'rebase_merge', 'ff'],\n },\n squash_option: {\n title: 'Squash option',\n description:\n 'Set squash option for the project (never, always, default_on, default_off)',\n type: 'string',\n enum: ['default_off', 'default_on', 'never', 'always'],\n },\n topics: {\n title: 'Topic labels',\n description: 'Topic labels to apply on the repository',\n type: 'array',\n items: {\n type: 'string',\n },\n },\n visibility: {\n title: 'Project visibility',\n description:\n 'The visibility of the project. Can be private, internal, or public. The default value is private.',\n type: 'string',\n enum: ['private', 'public', 'internal'],\n },\n only_allow_merge_if_all_discussions_are_resolved: {\n title: 'All threads must be resolved',\n description:\n 'Set whether merge requests can only be merged when all the discussions are resolved.',\n type: 'boolean',\n },\n only_allow_merge_if_pipeline_succeeds: {\n title: 'Pipelines must succeed',\n description:\n 'Set whether merge requests can only be merged with successful pipelines. This setting is named Pipelines must succeed in the project settings.',\n type: 'boolean',\n },\n allow_merge_on_skipped_pipeline: {\n title: 'Skipped pipelines are considered successful',\n description:\n 'Set whether or not merge requests can be merged with skipped jobs.',\n type: 'boolean',\n },\n },\n },\n branches: {\n title: 'Project branches settings',\n type: 'array',\n items: {\n type: 'object',\n required: ['name'],\n properties: {\n name: {\n title: 'Branch name',\n type: 'string',\n },\n protect: {\n title: 'Should branch be protected',\n description: `Will mark branch as protected. The default value is 'false'`,\n type: 'boolean',\n },\n create: {\n title: 'Should branch be created',\n description: `If branch does not exist, it will be created from provided ref. The default value is 'false'`,\n type: 'boolean',\n },\n ref: {\n title: 'Branch reference',\n description: `Branch reference to create branch from. The default value is 'master'`,\n type: 'string',\n },\n },\n },\n },\n projectVariables: {\n title: 'Project variables',\n description:\n 'Project variables settings based on Gitlab Project Environments API - https://docs.gitlab.com/ee/api/project_level_variables.html#create-a-variable',\n type: 'array',\n items: {\n type: 'object',\n required: ['key', 'value'],\n properties: {\n key: {\n title: 'Variable key',\n description:\n 'The key of a variable; must have no more than 255 characters; only A-Z, a-z, 0-9, and _ are allowed',\n type: 'string',\n },\n value: {\n title: 'Variable value',\n description: 'The value of a variable',\n type: 'string',\n },\n description: {\n title: 'Variable description',\n description: `The description of the variable. The default value is 'null'`,\n type: 'string',\n },\n variable_type: {\n title: 'Variable type',\n description: `The type of a variable. The default value is 'env_var'`,\n type: 'string',\n enum: ['env_var', 'file'],\n },\n protected: {\n title: 'Variable protection',\n description: `Whether the variable is protected. The default value is 'false'`,\n type: 'boolean',\n },\n raw: {\n title: 'Variable raw',\n description: `Whether the variable is in raw format. The default value is 'false'`,\n type: 'boolean',\n },\n environment_scope: {\n title: 'Variable environment scope',\n description: `The environment_scope of the variable. The default value is '*'`,\n type: 'string',\n },\n },\n },\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n remoteUrl: {\n title: 'A URL to the repository with the provider',\n type: 'string',\n },\n repoContentsUrl: {\n title: 'A URL to the root of the repository',\n type: 'string',\n },\n projectId: {\n title: 'The ID of the project',\n type: 'number',\n },\n commitHash: {\n title: 'The git commit hash of the initial commit',\n type: 'string',\n },\n },\n },\n },\n async handler(ctx) {\n const {\n repoUrl,\n repoVisibility = 'private',\n defaultBranch = 'master',\n gitCommitMessage = 'initial commit',\n gitAuthorName,\n gitAuthorEmail,\n setUserAsOwner = false,\n topics = [],\n settings = {},\n branches = [],\n projectVariables = [],\n } = ctx.input;\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 integrationConfig = integrations.gitlab.byHost(host);\n\n if (!integrationConfig) {\n throw new InputError(\n `No matching integration configuration for host ${host}, please check your integrations config`,\n );\n }\n\n if (!integrationConfig.config.token && !ctx.input.token) {\n throw new InputError(`No token available for host ${host}`);\n }\n\n const token = ctx.input.token || integrationConfig.config.token!;\n const tokenType = ctx.input.token ? 'oauthToken' : 'token';\n\n const client = new Gitlab({\n host: integrationConfig.config.baseUrl,\n [tokenType]: token,\n });\n\n let targetNamespaceId;\n\n try {\n const namespaceResponse = (await client.Namespaces.show(owner)) as {\n id: number;\n };\n\n targetNamespaceId = namespaceResponse.id;\n } catch (e) {\n if (e.response && e.response.statusCode === 404) {\n throw new InputError(\n `The namespace ${owner} is not found or the user doesn't have permissions to access it`,\n );\n }\n throw e;\n }\n\n const { id: userId } = (await client.Users.showCurrentUser()) as {\n id: number;\n };\n\n if (!targetNamespaceId) {\n targetNamespaceId = userId;\n }\n\n const { id: projectId, http_url_to_repo } = await client.Projects.create({\n namespaceId: targetNamespaceId,\n name: repo,\n visibility: repoVisibility,\n ...(topics.length ? { topics } : {}),\n ...(Object.keys(settings).length ? { ...settings } : {}),\n });\n\n // When setUserAsOwner is true the input token is expected to come from an unprivileged user GitLab\n // OAuth flow. In this case GitLab works in a way that allows the unprivileged user to\n // create the repository, but not to push the default protected branch (e.g. master).\n // In order to set the user as owner of the newly created repository we need to check that the\n // GitLab integration configuration for the matching host contains a token and use\n // such token to bootstrap a new privileged client.\n if (setUserAsOwner && integrationConfig.config.token) {\n const adminClient = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: integrationConfig.config.token,\n });\n\n await adminClient.ProjectMembers.add(projectId, userId, 50);\n }\n\n const remoteUrl = (http_url_to_repo as string).replace(/\\.git$/, '');\n const repoContentsUrl = `${remoteUrl}/-/blob/${defaultBranch}`;\n\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 const commitResult = await initRepoAndPush({\n dir: getRepoSourceDirectory(ctx.workspacePath, ctx.input.sourcePath),\n remoteUrl: http_url_to_repo as string,\n defaultBranch,\n auth: {\n username: 'oauth2',\n password: token,\n },\n logger: ctx.logger,\n commitMessage: gitCommitMessage\n ? gitCommitMessage\n : config.getOptionalString('scaffolder.defaultCommitMessage'),\n gitAuthorInfo,\n });\n\n if (branches) {\n for (const branch of branches) {\n const {\n name,\n protect = false,\n create = false,\n ref = 'master',\n } = branch;\n\n if (create) {\n try {\n await client.Branches.create(projectId, name, ref);\n } catch (e) {\n throw new InputError(\n `Branch creation failed for ${name}. ${printGitlabError(e)}`,\n );\n }\n ctx.logger.info(\n `Branch ${name} created for ${projectId} with ref ${ref}`,\n );\n }\n\n if (protect) {\n try {\n await client.ProtectedBranches.protect(projectId, name);\n } catch (e) {\n throw new InputError(\n `Branch protection failed for ${name}. ${printGitlabError(e)}`,\n );\n }\n ctx.logger.info(`Branch ${name} protected for ${projectId}`);\n }\n }\n }\n\n if (projectVariables) {\n for (const variable of projectVariables) {\n const variableWithDefaults = Object.assign(variable, {\n variable_type: (variable.variable_type ??\n 'env_var') as VariableType,\n protected: variable.protected ?? false,\n masked: variable.masked ?? false,\n raw: variable.raw ?? false,\n environment_scope: variable.environment_scope ?? '*',\n });\n\n try {\n await client.ProjectVariables.create(\n projectId,\n variableWithDefaults.key,\n variableWithDefaults.value,\n {\n variableType: variableWithDefaults.variable_type,\n protected: variableWithDefaults.protected,\n masked: variableWithDefaults.masked,\n environmentScope: variableWithDefaults.environment_scope,\n description: variableWithDefaults.description,\n raw: variableWithDefaults.raw,\n },\n );\n } catch (e) {\n throw new InputError(\n `Environment variable creation failed for ${\n variableWithDefaults.key\n }. ${printGitlabError(e)}`,\n );\n }\n }\n }\n\n ctx.output('commitHash', commitResult?.commitHash);\n ctx.output('remoteUrl', remoteUrl);\n ctx.output('repoContentsUrl', repoContentsUrl);\n ctx.output('projectId', projectId);\n },\n });\n}\n\nfunction printGitlabError(error: any): string {\n return JSON.stringify({ code: error.code, message: error.description });\n}\n"],"names":["createTemplateAction","examples","parseRepoUrl","InputError","Gitlab","initRepoAndPush","getRepoSourceDirectory"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabGroupEnsureExists.cjs.js","sources":["../../src/actions/gitlabGroupEnsureExists.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 { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { GroupSchema } from '@gitbeaker/core/dist/types/resources/Groups';\nimport { z } from 'zod';\nimport commonGitlabConfig from '../commonGitlabConfig';\nimport { getClient, parseRepoUrl } from '../util';\nimport { examples } from './gitlabGroupEnsureExists.examples';\n\n/**\n * Creates an `gitlab:group:ensureExists` Scaffolder action.\n *\n * @public\n */\nexport const createGitlabGroupEnsureExistsAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n\n return createTemplateAction({\n id: 'gitlab:group:ensureExists',\n description: 'Ensures a Gitlab group exists',\n supportsDryRun: true,\n examples,\n schema: {\n input: commonGitlabConfig.merge(\n z.object({\n path: z\n .array(z.string(), {\n description: 'A path of group names that is ensured to exist',\n })\n .min(1),\n }),\n ),\n output: z.object({\n groupId: z\n .number({ description: 'The id of the innermost sub-group' })\n .optional(),\n }),\n },\n async handler(ctx) {\n if (ctx.isDryRun) {\n ctx.output('groupId', 42);\n return;\n }\n\n const { token, repoUrl, path } = ctx.input;\n\n const { host } = parseRepoUrl(repoUrl, integrations);\n\n const api = getClient({ host, integrations, token });\n\n let currentPath: string | null = null;\n let parentId: number | null = null;\n for (const pathElement of path) {\n const fullPath: string = currentPath\n ? `${currentPath}/${pathElement}`\n : pathElement;\n const result = (await api.Groups.search(\n fullPath,\n )) as unknown as Array<GroupSchema>; // recast since the return type for search is wrong in the gitbeaker typings\n const subGroup = result.find(\n searchPathElem => searchPathElem.full_path === fullPath,\n );\n if (!subGroup) {\n ctx.logger.info(`creating missing group ${fullPath}`);\n parentId = (\n await api.Groups.create(\n pathElement,\n pathElement,\n parentId\n ? {\n parentId: parentId,\n }\n : {},\n )\n )?.id;\n } else {\n parentId = subGroup.id;\n }\n currentPath = fullPath;\n }\n if (parentId !== null) {\n ctx.output('groupId', parentId);\n }\n },\n });\n};\n"],"names":["createTemplateAction","examples","commonGitlabConfig","z","parseRepoUrl","getClient"],"mappings":";;;;;;;;AA6Ba,MAAA,mCAAA,GAAsC,CAAC,OAE9C,KAAA;AACJ,EAAM,MAAA,EAAE,cAAiB,GAAA,OAAA;AAEzB,EAAA,OAAOA,yCAAqB,CAAA;AAAA,IAC1B,EAAI,EAAA,2BAAA;AAAA,IACJ,WAAa,EAAA,+BAAA;AAAA,IACb,cAAgB,EAAA,IAAA;AAAA,cAChBC,yCAAA;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,OAAOC,0BAAmB,CAAA,KAAA;AAAA,QACxBC,MAAE,MAAO,CAAA;AAAA,UACP,IAAM,EAAAA,KAAA,CACH,KAAM,CAAAA,KAAA,CAAE,QAAU,EAAA;AAAA,YACjB,WAAa,EAAA;AAAA,WACd,CACA,CAAA,GAAA,CAAI,CAAC;AAAA,SACT;AAAA,OACH;AAAA,MACA,MAAA,EAAQA,MAAE,MAAO,CAAA;AAAA,QACf,OAAA,EAASA,MACN,MAAO,CAAA,EAAE,aAAa,mCAAoC,EAAC,EAC3D,QAAS;AAAA,OACb;AAAA,KACH;AAAA,IACA,MAAM,QAAQ,GAAK,EAAA;AACjB,MAAA,IAAI,IAAI,QAAU,EAAA;AAChB,QAAI,GAAA,CAAA,MAAA,CAAO,WAAW,EAAE,CAAA;AACxB,QAAA;AAAA;AAGF,MAAA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,IAAA,KAAS,GAAI,CAAA,KAAA;AAErC,MAAA,MAAM,EAAE,IAAA,EAAS,GAAAC,iBAAA,CAAa,SAAS,YAAY,CAAA;AAEnD,MAAA,MAAM,MAAMC,cAAU,CAAA,EAAE,IAAM,EAAA,YAAA,EAAc,OAAO,CAAA;AAEnD,MAAA,IAAI,WAA6B,GAAA,IAAA;AACjC,MAAA,IAAI,QAA0B,GAAA,IAAA;AAC9B,MAAA,KAAA,MAAW,eAAe,IAAM,EAAA;AAC9B,QAAA,MAAM,WAAmB,WACrB,GAAA,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,WAAW,CAC7B,CAAA,GAAA,WAAA;AACJ,QAAM,MAAA,MAAA,GAAU,MAAM,GAAA,CAAI,MAAO,CAAA,MAAA;AAAA,UAC/B;AAAA,SACF;AACA,QAAA,MAAM,WAAW,MAAO,CAAA,IAAA;AAAA,UACtB,CAAA,cAAA,KAAkB,eAAe,SAAc,KAAA;AAAA,SACjD;AACA,QAAA,IAAI,CAAC,QAAU,EAAA;AACb,UAAA,GAAA,CAAI,MAAO,CAAA,IAAA,CAAK,CAA0B,uBAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AACpD,UACE,QAAA,GAAA,CAAA,MAAM,IAAI,MAAO,CAAA,MAAA;AAAA,YACf,WAAA;AAAA,YACA,WAAA;AAAA,YACA,QACI,GAAA;AAAA,cACE;AAAA,gBAEF;AAAC,WAEN,GAAA,EAAA;AAAA,SACE,MAAA;AACL,UAAA,QAAA,GAAW,QAAS,CAAA,EAAA;AAAA;AAEtB,QAAc,WAAA,GAAA,QAAA;AAAA;AAEhB,MAAA,IAAI,aAAa,IAAM,EAAA;AACrB,QAAI,GAAA,CAAA,MAAA,CAAO,WAAW,QAAQ,CAAA;AAAA;AAChC;AACF,GACD,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"gitlabGroupEnsureExists.cjs.js","sources":["../../src/actions/gitlabGroupEnsureExists.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 { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { GroupSchema } from '@gitbeaker/rest';\nimport { z } from 'zod';\nimport commonGitlabConfig from '../commonGitlabConfig';\nimport { getClient, parseRepoUrl } from '../util';\nimport { examples } from './gitlabGroupEnsureExists.examples';\n\n/**\n * Creates an `gitlab:group:ensureExists` Scaffolder action.\n *\n * @public\n */\nexport const createGitlabGroupEnsureExistsAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n\n return createTemplateAction({\n id: 'gitlab:group:ensureExists',\n description: 'Ensures a Gitlab group exists',\n supportsDryRun: true,\n examples,\n schema: {\n input: commonGitlabConfig.merge(\n z.object({\n path: z\n .array(z.string(), {\n description: 'A path of group names that is ensured to exist',\n })\n .min(1),\n }),\n ),\n output: z.object({\n groupId: z\n .number({ description: 'The id of the innermost sub-group' })\n .optional(),\n }),\n },\n async handler(ctx) {\n if (ctx.isDryRun) {\n ctx.output('groupId', 42);\n return;\n }\n\n const { token, repoUrl, path } = ctx.input;\n\n const { host } = parseRepoUrl(repoUrl, integrations);\n\n const api = getClient({ host, integrations, token });\n\n let currentPath: string | null = null;\n let parentId: number | null = null;\n for (const pathElement of path) {\n const fullPath: string = currentPath\n ? `${currentPath}/${pathElement}`\n : pathElement;\n const result = (await api.Groups.search(\n fullPath,\n )) as unknown as Array<GroupSchema>; // recast since the return type for search is wrong in the gitbeaker typings\n const subGroup = result.find(\n searchPathElem => searchPathElem.full_path === fullPath,\n );\n if (!subGroup) {\n ctx.logger.info(`creating missing group ${fullPath}`);\n parentId = (\n await api.Groups.create(\n pathElement,\n pathElement,\n parentId\n ? {\n parentId: parentId,\n }\n : {},\n )\n )?.id;\n } else {\n parentId = subGroup.id;\n }\n currentPath = fullPath;\n }\n if (parentId !== null) {\n ctx.output('groupId', parentId);\n }\n },\n });\n};\n"],"names":["createTemplateAction","examples","commonGitlabConfig","z","parseRepoUrl","getClient"],"mappings":";;;;;;;;AA6Ba,MAAA,mCAAA,GAAsC,CAAC,OAE9C,KAAA;AACJ,EAAM,MAAA,EAAE,cAAiB,GAAA,OAAA;AAEzB,EAAA,OAAOA,yCAAqB,CAAA;AAAA,IAC1B,EAAI,EAAA,2BAAA;AAAA,IACJ,WAAa,EAAA,+BAAA;AAAA,IACb,cAAgB,EAAA,IAAA;AAAA,cAChBC,yCAAA;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,OAAOC,0BAAmB,CAAA,KAAA;AAAA,QACxBC,MAAE,MAAO,CAAA;AAAA,UACP,IAAM,EAAAA,KAAA,CACH,KAAM,CAAAA,KAAA,CAAE,QAAU,EAAA;AAAA,YACjB,WAAa,EAAA;AAAA,WACd,CACA,CAAA,GAAA,CAAI,CAAC;AAAA,SACT;AAAA,OACH;AAAA,MACA,MAAA,EAAQA,MAAE,MAAO,CAAA;AAAA,QACf,OAAA,EAASA,MACN,MAAO,CAAA,EAAE,aAAa,mCAAoC,EAAC,EAC3D,QAAS;AAAA,OACb;AAAA,KACH;AAAA,IACA,MAAM,QAAQ,GAAK,EAAA;AACjB,MAAA,IAAI,IAAI,QAAU,EAAA;AAChB,QAAI,GAAA,CAAA,MAAA,CAAO,WAAW,EAAE,CAAA;AACxB,QAAA;AAAA;AAGF,MAAA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,IAAA,KAAS,GAAI,CAAA,KAAA;AAErC,MAAA,MAAM,EAAE,IAAA,EAAS,GAAAC,iBAAA,CAAa,SAAS,YAAY,CAAA;AAEnD,MAAA,MAAM,MAAMC,cAAU,CAAA,EAAE,IAAM,EAAA,YAAA,EAAc,OAAO,CAAA;AAEnD,MAAA,IAAI,WAA6B,GAAA,IAAA;AACjC,MAAA,IAAI,QAA0B,GAAA,IAAA;AAC9B,MAAA,KAAA,MAAW,eAAe,IAAM,EAAA;AAC9B,QAAA,MAAM,WAAmB,WACrB,GAAA,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,WAAW,CAC7B,CAAA,GAAA,WAAA;AACJ,QAAM,MAAA,MAAA,GAAU,MAAM,GAAA,CAAI,MAAO,CAAA,MAAA;AAAA,UAC/B;AAAA,SACF;AACA,QAAA,MAAM,WAAW,MAAO,CAAA,IAAA;AAAA,UACtB,CAAA,cAAA,KAAkB,eAAe,SAAc,KAAA;AAAA,SACjD;AACA,QAAA,IAAI,CAAC,QAAU,EAAA;AACb,UAAA,GAAA,CAAI,MAAO,CAAA,IAAA,CAAK,CAA0B,uBAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AACpD,UACE,QAAA,GAAA,CAAA,MAAM,IAAI,MAAO,CAAA,MAAA;AAAA,YACf,WAAA;AAAA,YACA,WAAA;AAAA,YACA,QACI,GAAA;AAAA,cACE;AAAA,gBAEF;AAAC,WAEN,GAAA,EAAA;AAAA,SACE,MAAA;AACL,UAAA,QAAA,GAAW,QAAS,CAAA,EAAA;AAAA;AAEtB,QAAc,WAAA,GAAA,QAAA;AAAA;AAEhB,MAAA,IAAI,aAAa,IAAM,EAAA;AACrB,QAAI,GAAA,CAAA,MAAA,CAAO,WAAW,QAAQ,CAAA;AAAA;AAChC;AACF,GACD,CAAA;AACH;;;;"}
@@ -162,7 +162,7 @@ which uses additional API calls in order to detect whether to 'create', 'update'
162
162
  let assigneeId = void 0;
163
163
  if (assignee !== void 0) {
164
164
  try {
165
- const assigneeUser = await api.Users.username(assignee);
165
+ const assigneeUser = await api.Users.all({ username: assignee });
166
166
  assigneeId = assigneeUser[0].id;
167
167
  } catch (e) {
168
168
  ctx.logger.warn(
@@ -186,13 +186,20 @@ which uses additional API calls in order to detect whether to 'create', 'update'
186
186
  let targetBranch = targetBranchName;
187
187
  if (!targetBranch) {
188
188
  const projects = await api.Projects.show(repoID);
189
- const { default_branch: defaultBranch } = projects;
189
+ const defaultBranch = projects.default_branch ?? projects.defaultBranch;
190
+ if (typeof defaultBranch !== "string" || !defaultBranch) {
191
+ throw new errors.InputError(
192
+ `The branch creation failed. Target branch was not provided, and could not find default branch from project settings. Project: ${JSON.stringify(
193
+ project
194
+ )}`
195
+ );
196
+ }
190
197
  targetBranch = defaultBranch;
191
198
  }
192
199
  let remoteFiles = [];
193
200
  if ((ctx.input.commitAction ?? "auto") === "auto") {
194
201
  try {
195
- remoteFiles = await api.Repositories.tree(repoID, {
202
+ remoteFiles = await api.Repositories.allRepositoryTrees(repoID, {
196
203
  ref: targetBranch,
197
204
  recursive: true,
198
205
  path: targetPath ?? void 0
@@ -271,9 +278,7 @@ which uses additional API calls in order to detect whether to 'create', 'update'
271
278
  removeSourceBranch: removeSourceBranch ? removeSourceBranch : false,
272
279
  assigneeId
273
280
  }
274
- ).then((mergeRequest) => {
275
- return mergeRequest.web_url;
276
- });
281
+ ).then((mergeRequest) => mergeRequest.web_url ?? mergeRequest.webUrl);
277
282
  ctx.output("projectid", repoID);
278
283
  ctx.output("targetBranchName", targetBranch);
279
284
  ctx.output("projectPath", repoID);
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabMergeRequest.cjs.js","sources":["../../src/actions/gitlabMergeRequest.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 {\n createTemplateAction,\n parseRepoUrl,\n SerializedFile,\n serializeDirectoryContents,\n} from '@backstage/plugin-scaffolder-node';\nimport { Gitlab, Types } from '@gitbeaker/core';\nimport path from 'path';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { InputError } from '@backstage/errors';\nimport {\n LoggerService,\n resolveSafeChildPath,\n} from '@backstage/backend-plugin-api';\nimport { createGitlabApi, getErrorMessage } from './helpers';\nimport { examples } from './gitlabMergeRequest.examples';\nimport { createHash } from 'crypto';\n\nfunction computeSha256(file: SerializedFile): string {\n const hash = createHash('sha256');\n hash.update(file.content);\n return hash.digest('hex');\n}\n\nasync function getFileAction(\n fileInfo: { file: SerializedFile; targetPath?: string },\n target: { repoID: string; branch: string },\n api: Gitlab,\n logger: LoggerService,\n remoteFiles: Types.RepositoryTreeSchema[],\n defaultCommitAction:\n | 'create'\n | 'delete'\n | 'update'\n | 'skip'\n | 'auto' = 'auto',\n): Promise<'create' | 'delete' | 'update' | 'skip'> {\n if (defaultCommitAction === 'auto') {\n const filePath = path.join(fileInfo.targetPath ?? '', fileInfo.file.path);\n\n if (remoteFiles?.some(remoteFile => remoteFile.path === filePath)) {\n try {\n const targetFile = await api.RepositoryFiles.show(\n target.repoID,\n filePath,\n target.branch,\n );\n if (computeSha256(fileInfo.file) === targetFile.content_sha256) {\n return 'skip';\n }\n } catch (error) {\n logger.warn(\n `Unable to retrieve detailed information for remote file ${filePath}`,\n );\n }\n return 'update';\n }\n return 'create';\n }\n return defaultCommitAction;\n}\n\n/**\n * Create a new action that creates a gitlab merge request.\n *\n * @public\n */\nexport const createPublishGitlabMergeRequestAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n\n return createTemplateAction<{\n repoUrl: string;\n title: string;\n description: string;\n branchName: string;\n targetBranchName?: string;\n sourcePath?: string;\n targetPath?: string;\n token?: string;\n commitAction?: 'create' | 'delete' | 'update' | 'skip' | 'auto';\n /** @deprecated projectID passed as query parameters in the repoUrl */\n projectid?: string;\n removeSourceBranch?: boolean;\n assignee?: string;\n }>({\n id: 'publish:gitlab:merge-request',\n examples,\n schema: {\n input: {\n required: ['repoUrl', 'branchName'],\n type: 'object',\n properties: {\n repoUrl: {\n type: 'string',\n title: 'Repository Location',\n description: `\\\nAccepts the format 'gitlab.com?repo=project_name&owner=group_name' where \\\n'project_name' is the repository name and 'group_name' is a group or username`,\n },\n /** @deprecated projectID is passed as query parameters in the repoUrl */\n projectid: {\n type: 'string',\n title: 'projectid',\n description: 'Project ID/Name(slug) of the Gitlab Project',\n },\n title: {\n type: 'string',\n title: 'Merge Request Name',\n description: 'The name for the merge request',\n },\n description: {\n type: 'string',\n title: 'Merge Request Description',\n description: 'The description of the merge request',\n },\n branchName: {\n type: 'string',\n title: 'Source Branch Name',\n description: 'The source branch name of the merge request',\n },\n targetBranchName: {\n type: 'string',\n title: 'Target Branch Name',\n description: 'The target branch name of the merge request',\n },\n sourcePath: {\n type: 'string',\n title: 'Working Subdirectory',\n description: `\\\nSubdirectory of working directory to copy changes from. \\\nFor reasons of backward compatibility, any specified 'targetPath' input will \\\nbe applied in place of an absent/falsy value for this input. \\\nCircumvent this behavior using '.'`,\n },\n targetPath: {\n type: 'string',\n title: 'Repository Subdirectory',\n description: 'Subdirectory of repository to apply changes to',\n },\n token: {\n title: 'Authentication Token',\n type: 'string',\n description: 'The token to use for authorization to GitLab',\n },\n commitAction: {\n title: 'Commit action',\n type: 'string',\n enum: ['create', 'update', 'delete', 'auto'],\n description: `\\\nThe action to be used for git commit. Defaults to the custom 'auto' action provided by backstage,\nwhich uses additional API calls in order to detect whether to 'create', 'update' or 'skip' each source file.`,\n },\n removeSourceBranch: {\n title: 'Delete source branch',\n type: 'boolean',\n description:\n 'Option to delete source branch once the MR has been merged. Default: false',\n },\n assignee: {\n title: 'Merge Request Assignee',\n type: 'string',\n description: 'User this merge request will be assigned to',\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n targetBranchName: {\n title: 'Target branch name of the merge request',\n type: 'string',\n },\n projectid: {\n title: 'Gitlab Project id/Name(slug)',\n type: 'string',\n },\n projectPath: {\n title: 'Gitlab Project path',\n type: 'string',\n },\n mergeRequestUrl: {\n title: 'MergeRequest(MR) URL',\n type: 'string',\n description: 'Link to the merge request in GitLab',\n },\n },\n },\n },\n async handler(ctx) {\n const {\n assignee,\n branchName,\n targetBranchName,\n description,\n repoUrl,\n removeSourceBranch,\n targetPath,\n sourcePath,\n title,\n token,\n } = ctx.input;\n\n const { owner, repo, project } = parseRepoUrl(repoUrl, integrations);\n const repoID = project ? project : `${owner}/${repo}`;\n\n const api = createGitlabApi({\n integrations,\n token,\n repoUrl,\n });\n\n let assigneeId = undefined;\n\n if (assignee !== undefined) {\n try {\n const assigneeUser = await api.Users.username(assignee);\n assigneeId = assigneeUser[0].id;\n } catch (e) {\n ctx.logger.warn(\n `Failed to find gitlab user id for ${assignee}: ${getErrorMessage(\n e,\n )}. Proceeding with MR creation without an assignee.`,\n );\n }\n }\n\n let fileRoot: string;\n if (sourcePath) {\n fileRoot = resolveSafeChildPath(ctx.workspacePath, sourcePath);\n } else if (targetPath) {\n // for backward compatibility\n fileRoot = resolveSafeChildPath(ctx.workspacePath, targetPath);\n } else {\n fileRoot = ctx.workspacePath;\n }\n\n const fileContents = await serializeDirectoryContents(fileRoot, {\n gitignore: true,\n });\n\n let targetBranch = targetBranchName;\n if (!targetBranch) {\n const projects = await api.Projects.show(repoID);\n\n const { default_branch: defaultBranch } = projects;\n targetBranch = defaultBranch!;\n }\n\n let remoteFiles: Types.RepositoryTreeSchema[] = [];\n if ((ctx.input.commitAction ?? 'auto') === 'auto') {\n try {\n remoteFiles = await api.Repositories.tree(repoID, {\n ref: targetBranch,\n recursive: true,\n path: targetPath ?? undefined,\n });\n } catch (e) {\n ctx.logger.warn(\n `Could not retrieve the list of files for ${repoID} (branch: ${targetBranch}) : ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n const actions: Types.CommitAction[] =\n ctx.input.commitAction === 'skip'\n ? []\n : (\n (\n await Promise.all(\n fileContents.map(async file => {\n const action = await getFileAction(\n { file, targetPath },\n { repoID, branch: targetBranch! },\n api,\n ctx.logger,\n remoteFiles,\n ctx.input.commitAction,\n );\n return { file, action };\n }),\n )\n ).filter(o => o.action !== 'skip') as {\n file: SerializedFile;\n action: Types.CommitAction['action'];\n }[]\n ).map(({ file, action }) => ({\n action,\n filePath: targetPath\n ? path.posix.join(targetPath, file.path)\n : file.path,\n encoding: 'base64',\n content: file.content.toString('base64'),\n execute_filemode: file.executable,\n }));\n\n let createBranch: boolean;\n if (actions.length) {\n createBranch = true;\n } else {\n try {\n await api.Branches.show(repoID, branchName);\n createBranch = false;\n ctx.logger.info(\n `Using existing branch ${branchName} without modification.`,\n );\n } catch (e) {\n createBranch = true;\n }\n }\n if (createBranch) {\n try {\n await api.Branches.create(repoID, branchName, String(targetBranch));\n } catch (e) {\n throw new InputError(\n `The branch creation failed. Please check that your repo does not already contain a branch named '${branchName}'. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n if (actions.length) {\n try {\n await api.Commits.create(repoID, branchName, title, actions);\n } catch (e) {\n throw new InputError(\n `Committing the changes to ${branchName} failed. Please check that none of the files created by the template already exists. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n try {\n const mergeRequestUrl = await api.MergeRequests.create(\n repoID,\n branchName,\n String(targetBranch),\n title,\n {\n description,\n removeSourceBranch: removeSourceBranch ? removeSourceBranch : false,\n assigneeId,\n },\n ).then((mergeRequest: { web_url: string }) => {\n return mergeRequest.web_url;\n });\n ctx.output('projectid', repoID);\n ctx.output('targetBranchName', targetBranch);\n ctx.output('projectPath', repoID);\n ctx.output('mergeRequestUrl', mergeRequestUrl);\n } catch (e) {\n throw new InputError(\n `Merge request creation failed. ${getErrorMessage(e)}`,\n );\n }\n },\n });\n};\n"],"names":["createHash","path","createTemplateAction","examples","parseRepoUrl","createGitlabApi","getErrorMessage","resolveSafeChildPath","serializeDirectoryContents","InputError"],"mappings":"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"}
1
+ {"version":3,"file":"gitlabMergeRequest.cjs.js","sources":["../../src/actions/gitlabMergeRequest.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 {\n createTemplateAction,\n parseRepoUrl,\n SerializedFile,\n serializeDirectoryContents,\n} from '@backstage/plugin-scaffolder-node';\nimport { Gitlab, RepositoryTreeSchema, CommitAction } from '@gitbeaker/rest';\nimport path from 'path';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { InputError } from '@backstage/errors';\nimport {\n LoggerService,\n resolveSafeChildPath,\n} from '@backstage/backend-plugin-api';\nimport { createGitlabApi, getErrorMessage } from './helpers';\nimport { examples } from './gitlabMergeRequest.examples';\nimport { createHash } from 'crypto';\n\nfunction computeSha256(file: SerializedFile): string {\n const hash = createHash('sha256');\n hash.update(file.content);\n return hash.digest('hex');\n}\n\nasync function getFileAction(\n fileInfo: { file: SerializedFile; targetPath?: string },\n target: { repoID: string; branch: string },\n api: InstanceType<typeof Gitlab>,\n logger: LoggerService,\n remoteFiles: RepositoryTreeSchema[],\n defaultCommitAction:\n | 'create'\n | 'delete'\n | 'update'\n | 'skip'\n | 'auto' = 'auto',\n): Promise<'create' | 'delete' | 'update' | 'skip'> {\n if (defaultCommitAction === 'auto') {\n const filePath = path.join(fileInfo.targetPath ?? '', fileInfo.file.path);\n\n if (remoteFiles?.some(remoteFile => remoteFile.path === filePath)) {\n try {\n const targetFile = await api.RepositoryFiles.show(\n target.repoID,\n filePath,\n target.branch,\n );\n if (computeSha256(fileInfo.file) === targetFile.content_sha256) {\n return 'skip';\n }\n } catch (error) {\n logger.warn(\n `Unable to retrieve detailed information for remote file ${filePath}`,\n );\n }\n return 'update';\n }\n return 'create';\n }\n return defaultCommitAction;\n}\n\n/**\n * Create a new action that creates a gitlab merge request.\n *\n * @public\n */\nexport const createPublishGitlabMergeRequestAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n\n return createTemplateAction<{\n repoUrl: string;\n title: string;\n description: string;\n branchName: string;\n targetBranchName?: string;\n sourcePath?: string;\n targetPath?: string;\n token?: string;\n commitAction?: 'create' | 'delete' | 'update' | 'skip' | 'auto';\n /** @deprecated projectID passed as query parameters in the repoUrl */\n projectid?: string;\n removeSourceBranch?: boolean;\n assignee?: string;\n }>({\n id: 'publish:gitlab:merge-request',\n examples,\n schema: {\n input: {\n required: ['repoUrl', 'branchName'],\n type: 'object',\n properties: {\n repoUrl: {\n type: 'string',\n title: 'Repository Location',\n description: `\\\nAccepts the format 'gitlab.com?repo=project_name&owner=group_name' where \\\n'project_name' is the repository name and 'group_name' is a group or username`,\n },\n /** @deprecated projectID is passed as query parameters in the repoUrl */\n projectid: {\n type: 'string',\n title: 'projectid',\n description: 'Project ID/Name(slug) of the Gitlab Project',\n },\n title: {\n type: 'string',\n title: 'Merge Request Name',\n description: 'The name for the merge request',\n },\n description: {\n type: 'string',\n title: 'Merge Request Description',\n description: 'The description of the merge request',\n },\n branchName: {\n type: 'string',\n title: 'Source Branch Name',\n description: 'The source branch name of the merge request',\n },\n targetBranchName: {\n type: 'string',\n title: 'Target Branch Name',\n description: 'The target branch name of the merge request',\n },\n sourcePath: {\n type: 'string',\n title: 'Working Subdirectory',\n description: `\\\nSubdirectory of working directory to copy changes from. \\\nFor reasons of backward compatibility, any specified 'targetPath' input will \\\nbe applied in place of an absent/falsy value for this input. \\\nCircumvent this behavior using '.'`,\n },\n targetPath: {\n type: 'string',\n title: 'Repository Subdirectory',\n description: 'Subdirectory of repository to apply changes to',\n },\n token: {\n title: 'Authentication Token',\n type: 'string',\n description: 'The token to use for authorization to GitLab',\n },\n commitAction: {\n title: 'Commit action',\n type: 'string',\n enum: ['create', 'update', 'delete', 'auto'],\n description: `\\\nThe action to be used for git commit. Defaults to the custom 'auto' action provided by backstage,\nwhich uses additional API calls in order to detect whether to 'create', 'update' or 'skip' each source file.`,\n },\n removeSourceBranch: {\n title: 'Delete source branch',\n type: 'boolean',\n description:\n 'Option to delete source branch once the MR has been merged. Default: false',\n },\n assignee: {\n title: 'Merge Request Assignee',\n type: 'string',\n description: 'User this merge request will be assigned to',\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n targetBranchName: {\n title: 'Target branch name of the merge request',\n type: 'string',\n },\n projectid: {\n title: 'Gitlab Project id/Name(slug)',\n type: 'string',\n },\n projectPath: {\n title: 'Gitlab Project path',\n type: 'string',\n },\n mergeRequestUrl: {\n title: 'MergeRequest(MR) URL',\n type: 'string',\n description: 'Link to the merge request in GitLab',\n },\n },\n },\n },\n async handler(ctx) {\n const {\n assignee,\n branchName,\n targetBranchName,\n description,\n repoUrl,\n removeSourceBranch,\n targetPath,\n sourcePath,\n title,\n token,\n } = ctx.input;\n\n const { owner, repo, project } = parseRepoUrl(repoUrl, integrations);\n const repoID = project ? project : `${owner}/${repo}`;\n\n const api = createGitlabApi({\n integrations,\n token,\n repoUrl,\n });\n\n let assigneeId = undefined;\n\n if (assignee !== undefined) {\n try {\n const assigneeUser = await api.Users.all({ username: assignee });\n assigneeId = assigneeUser[0].id;\n } catch (e) {\n ctx.logger.warn(\n `Failed to find gitlab user id for ${assignee}: ${getErrorMessage(\n e,\n )}. Proceeding with MR creation without an assignee.`,\n );\n }\n }\n\n let fileRoot: string;\n if (sourcePath) {\n fileRoot = resolveSafeChildPath(ctx.workspacePath, sourcePath);\n } else if (targetPath) {\n // for backward compatibility\n fileRoot = resolveSafeChildPath(ctx.workspacePath, targetPath);\n } else {\n fileRoot = ctx.workspacePath;\n }\n\n const fileContents = await serializeDirectoryContents(fileRoot, {\n gitignore: true,\n });\n\n let targetBranch = targetBranchName;\n if (!targetBranch) {\n const projects = await api.Projects.show(repoID);\n const defaultBranch = projects.default_branch ?? projects.defaultBranch;\n if (typeof defaultBranch !== 'string' || !defaultBranch) {\n throw new InputError(\n `The branch creation failed. Target branch was not provided, and could not find default branch from project settings. Project: ${JSON.stringify(\n project,\n )}`,\n );\n }\n targetBranch = defaultBranch;\n }\n\n let remoteFiles: RepositoryTreeSchema[] = [];\n if ((ctx.input.commitAction ?? 'auto') === 'auto') {\n try {\n remoteFiles = await api.Repositories.allRepositoryTrees(repoID, {\n ref: targetBranch,\n recursive: true,\n path: targetPath ?? undefined,\n });\n } catch (e) {\n ctx.logger.warn(\n `Could not retrieve the list of files for ${repoID} (branch: ${targetBranch}) : ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n const actions: CommitAction[] =\n ctx.input.commitAction === 'skip'\n ? []\n : (\n (\n await Promise.all(\n fileContents.map(async file => {\n const action = await getFileAction(\n { file, targetPath },\n { repoID, branch: targetBranch! },\n api,\n ctx.logger,\n remoteFiles,\n ctx.input.commitAction,\n );\n return { file, action };\n }),\n )\n ).filter(o => o.action !== 'skip') as {\n file: SerializedFile;\n action: CommitAction['action'];\n }[]\n ).map(({ file, action }) => ({\n action,\n filePath: targetPath\n ? path.posix.join(targetPath, file.path)\n : file.path,\n encoding: 'base64',\n content: file.content.toString('base64'),\n execute_filemode: file.executable,\n }));\n\n let createBranch: boolean;\n if (actions.length) {\n createBranch = true;\n } else {\n try {\n await api.Branches.show(repoID, branchName);\n createBranch = false;\n ctx.logger.info(\n `Using existing branch ${branchName} without modification.`,\n );\n } catch (e) {\n createBranch = true;\n }\n }\n if (createBranch) {\n try {\n await api.Branches.create(repoID, branchName, String(targetBranch));\n } catch (e) {\n throw new InputError(\n `The branch creation failed. Please check that your repo does not already contain a branch named '${branchName}'. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n if (actions.length) {\n try {\n await api.Commits.create(repoID, branchName, title, actions);\n } catch (e) {\n throw new InputError(\n `Committing the changes to ${branchName} failed. Please check that none of the files created by the template already exists. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n try {\n const mergeRequestUrl = await api.MergeRequests.create(\n repoID,\n branchName,\n String(targetBranch),\n title,\n {\n description,\n removeSourceBranch: removeSourceBranch ? removeSourceBranch : false,\n assigneeId,\n },\n ).then(mergeRequest => mergeRequest.web_url ?? mergeRequest.webUrl);\n ctx.output('projectid', repoID);\n ctx.output('targetBranchName', targetBranch);\n ctx.output('projectPath', repoID);\n ctx.output('mergeRequestUrl', mergeRequestUrl);\n } catch (e) {\n throw new InputError(\n `Merge request creation failed. ${getErrorMessage(e)}`,\n );\n }\n },\n });\n};\n"],"names":["createHash","path","createTemplateAction","examples","parseRepoUrl","createGitlabApi","getErrorMessage","resolveSafeChildPath","serializeDirectoryContents","InputError"],"mappings":"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"}
@@ -68,8 +68,8 @@ const createGitlabProjectAccessTokenAction = (options) => {
68
68
  projectId,
69
69
  name,
70
70
  scopes,
71
+ expiresAt || luxon.DateTime.now().plus({ days: 365 }).toISODate(),
71
72
  {
72
- expiresAt: expiresAt || luxon.DateTime.now().plus({ days: 365 }).toISODate(),
73
73
  accessLevel
74
74
  }
75
75
  );
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabProjectAccessTokenCreate.cjs.js","sources":["../../src/actions/gitlabProjectAccessTokenCreate.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 { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { AccessTokenScopes, Gitlab } from '@gitbeaker/rest';\nimport { DateTime } from 'luxon';\nimport { z } from 'zod';\nimport { getToken } from '../util';\nimport { examples } from './gitlabProjectAccessTokenCreate.examples';\n\n/**\n * Creates a `gitlab:projectAccessToken:create` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\n\nexport const createGitlabProjectAccessTokenAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:projectAccessToken:create',\n examples,\n schema: {\n input: z.object({\n projectId: z.union([z.number(), z.string()], {\n description: 'Project ID/Name(slug) of the Gitlab Project',\n }),\n token: z\n .string({\n description: 'The token to use for authorization to GitLab',\n })\n .optional(),\n name: z.string({ description: 'Name of Access Key' }).optional(),\n repoUrl: z.string({ description: 'URL to gitlab instance' }),\n accessLevel: z\n .number({\n description:\n 'Access Level of the Token, 10 (Guest), 20 (Reporter), 30 (Developer), 40 (Maintainer), and 50 (Owner)',\n })\n .optional(),\n scopes: z\n .string({\n description: 'Scopes for a project access token',\n })\n .array()\n .optional(),\n expiresAt: z\n .string({\n description:\n 'Expiration date of the access token in ISO format (YYYY-MM-DD). If Empty, it will set to the maximum of 365 days.',\n })\n .optional(),\n }),\n output: z.object({\n access_token: z.string({ description: 'Access Token' }),\n }),\n },\n async handler(ctx) {\n ctx.logger.info(`Creating Token for Project \"${ctx.input.projectId}\"`);\n const {\n projectId,\n name = 'tokenname',\n accessLevel = 40,\n scopes = ['read_repository'],\n expiresAt,\n } = ctx.input;\n\n const { token, integrationConfig } = getToken(ctx.input, integrations);\n\n if (!integrationConfig.config.token && token) {\n throw new InputError(\n `No token available for host ${integrationConfig.config.baseUrl}`,\n );\n }\n\n let api;\n\n if (!ctx.input.token) {\n api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: token,\n });\n } else {\n api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n oauthToken: token,\n });\n }\n\n const response = await api.ProjectAccessTokens.create(\n projectId,\n name,\n scopes as AccessTokenScopes[],\n {\n expiresAt:\n expiresAt || DateTime.now().plus({ days: 365 }).toISODate()!,\n accessLevel,\n },\n );\n\n if (!response.token) {\n throw new Error('Could not create project access token');\n }\n\n ctx.output('access_token', response.token);\n },\n });\n};\n"],"names":["createTemplateAction","examples","z","getToken","InputError","Gitlab","DateTime"],"mappings":"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"}
1
+ {"version":3,"file":"gitlabProjectAccessTokenCreate.cjs.js","sources":["../../src/actions/gitlabProjectAccessTokenCreate.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 { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { AccessTokenScopes, Gitlab } from '@gitbeaker/rest';\nimport { DateTime } from 'luxon';\nimport { z } from 'zod';\nimport { getToken } from '../util';\nimport { examples } from './gitlabProjectAccessTokenCreate.examples';\n\n/**\n * Creates a `gitlab:projectAccessToken:create` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\n\nexport const createGitlabProjectAccessTokenAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:projectAccessToken:create',\n examples,\n schema: {\n input: z.object({\n projectId: z.union([z.number(), z.string()], {\n description: 'Project ID/Name(slug) of the Gitlab Project',\n }),\n token: z\n .string({\n description: 'The token to use for authorization to GitLab',\n })\n .optional(),\n name: z.string({ description: 'Name of Access Key' }).optional(),\n repoUrl: z.string({ description: 'URL to gitlab instance' }),\n accessLevel: z\n .number({\n description:\n 'Access Level of the Token, 10 (Guest), 20 (Reporter), 30 (Developer), 40 (Maintainer), and 50 (Owner)',\n })\n .optional(),\n scopes: z\n .string({\n description: 'Scopes for a project access token',\n })\n .array()\n .optional(),\n expiresAt: z\n .string({\n description:\n 'Expiration date of the access token in ISO format (YYYY-MM-DD). If Empty, it will set to the maximum of 365 days.',\n })\n .optional(),\n }),\n output: z.object({\n access_token: z.string({ description: 'Access Token' }),\n }),\n },\n async handler(ctx) {\n ctx.logger.info(`Creating Token for Project \"${ctx.input.projectId}\"`);\n const {\n projectId,\n name = 'tokenname',\n accessLevel = 40,\n scopes = ['read_repository'],\n expiresAt,\n } = ctx.input;\n\n const { token, integrationConfig } = getToken(ctx.input, integrations);\n\n if (!integrationConfig.config.token && token) {\n throw new InputError(\n `No token available for host ${integrationConfig.config.baseUrl}`,\n );\n }\n\n let api;\n\n if (!ctx.input.token) {\n api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: token,\n });\n } else {\n api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n oauthToken: token,\n });\n }\n\n const response = await api.ProjectAccessTokens.create(\n projectId,\n name,\n scopes as AccessTokenScopes[],\n expiresAt || DateTime.now().plus({ days: 365 }).toISODate()!,\n {\n accessLevel,\n },\n );\n\n if (!response.token) {\n throw new Error('Could not create project access token');\n }\n\n ctx.output('access_token', response.token);\n },\n });\n};\n"],"names":["createTemplateAction","examples","z","getToken","InputError","Gitlab","DateTime"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  var errors = require('@backstage/errors');
4
4
  var pluginScaffolderNode = require('@backstage/plugin-scaffolder-node');
5
- var node = require('@gitbeaker/node');
5
+ var rest = require('@gitbeaker/rest');
6
6
  var zod = require('zod');
7
7
  var commonGitlabConfig = require('../commonGitlabConfig.cjs.js');
8
8
  var util = require('../util.cjs.js');
@@ -21,7 +21,7 @@ const createGitlabProjectDeployTokenAction = (options) => {
21
21
  }),
22
22
  name: zod.z.string({ description: "Deploy Token Name" }),
23
23
  username: zod.z.string({ description: "Deploy Token Username" }).optional(),
24
- scopes: zod.z.array(zod.z.string(), { description: "Scopes" }).optional()
24
+ scopes: zod.z.array(zod.z.string(), { description: "Scopes" })
25
25
  })
26
26
  ),
27
27
  output: zod.z.object({
@@ -33,15 +33,20 @@ const createGitlabProjectDeployTokenAction = (options) => {
33
33
  ctx.logger.info(`Creating Token for Project "${ctx.input.projectId}"`);
34
34
  const { projectId, name, username, scopes } = ctx.input;
35
35
  const { token, integrationConfig } = util.getToken(ctx.input, integrations);
36
- const api = new node.Gitlab({
36
+ if (scopes.length === 0) {
37
+ throw new errors.InputError(
38
+ `Could not create token for project "${ctx.input.projectId}": scopes cannot be empty.`
39
+ );
40
+ }
41
+ const api = new rest.Gitlab({
37
42
  host: integrationConfig.config.baseUrl,
38
43
  token
39
44
  });
40
- const deployToken = await api.ProjectDeployTokens.add(
41
- projectId,
45
+ const deployToken = await api.DeployTokens.create(
42
46
  name,
43
47
  scopes,
44
48
  {
49
+ projectId,
45
50
  username
46
51
  }
47
52
  );
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabProjectDeployTokenCreate.cjs.js","sources":["../../src/actions/gitlabProjectDeployTokenCreate.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 { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { DeployTokenScope } from '@gitbeaker/core/dist/types/templates/ResourceDeployTokens';\nimport { Gitlab } from '@gitbeaker/node';\nimport { z } from 'zod';\nimport commonGitlabConfig from '../commonGitlabConfig';\nimport { getToken } from '../util';\nimport { examples } from './gitlabProjectDeployTokenCreate.examples';\n\n/**\n * Creates a `gitlab:projectDeployToken:create` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\nexport const createGitlabProjectDeployTokenAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:projectDeployToken:create',\n examples,\n schema: {\n input: commonGitlabConfig.merge(\n z.object({\n projectId: z.union([z.number(), z.string()], {\n description: 'Project ID',\n }),\n name: z.string({ description: 'Deploy Token Name' }),\n username: z\n .string({ description: 'Deploy Token Username' })\n .optional(),\n scopes: z.array(z.string(), { description: 'Scopes' }).optional(),\n }),\n ),\n output: z.object({\n deploy_token: z.string({ description: 'Deploy Token' }),\n user: z.string({ description: 'User' }),\n }),\n },\n async handler(ctx) {\n ctx.logger.info(`Creating Token for Project \"${ctx.input.projectId}\"`);\n const { projectId, name, username, scopes } = ctx.input;\n const { token, integrationConfig } = getToken(ctx.input, integrations);\n\n const api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: token,\n });\n\n const deployToken = await api.ProjectDeployTokens.add(\n projectId,\n name,\n scopes as DeployTokenScope[],\n {\n username: username,\n },\n );\n\n if (!deployToken.hasOwnProperty('token')) {\n throw new InputError(`No deploy_token given from gitlab instance`);\n }\n\n ctx.output('deploy_token', deployToken.token as string);\n ctx.output('user', deployToken.username);\n },\n });\n};\n"],"names":["createTemplateAction","examples","commonGitlabConfig","z","getToken","Gitlab","InputError"],"mappings":";;;;;;;;;;AAgCa,MAAA,oCAAA,GAAuC,CAAC,OAE/C,KAAA;AACJ,EAAM,MAAA,EAAE,cAAiB,GAAA,OAAA;AACzB,EAAA,OAAOA,yCAAqB,CAAA;AAAA,IAC1B,EAAI,EAAA,kCAAA;AAAA,cACJC,gDAAA;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,OAAOC,0BAAmB,CAAA,KAAA;AAAA,QACxBC,MAAE,MAAO,CAAA;AAAA,UACP,SAAA,EAAWA,KAAE,CAAA,KAAA,CAAM,CAACA,KAAA,CAAE,QAAU,EAAAA,KAAA,CAAE,MAAO,EAAC,CAAG,EAAA;AAAA,YAC3C,WAAa,EAAA;AAAA,WACd,CAAA;AAAA,UACD,MAAMA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,qBAAqB,CAAA;AAAA,UACnD,QAAA,EAAUA,MACP,MAAO,CAAA,EAAE,aAAa,uBAAwB,EAAC,EAC/C,QAAS,EAAA;AAAA,UACZ,MAAA,EAAQA,KAAE,CAAA,KAAA,CAAMA,KAAE,CAAA,MAAA,EAAU,EAAA,EAAE,WAAa,EAAA,QAAA,EAAU,CAAA,CAAE,QAAS;AAAA,SACjE;AAAA,OACH;AAAA,MACA,MAAA,EAAQA,MAAE,MAAO,CAAA;AAAA,QACf,cAAcA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,gBAAgB,CAAA;AAAA,QACtD,MAAMA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,QAAQ;AAAA,OACvC;AAAA,KACH;AAAA,IACA,MAAM,QAAQ,GAAK,EAAA;AACjB,MAAA,GAAA,CAAI,OAAO,IAAK,CAAA,CAAA,4BAAA,EAA+B,GAAI,CAAA,KAAA,CAAM,SAAS,CAAG,CAAA,CAAA,CAAA;AACrE,MAAA,MAAM,EAAE,SAAW,EAAA,IAAA,EAAM,QAAU,EAAA,MAAA,KAAW,GAAI,CAAA,KAAA;AAClD,MAAA,MAAM,EAAE,KAAO,EAAA,iBAAA,KAAsBC,aAAS,CAAA,GAAA,CAAI,OAAO,YAAY,CAAA;AAErE,MAAM,MAAA,GAAA,GAAM,IAAIC,WAAO,CAAA;AAAA,QACrB,IAAA,EAAM,kBAAkB,MAAO,CAAA,OAAA;AAAA,QAC/B;AAAA,OACD,CAAA;AAED,MAAM,MAAA,WAAA,GAAc,MAAM,GAAA,CAAI,mBAAoB,CAAA,GAAA;AAAA,QAChD,SAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,UACE;AAAA;AACF,OACF;AAEA,MAAA,IAAI,CAAC,WAAA,CAAY,cAAe,CAAA,OAAO,CAAG,EAAA;AACxC,QAAM,MAAA,IAAIC,kBAAW,CAA4C,0CAAA,CAAA,CAAA;AAAA;AAGnE,MAAI,GAAA,CAAA,MAAA,CAAO,cAAgB,EAAA,WAAA,CAAY,KAAe,CAAA;AACtD,MAAI,GAAA,CAAA,MAAA,CAAO,MAAQ,EAAA,WAAA,CAAY,QAAQ,CAAA;AAAA;AACzC,GACD,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"gitlabProjectDeployTokenCreate.cjs.js","sources":["../../src/actions/gitlabProjectDeployTokenCreate.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 { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { createTemplateAction } from '@backstage/plugin-scaffolder-node';\nimport { DeployTokenScope, Gitlab } from '@gitbeaker/rest';\nimport { z } from 'zod';\nimport commonGitlabConfig from '../commonGitlabConfig';\nimport { getToken } from '../util';\nimport { examples } from './gitlabProjectDeployTokenCreate.examples';\n\n/**\n * Creates a `gitlab:projectDeployToken:create` Scaffolder action.\n *\n * @param options - Templating configuration.\n * @public\n */\nexport const createGitlabProjectDeployTokenAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n return createTemplateAction({\n id: 'gitlab:projectDeployToken:create',\n examples,\n schema: {\n input: commonGitlabConfig.merge(\n z.object({\n projectId: z.union([z.number(), z.string()], {\n description: 'Project ID',\n }),\n name: z.string({ description: 'Deploy Token Name' }),\n username: z\n .string({ description: 'Deploy Token Username' })\n .optional(),\n scopes: z.array(z.string(), { description: 'Scopes' }),\n }),\n ),\n output: z.object({\n deploy_token: z.string({ description: 'Deploy Token' }),\n user: z.string({ description: 'User' }),\n }),\n },\n async handler(ctx) {\n ctx.logger.info(`Creating Token for Project \"${ctx.input.projectId}\"`);\n const { projectId, name, username, scopes } = ctx.input;\n const { token, integrationConfig } = getToken(ctx.input, integrations);\n\n if (scopes.length === 0) {\n throw new InputError(\n `Could not create token for project \"${ctx.input.projectId}\": scopes cannot be empty.`,\n );\n }\n\n const api = new Gitlab({\n host: integrationConfig.config.baseUrl,\n token: token,\n });\n\n const deployToken = await api.DeployTokens.create(\n name,\n scopes as DeployTokenScope[],\n {\n projectId,\n username,\n },\n );\n\n if (!deployToken.hasOwnProperty('token')) {\n throw new InputError(`No deploy_token given from gitlab instance`);\n }\n\n ctx.output('deploy_token', deployToken.token as string);\n ctx.output('user', deployToken.username);\n },\n });\n};\n"],"names":["createTemplateAction","examples","commonGitlabConfig","z","getToken","InputError","Gitlab"],"mappings":";;;;;;;;;;AA+Ba,MAAA,oCAAA,GAAuC,CAAC,OAE/C,KAAA;AACJ,EAAM,MAAA,EAAE,cAAiB,GAAA,OAAA;AACzB,EAAA,OAAOA,yCAAqB,CAAA;AAAA,IAC1B,EAAI,EAAA,kCAAA;AAAA,cACJC,gDAAA;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,OAAOC,0BAAmB,CAAA,KAAA;AAAA,QACxBC,MAAE,MAAO,CAAA;AAAA,UACP,SAAA,EAAWA,KAAE,CAAA,KAAA,CAAM,CAACA,KAAA,CAAE,QAAU,EAAAA,KAAA,CAAE,MAAO,EAAC,CAAG,EAAA;AAAA,YAC3C,WAAa,EAAA;AAAA,WACd,CAAA;AAAA,UACD,MAAMA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,qBAAqB,CAAA;AAAA,UACnD,QAAA,EAAUA,MACP,MAAO,CAAA,EAAE,aAAa,uBAAwB,EAAC,EAC/C,QAAS,EAAA;AAAA,UACZ,MAAA,EAAQA,MAAE,KAAM,CAAAA,KAAA,CAAE,QAAU,EAAA,EAAE,WAAa,EAAA,QAAA,EAAU;AAAA,SACtD;AAAA,OACH;AAAA,MACA,MAAA,EAAQA,MAAE,MAAO,CAAA;AAAA,QACf,cAAcA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,gBAAgB,CAAA;AAAA,QACtD,MAAMA,KAAE,CAAA,MAAA,CAAO,EAAE,WAAA,EAAa,QAAQ;AAAA,OACvC;AAAA,KACH;AAAA,IACA,MAAM,QAAQ,GAAK,EAAA;AACjB,MAAA,GAAA,CAAI,OAAO,IAAK,CAAA,CAAA,4BAAA,EAA+B,GAAI,CAAA,KAAA,CAAM,SAAS,CAAG,CAAA,CAAA,CAAA;AACrE,MAAA,MAAM,EAAE,SAAW,EAAA,IAAA,EAAM,QAAU,EAAA,MAAA,KAAW,GAAI,CAAA,KAAA;AAClD,MAAA,MAAM,EAAE,KAAO,EAAA,iBAAA,KAAsBC,aAAS,CAAA,GAAA,CAAI,OAAO,YAAY,CAAA;AAErE,MAAI,IAAA,MAAA,CAAO,WAAW,CAAG,EAAA;AACvB,QAAA,MAAM,IAAIC,iBAAA;AAAA,UACR,CAAA,oCAAA,EAAuC,GAAI,CAAA,KAAA,CAAM,SAAS,CAAA,0BAAA;AAAA,SAC5D;AAAA;AAGF,MAAM,MAAA,GAAA,GAAM,IAAIC,WAAO,CAAA;AAAA,QACrB,IAAA,EAAM,kBAAkB,MAAO,CAAA,OAAA;AAAA,QAC/B;AAAA,OACD,CAAA;AAED,MAAM,MAAA,WAAA,GAAc,MAAM,GAAA,CAAI,YAAa,CAAA,MAAA;AAAA,QACzC,IAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,UACE,SAAA;AAAA,UACA;AAAA;AACF,OACF;AAEA,MAAA,IAAI,CAAC,WAAA,CAAY,cAAe,CAAA,OAAO,CAAG,EAAA;AACxC,QAAM,MAAA,IAAID,kBAAW,CAA4C,0CAAA,CAAA,CAAA;AAAA;AAGnE,MAAI,GAAA,CAAA,MAAA,CAAO,cAAgB,EAAA,WAAA,CAAY,KAAe,CAAA;AACtD,MAAI,GAAA,CAAA,MAAA,CAAO,MAAQ,EAAA,WAAA,CAAY,QAAQ,CAAA;AAAA;AACzC,GACD,CAAA;AACH;;;;"}
@@ -18,14 +18,15 @@ const examples = [
18
18
  input: {
19
19
  repoUrl: "gitlab.com?repo=repo&owner=owner",
20
20
  projectId: "456",
21
- name: "tokenname"
21
+ name: "tokenname",
22
+ scopes: ["read_registry"]
22
23
  }
23
24
  }
24
25
  ]
25
26
  })
26
27
  },
27
28
  {
28
- description: "Create a GitLab project deploy token with custom scopes.",
29
+ description: "Create a GitLab project deploy token with many custom scopes.",
29
30
  example: yaml__default.default.stringify({
30
31
  steps: [
31
32
  {
@@ -53,7 +54,8 @@ const examples = [
53
54
  input: {
54
55
  repoUrl: "gitlab.com?repo=repo&owner=owner",
55
56
  projectId: "101112",
56
- name: "my-custom-token"
57
+ name: "my-custom-token",
58
+ scopes: ["read_registry"]
57
59
  }
58
60
  }
59
61
  ]
@@ -70,7 +72,8 @@ const examples = [
70
72
  input: {
71
73
  repoUrl: "gitlab.com?repo=repo&owner=owner",
72
74
  projectId: 42,
73
- name: "tokenname"
75
+ name: "tokenname",
76
+ scopes: ["read_registry"]
74
77
  }
75
78
  }
76
79
  ]
@@ -88,7 +91,8 @@ const examples = [
88
91
  repoUrl: "gitlab.com?repo=repo&owner=owner",
89
92
  projectId: 42,
90
93
  name: "tokenname",
91
- username: "tokenuser"
94
+ username: "tokenuser",
95
+ scopes: ["read_registry"]
92
96
  }
93
97
  }
94
98
  ]
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabProjectDeployTokenCreate.examples.cjs.js","sources":["../../src/actions/gitlabProjectDeployTokenCreate.examples.ts"],"sourcesContent":["/*\n * Copyright 2023 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 */\nimport { TemplateExample } from '@backstage/plugin-scaffolder-node';\nimport yaml from 'yaml';\n\nexport const examples: TemplateExample[] = [\n {\n description: 'Create a GitLab project deploy token with minimal options.',\n example: yaml.stringify({\n steps: [\n {\n id: 'createDeployToken',\n action: 'gitlab:projectDeployToken:create',\n name: 'Create GitLab Project Deploy Token',\n input: {\n repoUrl: 'gitlab.com?repo=repo&owner=owner',\n projectId: '456',\n name: 'tokenname',\n },\n },\n ],\n }),\n },\n {\n description: 'Create a GitLab project deploy token with custom scopes.',\n example: yaml.stringify({\n steps: [\n {\n id: 'createDeployToken',\n action: 'gitlab:projectDeployToken:create',\n name: 'Create GitLab Project Deploy Token',\n input: {\n repoUrl: 'gitlab.com?repo=repo&owner=owner',\n projectId: '789',\n name: 'tokenname',\n scopes: ['read_registry', 'write_repository'],\n },\n },\n ],\n }),\n },\n {\n description: 'Create a GitLab project deploy token with a specified name.',\n example: yaml.stringify({\n steps: [\n {\n id: 'createDeployToken',\n action: 'gitlab:projectDeployToken:create',\n name: 'Create GitLab Project Deploy Token',\n input: {\n repoUrl: 'gitlab.com?repo=repo&owner=owner',\n projectId: '101112',\n name: 'my-custom-token',\n },\n },\n ],\n }),\n },\n {\n description:\n 'Create a GitLab project deploy token with a numeric project ID.',\n example: yaml.stringify({\n steps: [\n {\n id: 'createDeployToken',\n action: 'gitlab:projectDeployToken:create',\n name: 'Create GitLab Project Deploy Token',\n input: {\n repoUrl: 'gitlab.com?repo=repo&owner=owner',\n projectId: 42,\n name: 'tokenname',\n },\n },\n ],\n }),\n },\n\n {\n description: 'Create a GitLab project deploy token with a custom username',\n example: yaml.stringify({\n steps: [\n {\n id: 'createDeployToken',\n action: 'gitlab:projectDeployToken:create',\n name: 'Create GitLab Project Deploy Token',\n input: {\n repoUrl: 'gitlab.com?repo=repo&owner=owner',\n projectId: 42,\n name: 'tokenname',\n username: 'tokenuser',\n },\n },\n ],\n }),\n },\n];\n"],"names":["yaml"],"mappings":";;;;;;;;AAkBO,MAAM,QAA8B,GAAA;AAAA,EACzC;AAAA,IACE,WAAa,EAAA,4DAAA;AAAA,IACb,OAAA,EAASA,sBAAK,SAAU,CAAA;AAAA,MACtB,KAAO,EAAA;AAAA,QACL;AAAA,UACE,EAAI,EAAA,mBAAA;AAAA,UACJ,MAAQ,EAAA,kCAAA;AAAA,UACR,IAAM,EAAA,oCAAA;AAAA,UACN,KAAO,EAAA;AAAA,YACL,OAAS,EAAA,kCAAA;AAAA,YACT,SAAW,EAAA,KAAA;AAAA,YACX,IAAM,EAAA;AAAA;AACR;AACF;AACF,KACD;AAAA,GACH;AAAA,EACA;AAAA,IACE,WAAa,EAAA,0DAAA;AAAA,IACb,OAAA,EAASA,sBAAK,SAAU,CAAA;AAAA,MACtB,KAAO,EAAA;AAAA,QACL;AAAA,UACE,EAAI,EAAA,mBAAA;AAAA,UACJ,MAAQ,EAAA,kCAAA;AAAA,UACR,IAAM,EAAA,oCAAA;AAAA,UACN,KAAO,EAAA;AAAA,YACL,OAAS,EAAA,kCAAA;AAAA,YACT,SAAW,EAAA,KAAA;AAAA,YACX,IAAM,EAAA,WAAA;AAAA,YACN,MAAA,EAAQ,CAAC,eAAA,EAAiB,kBAAkB;AAAA;AAC9C;AACF;AACF,KACD;AAAA,GACH;AAAA,EACA;AAAA,IACE,WAAa,EAAA,6DAAA;AAAA,IACb,OAAA,EAASA,sBAAK,SAAU,CAAA;AAAA,MACtB,KAAO,EAAA;AAAA,QACL;AAAA,UACE,EAAI,EAAA,mBAAA;AAAA,UACJ,MAAQ,EAAA,kCAAA;AAAA,UACR,IAAM,EAAA,oCAAA;AAAA,UACN,KAAO,EAAA;AAAA,YACL,OAAS,EAAA,kCAAA;AAAA,YACT,SAAW,EAAA,QAAA;AAAA,YACX,IAAM,EAAA;AAAA;AACR;AACF;AACF,KACD;AAAA,GACH;AAAA,EACA;AAAA,IACE,WACE,EAAA,iEAAA;AAAA,IACF,OAAA,EAASA,sBAAK,SAAU,CAAA;AAAA,MACtB,KAAO,EAAA;AAAA,QACL;AAAA,UACE,EAAI,EAAA,mBAAA;AAAA,UACJ,MAAQ,EAAA,kCAAA;AAAA,UACR,IAAM,EAAA,oCAAA;AAAA,UACN,KAAO,EAAA;AAAA,YACL,OAAS,EAAA,kCAAA;AAAA,YACT,SAAW,EAAA,EAAA;AAAA,YACX,IAAM,EAAA;AAAA;AACR;AACF;AACF,KACD;AAAA,GACH;AAAA,EAEA;AAAA,IACE,WAAa,EAAA,6DAAA;AAAA,IACb,OAAA,EAASA,sBAAK,SAAU,CAAA;AAAA,MACtB,KAAO,EAAA;AAAA,QACL;AAAA,UACE,EAAI,EAAA,mBAAA;AAAA,UACJ,MAAQ,EAAA,kCAAA;AAAA,UACR,IAAM,EAAA,oCAAA;AAAA,UACN,KAAO,EAAA;AAAA,YACL,OAAS,EAAA,kCAAA;AAAA,YACT,SAAW,EAAA,EAAA;AAAA,YACX,IAAM,EAAA,WAAA;AAAA,YACN,QAAU,EAAA;AAAA;AACZ;AACF;AACF,KACD;AAAA;AAEL;;;;"}
1
+ {"version":3,"file":"gitlabProjectDeployTokenCreate.examples.cjs.js","sources":["../../src/actions/gitlabProjectDeployTokenCreate.examples.ts"],"sourcesContent":["/*\n * Copyright 2023 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 */\nimport { TemplateExample } from '@backstage/plugin-scaffolder-node';\nimport yaml from 'yaml';\n\nexport const examples: TemplateExample[] = [\n {\n description: 'Create a GitLab project deploy token with minimal options.',\n example: yaml.stringify({\n steps: [\n {\n id: 'createDeployToken',\n action: 'gitlab:projectDeployToken:create',\n name: 'Create GitLab Project Deploy Token',\n input: {\n repoUrl: 'gitlab.com?repo=repo&owner=owner',\n projectId: '456',\n name: 'tokenname',\n scopes: ['read_registry'],\n },\n },\n ],\n }),\n },\n {\n description:\n 'Create a GitLab project deploy token with many custom scopes.',\n example: yaml.stringify({\n steps: [\n {\n id: 'createDeployToken',\n action: 'gitlab:projectDeployToken:create',\n name: 'Create GitLab Project Deploy Token',\n input: {\n repoUrl: 'gitlab.com?repo=repo&owner=owner',\n projectId: '789',\n name: 'tokenname',\n scopes: ['read_registry', 'write_repository'],\n },\n },\n ],\n }),\n },\n {\n description: 'Create a GitLab project deploy token with a specified name.',\n example: yaml.stringify({\n steps: [\n {\n id: 'createDeployToken',\n action: 'gitlab:projectDeployToken:create',\n name: 'Create GitLab Project Deploy Token',\n input: {\n repoUrl: 'gitlab.com?repo=repo&owner=owner',\n projectId: '101112',\n name: 'my-custom-token',\n scopes: ['read_registry'],\n },\n },\n ],\n }),\n },\n {\n description:\n 'Create a GitLab project deploy token with a numeric project ID.',\n example: yaml.stringify({\n steps: [\n {\n id: 'createDeployToken',\n action: 'gitlab:projectDeployToken:create',\n name: 'Create GitLab Project Deploy Token',\n input: {\n repoUrl: 'gitlab.com?repo=repo&owner=owner',\n projectId: 42,\n name: 'tokenname',\n scopes: ['read_registry'],\n },\n },\n ],\n }),\n },\n\n {\n description: 'Create a GitLab project deploy token with a custom username',\n example: yaml.stringify({\n steps: [\n {\n id: 'createDeployToken',\n action: 'gitlab:projectDeployToken:create',\n name: 'Create GitLab Project Deploy Token',\n input: {\n repoUrl: 'gitlab.com?repo=repo&owner=owner',\n projectId: 42,\n name: 'tokenname',\n username: 'tokenuser',\n scopes: ['read_registry'],\n },\n },\n ],\n }),\n },\n];\n"],"names":["yaml"],"mappings":";;;;;;;;AAkBO,MAAM,QAA8B,GAAA;AAAA,EACzC;AAAA,IACE,WAAa,EAAA,4DAAA;AAAA,IACb,OAAA,EAASA,sBAAK,SAAU,CAAA;AAAA,MACtB,KAAO,EAAA;AAAA,QACL;AAAA,UACE,EAAI,EAAA,mBAAA;AAAA,UACJ,MAAQ,EAAA,kCAAA;AAAA,UACR,IAAM,EAAA,oCAAA;AAAA,UACN,KAAO,EAAA;AAAA,YACL,OAAS,EAAA,kCAAA;AAAA,YACT,SAAW,EAAA,KAAA;AAAA,YACX,IAAM,EAAA,WAAA;AAAA,YACN,MAAA,EAAQ,CAAC,eAAe;AAAA;AAC1B;AACF;AACF,KACD;AAAA,GACH;AAAA,EACA;AAAA,IACE,WACE,EAAA,+DAAA;AAAA,IACF,OAAA,EAASA,sBAAK,SAAU,CAAA;AAAA,MACtB,KAAO,EAAA;AAAA,QACL;AAAA,UACE,EAAI,EAAA,mBAAA;AAAA,UACJ,MAAQ,EAAA,kCAAA;AAAA,UACR,IAAM,EAAA,oCAAA;AAAA,UACN,KAAO,EAAA;AAAA,YACL,OAAS,EAAA,kCAAA;AAAA,YACT,SAAW,EAAA,KAAA;AAAA,YACX,IAAM,EAAA,WAAA;AAAA,YACN,MAAA,EAAQ,CAAC,eAAA,EAAiB,kBAAkB;AAAA;AAC9C;AACF;AACF,KACD;AAAA,GACH;AAAA,EACA;AAAA,IACE,WAAa,EAAA,6DAAA;AAAA,IACb,OAAA,EAASA,sBAAK,SAAU,CAAA;AAAA,MACtB,KAAO,EAAA;AAAA,QACL;AAAA,UACE,EAAI,EAAA,mBAAA;AAAA,UACJ,MAAQ,EAAA,kCAAA;AAAA,UACR,IAAM,EAAA,oCAAA;AAAA,UACN,KAAO,EAAA;AAAA,YACL,OAAS,EAAA,kCAAA;AAAA,YACT,SAAW,EAAA,QAAA;AAAA,YACX,IAAM,EAAA,iBAAA;AAAA,YACN,MAAA,EAAQ,CAAC,eAAe;AAAA;AAC1B;AACF;AACF,KACD;AAAA,GACH;AAAA,EACA;AAAA,IACE,WACE,EAAA,iEAAA;AAAA,IACF,OAAA,EAASA,sBAAK,SAAU,CAAA;AAAA,MACtB,KAAO,EAAA;AAAA,QACL;AAAA,UACE,EAAI,EAAA,mBAAA;AAAA,UACJ,MAAQ,EAAA,kCAAA;AAAA,UACR,IAAM,EAAA,oCAAA;AAAA,UACN,KAAO,EAAA;AAAA,YACL,OAAS,EAAA,kCAAA;AAAA,YACT,SAAW,EAAA,EAAA;AAAA,YACX,IAAM,EAAA,WAAA;AAAA,YACN,MAAA,EAAQ,CAAC,eAAe;AAAA;AAC1B;AACF;AACF,KACD;AAAA,GACH;AAAA,EAEA;AAAA,IACE,WAAa,EAAA,6DAAA;AAAA,IACb,OAAA,EAASA,sBAAK,SAAU,CAAA;AAAA,MACtB,KAAO,EAAA;AAAA,QACL;AAAA,UACE,EAAI,EAAA,mBAAA;AAAA,UACJ,MAAQ,EAAA,kCAAA;AAAA,UACR,IAAM,EAAA,oCAAA;AAAA,UACN,KAAO,EAAA;AAAA,YACL,OAAS,EAAA,kCAAA;AAAA,YACT,SAAW,EAAA,EAAA;AAAA,YACX,IAAM,EAAA,WAAA;AAAA,YACN,QAAU,EAAA,WAAA;AAAA,YACV,MAAA,EAAQ,CAAC,eAAe;AAAA;AAC1B;AACF;AACF,KACD;AAAA;AAEL;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"gitlabRepoPush.cjs.js","sources":["../../src/actions/gitlabRepoPush.ts"],"sourcesContent":["/*\n * Copyright 2023 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 {\n createTemplateAction,\n parseRepoUrl,\n serializeDirectoryContents,\n} from '@backstage/plugin-scaffolder-node';\nimport { Types } from '@gitbeaker/core';\nimport path from 'path';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { InputError } from '@backstage/errors';\nimport { resolveSafeChildPath } from '@backstage/backend-plugin-api';\nimport { createGitlabApi, getErrorMessage } from './helpers';\nimport { examples } from './gitlabRepoPush.examples';\n\n/**\n * Create a new action that commits into a gitlab repository.\n *\n * @public\n */\nexport const createGitlabRepoPushAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n\n return createTemplateAction<{\n repoUrl: string;\n branchName: string;\n commitMessage: string;\n sourcePath?: string;\n targetPath?: string;\n token?: string;\n commitAction?: 'create' | 'delete' | 'update';\n }>({\n id: 'gitlab:repo:push',\n examples,\n schema: {\n input: {\n required: ['repoUrl', 'branchName', 'commitMessage'],\n type: 'object',\n properties: {\n repoUrl: {\n type: 'string',\n title: 'Repository Location',\n description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`,\n },\n branchName: {\n type: 'string',\n title: 'Source Branch Name',\n description: 'The branch name for the commit',\n },\n commitMessage: {\n type: 'string',\n title: 'Commit Message',\n description: `The commit message`,\n },\n sourcePath: {\n type: 'string',\n title: 'Working Subdirectory',\n description:\n 'Subdirectory of working directory to copy changes from',\n },\n targetPath: {\n type: 'string',\n title: 'Repository Subdirectory',\n description: 'Subdirectory of repository to apply changes to',\n },\n token: {\n title: 'Authentication Token',\n type: 'string',\n description: 'The token to use for authorization to GitLab',\n },\n commitAction: {\n title: 'Commit action',\n type: 'string',\n enum: ['create', 'update', 'delete'],\n description:\n 'The action to be used for git commit. Defaults to create.',\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n projectid: {\n title: 'Gitlab Project id/Name(slug)',\n type: 'string',\n },\n projectPath: {\n title: 'Gitlab Project path',\n type: 'string',\n },\n commitHash: {\n title: 'The git commit hash of the commit',\n type: 'string',\n },\n },\n },\n },\n async handler(ctx) {\n const {\n branchName,\n repoUrl,\n targetPath,\n sourcePath,\n token,\n commitAction,\n } = ctx.input;\n\n const { owner, repo, project } = parseRepoUrl(repoUrl, integrations);\n const repoID = project ? project : `${owner}/${repo}`;\n\n const api = createGitlabApi({\n integrations,\n token,\n repoUrl,\n });\n\n let fileRoot: string;\n if (sourcePath) {\n fileRoot = resolveSafeChildPath(ctx.workspacePath, sourcePath);\n } else {\n fileRoot = ctx.workspacePath;\n }\n\n const fileContents = await serializeDirectoryContents(fileRoot, {\n gitignore: true,\n });\n\n const actions: Types.CommitAction[] = fileContents.map(file => ({\n action: commitAction ?? 'create',\n filePath: targetPath\n ? path.posix.join(targetPath, file.path)\n : file.path,\n encoding: 'base64',\n content: file.content.toString('base64'),\n execute_filemode: file.executable,\n }));\n\n let branchExists = false;\n try {\n await api.Branches.show(repoID, branchName);\n branchExists = true;\n } catch (e: any) {\n if (e.response?.statusCode !== 404) {\n throw new InputError(\n `Failed to check status of branch '${branchName}'. Please make sure that branch already exists or Backstage has permissions to create one. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n\n if (!branchExists) {\n // create a branch using the default branch as ref\n try {\n const projects = await api.Projects.show(repoID);\n const { default_branch: defaultBranch } = projects;\n await api.Branches.create(repoID, branchName, String(defaultBranch));\n } catch (e) {\n throw new InputError(\n `The branch '${branchName}' was not found and creation failed with error. Please make sure that branch already exists or Backstage has permissions to create one. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n\n try {\n const commit = await api.Commits.create(\n repoID,\n branchName,\n ctx.input.commitMessage,\n actions,\n );\n ctx.output('projectid', repoID);\n ctx.output('projectPath', repoID);\n ctx.output('commitHash', commit.id);\n } catch (e) {\n throw new InputError(\n `Committing the changes to ${branchName} failed. Please check that none of the files created by the template already exists. ${getErrorMessage(\n e,\n )}`,\n );\n }\n },\n });\n};\n"],"names":["createTemplateAction","examples","parseRepoUrl","createGitlabApi","resolveSafeChildPath","serializeDirectoryContents","path","InputError","getErrorMessage"],"mappings":";;;;;;;;;;;;;AAkCa,MAAA,0BAAA,GAA6B,CAAC,OAErC,KAAA;AACJ,EAAM,MAAA,EAAE,cAAiB,GAAA,OAAA;AAEzB,EAAA,OAAOA,yCAQJ,CAAA;AAAA,IACD,EAAI,EAAA,kBAAA;AAAA,cACJC,gCAAA;AAAA,IACA,MAAQ,EAAA;AAAA,MACN,KAAO,EAAA;AAAA,QACL,QAAU,EAAA,CAAC,SAAW,EAAA,YAAA,EAAc,eAAe,CAAA;AAAA,QACnD,IAAM,EAAA,QAAA;AAAA,QACN,UAAY,EAAA;AAAA,UACV,OAAS,EAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,YACN,KAAO,EAAA,qBAAA;AAAA,YACP,WAAa,EAAA,CAAA,sJAAA;AAAA,WACf;AAAA,UACA,UAAY,EAAA;AAAA,YACV,IAAM,EAAA,QAAA;AAAA,YACN,KAAO,EAAA,oBAAA;AAAA,YACP,WAAa,EAAA;AAAA,WACf;AAAA,UACA,aAAe,EAAA;AAAA,YACb,IAAM,EAAA,QAAA;AAAA,YACN,KAAO,EAAA,gBAAA;AAAA,YACP,WAAa,EAAA,CAAA,kBAAA;AAAA,WACf;AAAA,UACA,UAAY,EAAA;AAAA,YACV,IAAM,EAAA,QAAA;AAAA,YACN,KAAO,EAAA,sBAAA;AAAA,YACP,WACE,EAAA;AAAA,WACJ;AAAA,UACA,UAAY,EAAA;AAAA,YACV,IAAM,EAAA,QAAA;AAAA,YACN,KAAO,EAAA,yBAAA;AAAA,YACP,WAAa,EAAA;AAAA,WACf;AAAA,UACA,KAAO,EAAA;AAAA,YACL,KAAO,EAAA,sBAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,YACN,WAAa,EAAA;AAAA,WACf;AAAA,UACA,YAAc,EAAA;AAAA,YACZ,KAAO,EAAA,eAAA;AAAA,YACP,IAAM,EAAA,QAAA;AAAA,YACN,IAAM,EAAA,CAAC,QAAU,EAAA,QAAA,EAAU,QAAQ,CAAA;AAAA,YACnC,WACE,EAAA;AAAA;AACJ;AACF,OACF;AAAA,MACA,MAAQ,EAAA;AAAA,QACN,IAAM,EAAA,QAAA;AAAA,QACN,UAAY,EAAA;AAAA,UACV,SAAW,EAAA;AAAA,YACT,KAAO,EAAA,8BAAA;AAAA,YACP,IAAM,EAAA;AAAA,WACR;AAAA,UACA,WAAa,EAAA;AAAA,YACX,KAAO,EAAA,qBAAA;AAAA,YACP,IAAM,EAAA;AAAA,WACR;AAAA,UACA,UAAY,EAAA;AAAA,YACV,KAAO,EAAA,mCAAA;AAAA,YACP,IAAM,EAAA;AAAA;AACR;AACF;AACF,KACF;AAAA,IACA,MAAM,QAAQ,GAAK,EAAA;AACjB,MAAM,MAAA;AAAA,QACJ,UAAA;AAAA,QACA,OAAA;AAAA,QACA,UAAA;AAAA,QACA,UAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,UACE,GAAI,CAAA,KAAA;AAER,MAAA,MAAM,EAAE,KAAO,EAAA,IAAA,EAAM,SAAY,GAAAC,iCAAA,CAAa,SAAS,YAAY,CAAA;AACnE,MAAA,MAAM,SAAS,OAAU,GAAA,OAAA,GAAU,CAAG,EAAA,KAAK,IAAI,IAAI,CAAA,CAAA;AAEnD,MAAA,MAAM,MAAMC,uBAAgB,CAAA;AAAA,QAC1B,YAAA;AAAA,QACA,KAAA;AAAA,QACA;AAAA,OACD,CAAA;AAED,MAAI,IAAA,QAAA;AACJ,MAAA,IAAI,UAAY,EAAA;AACd,QAAW,QAAA,GAAAC,qCAAA,CAAqB,GAAI,CAAA,aAAA,EAAe,UAAU,CAAA;AAAA,OACxD,MAAA;AACL,QAAA,QAAA,GAAW,GAAI,CAAA,aAAA;AAAA;AAGjB,MAAM,MAAA,YAAA,GAAe,MAAMC,+CAAA,CAA2B,QAAU,EAAA;AAAA,QAC9D,SAAW,EAAA;AAAA,OACZ,CAAA;AAED,MAAM,MAAA,OAAA,GAAgC,YAAa,CAAA,GAAA,CAAI,CAAS,IAAA,MAAA;AAAA,QAC9D,QAAQ,YAAgB,IAAA,QAAA;AAAA,QACxB,QAAA,EAAU,aACNC,qBAAK,CAAA,KAAA,CAAM,KAAK,UAAY,EAAA,IAAA,CAAK,IAAI,CAAA,GACrC,IAAK,CAAA,IAAA;AAAA,QACT,QAAU,EAAA,QAAA;AAAA,QACV,OAAS,EAAA,IAAA,CAAK,OAAQ,CAAA,QAAA,CAAS,QAAQ,CAAA;AAAA,QACvC,kBAAkB,IAAK,CAAA;AAAA,OACvB,CAAA,CAAA;AAEF,MAAA,IAAI,YAAe,GAAA,KAAA;AACnB,MAAI,IAAA;AACF,QAAA,MAAM,GAAI,CAAA,QAAA,CAAS,IAAK,CAAA,MAAA,EAAQ,UAAU,CAAA;AAC1C,QAAe,YAAA,GAAA,IAAA;AAAA,eACR,CAAQ,EAAA;AACf,QAAI,IAAA,CAAA,CAAE,QAAU,EAAA,UAAA,KAAe,GAAK,EAAA;AAClC,UAAA,MAAM,IAAIC,iBAAA;AAAA,YACR,CAAA,kCAAA,EAAqC,UAAU,CAA8F,2FAAA,EAAAC,uBAAA;AAAA,cAC3I;AAAA,aACD,CAAA;AAAA,WACH;AAAA;AACF;AAGF,MAAA,IAAI,CAAC,YAAc,EAAA;AAEjB,QAAI,IAAA;AACF,UAAA,MAAM,QAAW,GAAA,MAAM,GAAI,CAAA,QAAA,CAAS,KAAK,MAAM,CAAA;AAC/C,UAAM,MAAA,EAAE,cAAgB,EAAA,aAAA,EAAkB,GAAA,QAAA;AAC1C,UAAA,MAAM,IAAI,QAAS,CAAA,MAAA,CAAO,QAAQ,UAAY,EAAA,MAAA,CAAO,aAAa,CAAC,CAAA;AAAA,iBAC5D,CAAG,EAAA;AACV,UAAA,MAAM,IAAID,iBAAA;AAAA,YACR,CAAA,YAAA,EAAe,UAAU,CAA2I,wIAAA,EAAAC,uBAAA;AAAA,cAClK;AAAA,aACD,CAAA;AAAA,WACH;AAAA;AACF;AAGF,MAAI,IAAA;AACF,QAAM,MAAA,MAAA,GAAS,MAAM,GAAA,CAAI,OAAQ,CAAA,MAAA;AAAA,UAC/B,MAAA;AAAA,UACA,UAAA;AAAA,UACA,IAAI,KAAM,CAAA,aAAA;AAAA,UACV;AAAA,SACF;AACA,QAAI,GAAA,CAAA,MAAA,CAAO,aAAa,MAAM,CAAA;AAC9B,QAAI,GAAA,CAAA,MAAA,CAAO,eAAe,MAAM,CAAA;AAChC,QAAI,GAAA,CAAA,MAAA,CAAO,YAAc,EAAA,MAAA,CAAO,EAAE,CAAA;AAAA,eAC3B,CAAG,EAAA;AACV,QAAA,MAAM,IAAID,iBAAA;AAAA,UACR,CAAA,0BAAA,EAA6B,UAAU,CAAwF,qFAAA,EAAAC,uBAAA;AAAA,YAC7H;AAAA,WACD,CAAA;AAAA,SACH;AAAA;AACF;AACF,GACD,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"gitlabRepoPush.cjs.js","sources":["../../src/actions/gitlabRepoPush.ts"],"sourcesContent":["/*\n * Copyright 2023 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 {\n createTemplateAction,\n parseRepoUrl,\n serializeDirectoryContents,\n} from '@backstage/plugin-scaffolder-node';\nimport { CommitAction } from '@gitbeaker/rest';\nimport path from 'path';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { InputError } from '@backstage/errors';\nimport { resolveSafeChildPath } from '@backstage/backend-plugin-api';\nimport { createGitlabApi, getErrorMessage } from './helpers';\nimport { examples } from './gitlabRepoPush.examples';\n\n/**\n * Create a new action that commits into a gitlab repository.\n *\n * @public\n */\nexport const createGitlabRepoPushAction = (options: {\n integrations: ScmIntegrationRegistry;\n}) => {\n const { integrations } = options;\n\n return createTemplateAction<{\n repoUrl: string;\n branchName: string;\n commitMessage: string;\n sourcePath?: string;\n targetPath?: string;\n token?: string;\n commitAction?: 'create' | 'delete' | 'update';\n }>({\n id: 'gitlab:repo:push',\n examples,\n schema: {\n input: {\n required: ['repoUrl', 'branchName', 'commitMessage'],\n type: 'object',\n properties: {\n repoUrl: {\n type: 'string',\n title: 'Repository Location',\n description: `Accepts the format 'gitlab.com?repo=project_name&owner=group_name' where 'project_name' is the repository name and 'group_name' is a group or username`,\n },\n branchName: {\n type: 'string',\n title: 'Source Branch Name',\n description: 'The branch name for the commit',\n },\n commitMessage: {\n type: 'string',\n title: 'Commit Message',\n description: `The commit message`,\n },\n sourcePath: {\n type: 'string',\n title: 'Working Subdirectory',\n description:\n 'Subdirectory of working directory to copy changes from',\n },\n targetPath: {\n type: 'string',\n title: 'Repository Subdirectory',\n description: 'Subdirectory of repository to apply changes to',\n },\n token: {\n title: 'Authentication Token',\n type: 'string',\n description: 'The token to use for authorization to GitLab',\n },\n commitAction: {\n title: 'Commit action',\n type: 'string',\n enum: ['create', 'update', 'delete'],\n description:\n 'The action to be used for git commit. Defaults to create.',\n },\n },\n },\n output: {\n type: 'object',\n properties: {\n projectid: {\n title: 'Gitlab Project id/Name(slug)',\n type: 'string',\n },\n projectPath: {\n title: 'Gitlab Project path',\n type: 'string',\n },\n commitHash: {\n title: 'The git commit hash of the commit',\n type: 'string',\n },\n },\n },\n },\n async handler(ctx) {\n const {\n branchName,\n repoUrl,\n targetPath,\n sourcePath,\n token,\n commitAction,\n } = ctx.input;\n\n const { owner, repo, project } = parseRepoUrl(repoUrl, integrations);\n const repoID = project ? project : `${owner}/${repo}`;\n\n const api = createGitlabApi({\n integrations,\n token,\n repoUrl,\n });\n\n let fileRoot: string;\n if (sourcePath) {\n fileRoot = resolveSafeChildPath(ctx.workspacePath, sourcePath);\n } else {\n fileRoot = ctx.workspacePath;\n }\n\n const fileContents = await serializeDirectoryContents(fileRoot, {\n gitignore: true,\n });\n\n const actions: CommitAction[] = fileContents.map(file => ({\n action: commitAction ?? 'create',\n filePath: targetPath\n ? path.posix.join(targetPath, file.path)\n : file.path,\n encoding: 'base64',\n content: file.content.toString('base64'),\n execute_filemode: file.executable,\n }));\n\n let branchExists = false;\n try {\n await api.Branches.show(repoID, branchName);\n branchExists = true;\n } catch (e: any) {\n if (e.response?.statusCode !== 404) {\n throw new InputError(\n `Failed to check status of branch '${branchName}'. Please make sure that branch already exists or Backstage has permissions to create one. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n\n if (!branchExists) {\n // create a branch using the default branch as ref\n try {\n const projects = await api.Projects.show(repoID);\n const { default_branch: defaultBranch } = projects;\n await api.Branches.create(repoID, branchName, String(defaultBranch));\n } catch (e) {\n throw new InputError(\n `The branch '${branchName}' was not found and creation failed with error. Please make sure that branch already exists or Backstage has permissions to create one. ${getErrorMessage(\n e,\n )}`,\n );\n }\n }\n\n try {\n const commit = await api.Commits.create(\n repoID,\n branchName,\n ctx.input.commitMessage,\n actions,\n );\n ctx.output('projectid', repoID);\n ctx.output('projectPath', repoID);\n ctx.output('commitHash', commit.id);\n } catch (e) {\n throw new InputError(\n `Committing the changes to ${branchName} failed. Please check that none of the files created by the template already exists. ${getErrorMessage(\n e,\n )}`,\n );\n }\n },\n });\n};\n"],"names":["createTemplateAction","examples","parseRepoUrl","createGitlabApi","resolveSafeChildPath","serializeDirectoryContents","path","InputError","getErrorMessage"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  var pluginScaffolderNode = require('@backstage/plugin-scaffolder-node');
4
4
  var errors = require('@backstage/errors');
5
- var node = require('@gitbeaker/node');
5
+ var rest = require('@gitbeaker/rest');
6
6
 
7
7
  function createGitlabApi(options) {
8
8
  const { integrations, token: providedToken, repoUrl } = options;
@@ -18,7 +18,7 @@ function createGitlabApi(options) {
18
18
  }
19
19
  const token = providedToken ?? integrationConfig.config.token;
20
20
  const tokenType = providedToken ? "oauthToken" : "token";
21
- return new node.Gitlab({
21
+ return new rest.Gitlab({
22
22
  host: integrationConfig.config.baseUrl,
23
23
  [tokenType]: token
24
24
  });
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.cjs.js","sources":["../../src/actions/helpers.ts"],"sourcesContent":["/*\n * Copyright 2023 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 */\nimport { parseRepoUrl } from '@backstage/plugin-scaffolder-node';\nimport { ErrorLike, InputError, isError } from '@backstage/errors';\nimport { Gitlab } from '@gitbeaker/node';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { Resources } from '@gitbeaker/core';\n\nexport function createGitlabApi(options: {\n integrations: ScmIntegrationRegistry;\n token?: string;\n repoUrl: string;\n}): Resources.Gitlab {\n const { integrations, token: providedToken, repoUrl } = options;\n\n const { host } = parseRepoUrl(repoUrl, integrations);\n\n const integrationConfig = integrations.gitlab.byHost(host);\n\n if (!integrationConfig) {\n throw new InputError(\n `No matching integration configuration for host ${host}, please check your integrations config`,\n );\n }\n\n if (!integrationConfig.config.token && !providedToken) {\n throw new InputError(`No token available for host ${host}`);\n }\n\n const token = providedToken ?? integrationConfig.config.token!;\n const tokenType = providedToken ? 'oauthToken' : 'token';\n\n return new Gitlab({\n host: integrationConfig.config.baseUrl,\n [tokenType]: token,\n });\n}\n\ninterface GitlabError extends ErrorLike {\n // Errors from Gitlab may also include a description field that contains additional info\n description: string;\n}\n\nfunction isGitlabError(e: unknown): e is GitlabError {\n return isError(e) && 'description' in e && typeof e.description === 'string';\n}\n\nexport function getErrorMessage(e: unknown): string {\n if (isGitlabError(e)) return `${e} - ${e.description}`;\n return String(e);\n}\n"],"names":["parseRepoUrl","InputError","Gitlab","isError"],"mappings":";;;;;;AAqBO,SAAS,gBAAgB,OAIX,EAAA;AACnB,EAAA,MAAM,EAAE,YAAA,EAAc,KAAO,EAAA,aAAA,EAAe,SAAY,GAAA,OAAA;AAExD,EAAA,MAAM,EAAE,IAAA,EAAS,GAAAA,iCAAA,CAAa,SAAS,YAAY,CAAA;AAEnD,EAAA,MAAM,iBAAoB,GAAA,YAAA,CAAa,MAAO,CAAA,MAAA,CAAO,IAAI,CAAA;AAEzD,EAAA,IAAI,CAAC,iBAAmB,EAAA;AACtB,IAAA,MAAM,IAAIC,iBAAA;AAAA,MACR,kDAAkD,IAAI,CAAA,uCAAA;AAAA,KACxD;AAAA;AAGF,EAAA,IAAI,CAAC,iBAAA,CAAkB,MAAO,CAAA,KAAA,IAAS,CAAC,aAAe,EAAA;AACrD,IAAA,MAAM,IAAIA,iBAAA,CAAW,CAA+B,4BAAA,EAAA,IAAI,CAAE,CAAA,CAAA;AAAA;AAG5D,EAAM,MAAA,KAAA,GAAQ,aAAiB,IAAA,iBAAA,CAAkB,MAAO,CAAA,KAAA;AACxD,EAAM,MAAA,SAAA,GAAY,gBAAgB,YAAe,GAAA,OAAA;AAEjD,EAAA,OAAO,IAAIC,WAAO,CAAA;AAAA,IAChB,IAAA,EAAM,kBAAkB,MAAO,CAAA,OAAA;AAAA,IAC/B,CAAC,SAAS,GAAG;AAAA,GACd,CAAA;AACH;AAOA,SAAS,cAAc,CAA8B,EAAA;AACnD,EAAA,OAAOC,eAAQ,CAAC,CAAA,IAAK,iBAAiB,CAAK,IAAA,OAAO,EAAE,WAAgB,KAAA,QAAA;AACtE;AAEO,SAAS,gBAAgB,CAAoB,EAAA;AAClD,EAAI,IAAA,aAAA,CAAc,CAAC,CAAG,EAAA,OAAO,GAAG,CAAC,CAAA,GAAA,EAAM,EAAE,WAAW,CAAA,CAAA;AACpD,EAAA,OAAO,OAAO,CAAC,CAAA;AACjB;;;;;"}
1
+ {"version":3,"file":"helpers.cjs.js","sources":["../../src/actions/helpers.ts"],"sourcesContent":["/*\n * Copyright 2023 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 */\nimport { parseRepoUrl } from '@backstage/plugin-scaffolder-node';\nimport { ErrorLike, InputError, isError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { Gitlab } from '@gitbeaker/rest';\n\nexport function createGitlabApi(options: {\n integrations: ScmIntegrationRegistry;\n token?: string;\n repoUrl: string;\n}): InstanceType<typeof Gitlab> {\n const { integrations, token: providedToken, repoUrl } = options;\n\n const { host } = parseRepoUrl(repoUrl, integrations);\n\n const integrationConfig = integrations.gitlab.byHost(host);\n\n if (!integrationConfig) {\n throw new InputError(\n `No matching integration configuration for host ${host}, please check your integrations config`,\n );\n }\n\n if (!integrationConfig.config.token && !providedToken) {\n throw new InputError(`No token available for host ${host}`);\n }\n\n const token = providedToken ?? integrationConfig.config.token!;\n const tokenType = providedToken ? 'oauthToken' : 'token';\n\n return new Gitlab({\n host: integrationConfig.config.baseUrl,\n [tokenType]: token,\n });\n}\n\ninterface GitlabError extends ErrorLike {\n // Errors from Gitlab may also include a description field that contains additional info\n description: string;\n}\n\nfunction isGitlabError(e: unknown): e is GitlabError {\n return isError(e) && 'description' in e && typeof e.description === 'string';\n}\n\nexport function getErrorMessage(e: unknown): string {\n if (isGitlabError(e)) return `${e} - ${e.description}`;\n return String(e);\n}\n"],"names":["parseRepoUrl","InputError","Gitlab","isError"],"mappings":";;;;;;AAoBO,SAAS,gBAAgB,OAIA,EAAA;AAC9B,EAAA,MAAM,EAAE,YAAA,EAAc,KAAO,EAAA,aAAA,EAAe,SAAY,GAAA,OAAA;AAExD,EAAA,MAAM,EAAE,IAAA,EAAS,GAAAA,iCAAA,CAAa,SAAS,YAAY,CAAA;AAEnD,EAAA,MAAM,iBAAoB,GAAA,YAAA,CAAa,MAAO,CAAA,MAAA,CAAO,IAAI,CAAA;AAEzD,EAAA,IAAI,CAAC,iBAAmB,EAAA;AACtB,IAAA,MAAM,IAAIC,iBAAA;AAAA,MACR,kDAAkD,IAAI,CAAA,uCAAA;AAAA,KACxD;AAAA;AAGF,EAAA,IAAI,CAAC,iBAAA,CAAkB,MAAO,CAAA,KAAA,IAAS,CAAC,aAAe,EAAA;AACrD,IAAA,MAAM,IAAIA,iBAAA,CAAW,CAA+B,4BAAA,EAAA,IAAI,CAAE,CAAA,CAAA;AAAA;AAG5D,EAAM,MAAA,KAAA,GAAQ,aAAiB,IAAA,iBAAA,CAAkB,MAAO,CAAA,KAAA;AACxD,EAAM,MAAA,SAAA,GAAY,gBAAgB,YAAe,GAAA,OAAA;AAEjD,EAAA,OAAO,IAAIC,WAAO,CAAA;AAAA,IAChB,IAAA,EAAM,kBAAkB,MAAO,CAAA,OAAA;AAAA,IAC/B,CAAC,SAAS,GAAG;AAAA,GACd,CAAA;AACH;AAOA,SAAS,cAAc,CAA8B,EAAA;AACnD,EAAA,OAAOC,eAAQ,CAAC,CAAA,IAAK,iBAAiB,CAAK,IAAA,OAAO,EAAE,WAAgB,KAAA,QAAA;AACtE;AAEO,SAAS,gBAAgB,CAAoB,EAAA;AAClD,EAAI,IAAA,aAAA,CAAc,CAAC,CAAG,EAAA,OAAO,GAAG,CAAC,CAAA,GAAA,EAAM,EAAE,WAAW,CAAA,CAAA;AACpD,EAAA,OAAO,OAAO,CAAC,CAAA;AACjB;;;;;"}
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ var errors = require('@backstage/errors');
4
+ var util = require('../util.cjs.js');
5
+
6
+ function createHandleAutocompleteRequest(options) {
7
+ return async function handleAutocompleteRequest({
8
+ resource,
9
+ token,
10
+ context
11
+ }) {
12
+ const { integrations } = options;
13
+ const client = util.getClient({
14
+ host: context.host ?? "gitlab.com",
15
+ integrations,
16
+ token
17
+ });
18
+ switch (resource) {
19
+ case "groups": {
20
+ let groups = [];
21
+ let page = 1;
22
+ const perPage = 100;
23
+ let response = [];
24
+ let continueFetch = true;
25
+ while (continueFetch) {
26
+ response = await client.Groups.all({
27
+ pagination: "offset",
28
+ page,
29
+ perPage
30
+ });
31
+ groups = groups.concat(response);
32
+ if (response.length < perPage) continueFetch = false;
33
+ page++;
34
+ }
35
+ const result = {
36
+ results: groups.map((group) => ({
37
+ title: group.full_path,
38
+ id: group.id.toString()
39
+ }))
40
+ };
41
+ const user = await client.Users.showCurrentUser();
42
+ result.results.push({
43
+ title: user.username,
44
+ id: user.id.toString()
45
+ });
46
+ return result;
47
+ }
48
+ case "repositories": {
49
+ if (!context.id)
50
+ throw new errors.InputError("Missing groupId and userId context parameter");
51
+ let response;
52
+ if (context.id === (await client.Users.showCurrentUser())?.id.toString()) {
53
+ response = await client.Users.allProjects(context.id);
54
+ } else {
55
+ response = await client.Groups.allProjects(context.id);
56
+ }
57
+ return {
58
+ results: response.map((project) => ({
59
+ title: project.name.trim(),
60
+ id: project.id.toString()
61
+ }))
62
+ };
63
+ }
64
+ default:
65
+ throw new errors.InputError(`Invalid resource: ${resource}`);
66
+ }
67
+ };
68
+ }
69
+
70
+ exports.createHandleAutocompleteRequest = createHandleAutocompleteRequest;
71
+ //# sourceMappingURL=autocomplete.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"autocomplete.cjs.js","sources":["../../src/autocomplete/autocomplete.ts"],"sourcesContent":["/*\n * Copyright 2024 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 { InputError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { getClient } from '../util';\n\nexport function createHandleAutocompleteRequest(options: {\n integrations: ScmIntegrationRegistry;\n}) {\n return async function handleAutocompleteRequest({\n resource,\n token,\n context,\n }: {\n resource: string;\n token: string;\n context: Record<string, string>;\n }): Promise<{\n results: {\n title?: string;\n id: string;\n }[];\n }> {\n const { integrations } = options;\n const client = getClient({\n host: context.host ?? 'gitlab.com',\n integrations,\n token,\n });\n\n switch (resource) {\n case 'groups': {\n let groups: any[] = [];\n let page = 1;\n const perPage = 100;\n let response = [];\n let continueFetch = true;\n while (continueFetch) {\n response = await client.Groups.all({\n pagination: 'offset',\n page,\n perPage,\n });\n\n groups = groups.concat(response);\n if (response.length < perPage) continueFetch = false;\n page++;\n }\n\n const result: {\n results: {\n title: string;\n id: string;\n }[];\n } = {\n results: groups.map(group => ({\n title: group.full_path,\n id: group.id.toString(),\n })),\n };\n // append also user context\n const user = await client.Users.showCurrentUser();\n result.results.push({\n title: user.username,\n id: user.id.toString(),\n });\n\n return result;\n }\n case 'repositories': {\n if (!context.id)\n throw new InputError('Missing groupId and userId context parameter');\n\n let response;\n if (\n context.id === (await client.Users.showCurrentUser())?.id.toString()\n ) {\n response = await client.Users.allProjects(context.id);\n } else {\n response = await client.Groups.allProjects(context.id);\n }\n\n return {\n results: response.map(project => ({\n title: project.name.trim(),\n id: project.id.toString(),\n })),\n };\n }\n default:\n throw new InputError(`Invalid resource: ${resource}`);\n }\n };\n}\n"],"names":["getClient","InputError"],"mappings":";;;;;AAoBO,SAAS,gCAAgC,OAE7C,EAAA;AACD,EAAA,OAAO,eAAe,yBAA0B,CAAA;AAAA,IAC9C,QAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GAUC,EAAA;AACD,IAAM,MAAA,EAAE,cAAiB,GAAA,OAAA;AACzB,IAAA,MAAM,SAASA,cAAU,CAAA;AAAA,MACvB,IAAA,EAAM,QAAQ,IAAQ,IAAA,YAAA;AAAA,MACtB,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AAED,IAAA,QAAQ,QAAU;AAAA,MAChB,KAAK,QAAU,EAAA;AACb,QAAA,IAAI,SAAgB,EAAC;AACrB,QAAA,IAAI,IAAO,GAAA,CAAA;AACX,QAAA,MAAM,OAAU,GAAA,GAAA;AAChB,QAAA,IAAI,WAAW,EAAC;AAChB,QAAA,IAAI,aAAgB,GAAA,IAAA;AACpB,QAAA,OAAO,aAAe,EAAA;AACpB,UAAW,QAAA,GAAA,MAAM,MAAO,CAAA,MAAA,CAAO,GAAI,CAAA;AAAA,YACjC,UAAY,EAAA,QAAA;AAAA,YACZ,IAAA;AAAA,YACA;AAAA,WACD,CAAA;AAED,UAAS,MAAA,GAAA,MAAA,CAAO,OAAO,QAAQ,CAAA;AAC/B,UAAI,IAAA,QAAA,CAAS,MAAS,GAAA,OAAA,EAAyB,aAAA,GAAA,KAAA;AAC/C,UAAA,IAAA,EAAA;AAAA;AAGF,QAAA,MAAM,MAKF,GAAA;AAAA,UACF,OAAA,EAAS,MAAO,CAAA,GAAA,CAAI,CAAU,KAAA,MAAA;AAAA,YAC5B,OAAO,KAAM,CAAA,SAAA;AAAA,YACb,EAAA,EAAI,KAAM,CAAA,EAAA,CAAG,QAAS;AAAA,WACtB,CAAA;AAAA,SACJ;AAEA,QAAA,MAAM,IAAO,GAAA,MAAM,MAAO,CAAA,KAAA,CAAM,eAAgB,EAAA;AAChD,QAAA,MAAA,CAAO,QAAQ,IAAK,CAAA;AAAA,UAClB,OAAO,IAAK,CAAA,QAAA;AAAA,UACZ,EAAA,EAAI,IAAK,CAAA,EAAA,CAAG,QAAS;AAAA,SACtB,CAAA;AAED,QAAO,OAAA,MAAA;AAAA;AACT,MACA,KAAK,cAAgB,EAAA;AACnB,QAAA,IAAI,CAAC,OAAQ,CAAA,EAAA;AACX,UAAM,MAAA,IAAIC,kBAAW,8CAA8C,CAAA;AAErE,QAAI,IAAA,QAAA;AACJ,QACE,IAAA,OAAA,CAAQ,QAAQ,MAAM,MAAA,CAAO,MAAM,eAAgB,EAAA,GAAI,EAAG,CAAA,QAAA,EAC1D,EAAA;AACA,UAAA,QAAA,GAAW,MAAM,MAAA,CAAO,KAAM,CAAA,WAAA,CAAY,QAAQ,EAAE,CAAA;AAAA,SAC/C,MAAA;AACL,UAAA,QAAA,GAAW,MAAM,MAAA,CAAO,MAAO,CAAA,WAAA,CAAY,QAAQ,EAAE,CAAA;AAAA;AAGvD,QAAO,OAAA;AAAA,UACL,OAAA,EAAS,QAAS,CAAA,GAAA,CAAI,CAAY,OAAA,MAAA;AAAA,YAChC,KAAA,EAAO,OAAQ,CAAA,IAAA,CAAK,IAAK,EAAA;AAAA,YACzB,EAAA,EAAI,OAAQ,CAAA,EAAA,CAAG,QAAS;AAAA,WACxB,CAAA;AAAA,SACJ;AAAA;AACF,MACA;AACE,QAAA,MAAM,IAAIA,iBAAA,CAAW,CAAqB,kBAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AAAA;AACxD,GACF;AACF;;;;"}
package/dist/index.d.ts CHANGED
@@ -32,7 +32,7 @@ declare function createPublishGitlabAction(options: {
32
32
  ci_config_path?: string | undefined;
33
33
  description?: string | undefined;
34
34
  merge_method?: "merge" | "ff" | "rebase_merge" | undefined;
35
- squash_option?: "always" | "never" | "default_off" | "default_on" | undefined;
35
+ squash_option?: "always" | "never" | "default_on" | "default_off" | undefined;
36
36
  topics?: string[] | undefined;
37
37
  visibility?: "internal" | "private" | "public" | undefined;
38
38
  only_allow_merge_if_all_discussions_are_resolved?: boolean | undefined;
@@ -234,11 +234,11 @@ declare const createGitlabProjectDeployTokenAction: (options: {
234
234
  integrations: ScmIntegrationRegistry;
235
235
  }) => _backstage_plugin_scaffolder_node.TemplateAction<{
236
236
  name: string;
237
+ scopes: string[];
237
238
  repoUrl: string;
238
239
  projectId: string | number;
239
240
  username?: string | undefined;
240
241
  token?: string | undefined;
241
- scopes?: string[] | undefined;
242
242
  }, {
243
243
  user: string;
244
244
  deploy_token: string;
@@ -14,6 +14,7 @@ var gitlabProjectDeployTokenCreate = require('./actions/gitlabProjectDeployToken
14
14
  var gitlabProjectVariableCreate = require('./actions/gitlabProjectVariableCreate.cjs.js');
15
15
  var gitlabRepoPush = require('./actions/gitlabRepoPush.cjs.js');
16
16
  require('./commonGitlabConfig.cjs.js');
17
+ var autocomplete = require('./autocomplete/autocomplete.cjs.js');
17
18
 
18
19
  const gitlabModule = backendPluginApi.createBackendModule({
19
20
  pluginId: "scaffolder",
@@ -22,9 +23,10 @@ const gitlabModule = backendPluginApi.createBackendModule({
22
23
  registerInit({
23
24
  deps: {
24
25
  scaffolder: alpha.scaffolderActionsExtensionPoint,
26
+ autocomplete: alpha.scaffolderAutocompleteExtensionPoint,
25
27
  config: backendPluginApi.coreServices.rootConfig
26
28
  },
27
- async init({ scaffolder, config }) {
29
+ async init({ scaffolder, autocomplete: autocomplete$1, config }) {
28
30
  const integrations = integration.ScmIntegrations.fromConfig(config);
29
31
  scaffolder.addActions(
30
32
  gitlabGroupEnsureExists.createGitlabGroupEnsureExistsAction({ integrations }),
@@ -38,6 +40,10 @@ const gitlabModule = backendPluginApi.createBackendModule({
38
40
  gitlabMergeRequest.createPublishGitlabMergeRequestAction({ integrations }),
39
41
  gitlabPipelineTrigger.createTriggerGitlabPipelineAction({ integrations })
40
42
  );
43
+ autocomplete$1.addAutocompleteProvider({
44
+ id: "gitlab",
45
+ handler: autocomplete.createHandleAutocompleteRequest({ integrations })
46
+ });
41
47
  }
42
48
  });
43
49
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module.cjs.js","sources":["../src/module.ts"],"sourcesContent":["/*\n * Copyright 2024 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 */\nimport {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { ScmIntegrations } from '@backstage/integration';\nimport { scaffolderActionsExtensionPoint } from '@backstage/plugin-scaffolder-node/alpha';\nimport {\n createGitlabGroupEnsureExistsAction,\n createGitlabIssueAction,\n createGitlabProjectAccessTokenAction,\n createGitlabProjectDeployTokenAction,\n createGitlabProjectVariableAction,\n createGitlabRepoPushAction,\n createPublishGitlabAction,\n createPublishGitlabMergeRequestAction,\n createTriggerGitlabPipelineAction,\n editGitlabIssueAction,\n} from './actions';\n\n/**\n * @public\n * The GitLab Module for the Scaffolder Backend\n */\nexport const gitlabModule = createBackendModule({\n pluginId: 'scaffolder',\n moduleId: 'gitlab',\n register({ registerInit }) {\n registerInit({\n deps: {\n scaffolder: scaffolderActionsExtensionPoint,\n config: coreServices.rootConfig,\n },\n async init({ scaffolder, config }) {\n const integrations = ScmIntegrations.fromConfig(config);\n\n scaffolder.addActions(\n createGitlabGroupEnsureExistsAction({ integrations }),\n createGitlabIssueAction({ integrations }),\n createGitlabProjectAccessTokenAction({ integrations }),\n createGitlabProjectDeployTokenAction({ integrations }),\n createGitlabProjectVariableAction({ integrations }),\n createGitlabRepoPushAction({ integrations }),\n editGitlabIssueAction({ integrations }),\n createPublishGitlabAction({ config, integrations }),\n createPublishGitlabMergeRequestAction({ integrations }),\n createTriggerGitlabPipelineAction({ integrations }),\n );\n },\n });\n },\n});\n"],"names":["createBackendModule","scaffolderActionsExtensionPoint","coreServices","ScmIntegrations","createGitlabGroupEnsureExistsAction","createGitlabIssueAction","createGitlabProjectAccessTokenAction","createGitlabProjectDeployTokenAction","createGitlabProjectVariableAction","createGitlabRepoPushAction","editGitlabIssueAction","createPublishGitlabAction","createPublishGitlabMergeRequestAction","createTriggerGitlabPipelineAction"],"mappings":";;;;;;;;;;;;;;;;;AAsCO,MAAM,eAAeA,oCAAoB,CAAA;AAAA,EAC9C,QAAU,EAAA,YAAA;AAAA,EACV,QAAU,EAAA,QAAA;AAAA,EACV,QAAA,CAAS,EAAE,YAAA,EAAgB,EAAA;AACzB,IAAa,YAAA,CAAA;AAAA,MACX,IAAM,EAAA;AAAA,QACJ,UAAY,EAAAC,qCAAA;AAAA,QACZ,QAAQC,6BAAa,CAAA;AAAA,OACvB;AAAA,MACA,MAAM,IAAA,CAAK,EAAE,UAAA,EAAY,QAAU,EAAA;AACjC,QAAM,MAAA,YAAA,GAAeC,2BAAgB,CAAA,UAAA,CAAW,MAAM,CAAA;AAEtD,QAAW,UAAA,CAAA,UAAA;AAAA,UACTC,2DAAA,CAAoC,EAAE,YAAA,EAAc,CAAA;AAAA,UACpDC,yCAAA,CAAwB,EAAE,YAAA,EAAc,CAAA;AAAA,UACxCC,mEAAA,CAAqC,EAAE,YAAA,EAAc,CAAA;AAAA,UACrDC,mEAAA,CAAqC,EAAE,YAAA,EAAc,CAAA;AAAA,UACrDC,6DAAA,CAAkC,EAAE,YAAA,EAAc,CAAA;AAAA,UAClDC,yCAAA,CAA2B,EAAE,YAAA,EAAc,CAAA;AAAA,UAC3CC,qCAAA,CAAsB,EAAE,YAAA,EAAc,CAAA;AAAA,UACtCC,gCAA0B,CAAA,EAAE,MAAQ,EAAA,YAAA,EAAc,CAAA;AAAA,UAClDC,wDAAA,CAAsC,EAAE,YAAA,EAAc,CAAA;AAAA,UACtDC,uDAAA,CAAkC,EAAE,YAAA,EAAc;AAAA,SACpD;AAAA;AACF,KACD,CAAA;AAAA;AAEL,CAAC;;;;"}
1
+ {"version":3,"file":"module.cjs.js","sources":["../src/module.ts"],"sourcesContent":["/*\n * Copyright 2024 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 */\nimport {\n coreServices,\n createBackendModule,\n} from '@backstage/backend-plugin-api';\nimport { ScmIntegrations } from '@backstage/integration';\nimport {\n scaffolderActionsExtensionPoint,\n scaffolderAutocompleteExtensionPoint,\n} from '@backstage/plugin-scaffolder-node/alpha';\nimport {\n createGitlabGroupEnsureExistsAction,\n createGitlabIssueAction,\n createGitlabProjectAccessTokenAction,\n createGitlabProjectDeployTokenAction,\n createGitlabProjectVariableAction,\n createGitlabRepoPushAction,\n createPublishGitlabAction,\n createPublishGitlabMergeRequestAction,\n createTriggerGitlabPipelineAction,\n editGitlabIssueAction,\n} from './actions';\nimport { createHandleAutocompleteRequest } from './autocomplete/autocomplete';\n\n/**\n * @public\n * The GitLab Module for the Scaffolder Backend\n */\nexport const gitlabModule = createBackendModule({\n pluginId: 'scaffolder',\n moduleId: 'gitlab',\n register({ registerInit }) {\n registerInit({\n deps: {\n scaffolder: scaffolderActionsExtensionPoint,\n autocomplete: scaffolderAutocompleteExtensionPoint,\n config: coreServices.rootConfig,\n },\n async init({ scaffolder, autocomplete, config }) {\n const integrations = ScmIntegrations.fromConfig(config);\n\n scaffolder.addActions(\n createGitlabGroupEnsureExistsAction({ integrations }),\n createGitlabIssueAction({ integrations }),\n createGitlabProjectAccessTokenAction({ integrations }),\n createGitlabProjectDeployTokenAction({ integrations }),\n createGitlabProjectVariableAction({ integrations }),\n createGitlabRepoPushAction({ integrations }),\n editGitlabIssueAction({ integrations }),\n createPublishGitlabAction({ config, integrations }),\n createPublishGitlabMergeRequestAction({ integrations }),\n createTriggerGitlabPipelineAction({ integrations }),\n );\n\n autocomplete.addAutocompleteProvider({\n id: 'gitlab',\n handler: createHandleAutocompleteRequest({ integrations }),\n });\n },\n });\n },\n});\n"],"names":["createBackendModule","scaffolderActionsExtensionPoint","scaffolderAutocompleteExtensionPoint","coreServices","autocomplete","ScmIntegrations","createGitlabGroupEnsureExistsAction","createGitlabIssueAction","createGitlabProjectAccessTokenAction","createGitlabProjectDeployTokenAction","createGitlabProjectVariableAction","createGitlabRepoPushAction","editGitlabIssueAction","createPublishGitlabAction","createPublishGitlabMergeRequestAction","createTriggerGitlabPipelineAction","createHandleAutocompleteRequest"],"mappings":";;;;;;;;;;;;;;;;;;AA0CO,MAAM,eAAeA,oCAAoB,CAAA;AAAA,EAC9C,QAAU,EAAA,YAAA;AAAA,EACV,QAAU,EAAA,QAAA;AAAA,EACV,QAAA,CAAS,EAAE,YAAA,EAAgB,EAAA;AACzB,IAAa,YAAA,CAAA;AAAA,MACX,IAAM,EAAA;AAAA,QACJ,UAAY,EAAAC,qCAAA;AAAA,QACZ,YAAc,EAAAC,0CAAA;AAAA,QACd,QAAQC,6BAAa,CAAA;AAAA,OACvB;AAAA,MACA,MAAM,IAAK,CAAA,EAAE,UAAY,gBAAAC,cAAA,EAAc,QAAU,EAAA;AAC/C,QAAM,MAAA,YAAA,GAAeC,2BAAgB,CAAA,UAAA,CAAW,MAAM,CAAA;AAEtD,QAAW,UAAA,CAAA,UAAA;AAAA,UACTC,2DAAA,CAAoC,EAAE,YAAA,EAAc,CAAA;AAAA,UACpDC,yCAAA,CAAwB,EAAE,YAAA,EAAc,CAAA;AAAA,UACxCC,mEAAA,CAAqC,EAAE,YAAA,EAAc,CAAA;AAAA,UACrDC,mEAAA,CAAqC,EAAE,YAAA,EAAc,CAAA;AAAA,UACrDC,6DAAA,CAAkC,EAAE,YAAA,EAAc,CAAA;AAAA,UAClDC,yCAAA,CAA2B,EAAE,YAAA,EAAc,CAAA;AAAA,UAC3CC,qCAAA,CAAsB,EAAE,YAAA,EAAc,CAAA;AAAA,UACtCC,gCAA0B,CAAA,EAAE,MAAQ,EAAA,YAAA,EAAc,CAAA;AAAA,UAClDC,wDAAA,CAAsC,EAAE,YAAA,EAAc,CAAA;AAAA,UACtDC,uDAAA,CAAkC,EAAE,YAAA,EAAc;AAAA,SACpD;AAEA,QAAAX,cAAA,CAAa,uBAAwB,CAAA;AAAA,UACnC,EAAI,EAAA,QAAA;AAAA,UACJ,OAAS,EAAAY,4CAAA,CAAgC,EAAE,YAAA,EAAc;AAAA,SAC1D,CAAA;AAAA;AACH,KACD,CAAA;AAAA;AAEL,CAAC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-scaffolder-backend-module-gitlab",
3
- "version": "0.6.1",
3
+ "version": "0.7.0-next.0",
4
4
  "backstage": {
5
5
  "role": "backend-plugin-module",
6
6
  "pluginId": "scaffolder",
@@ -51,23 +51,21 @@
51
51
  },
52
52
  "dependencies": {
53
53
  "@backstage/backend-common": "^0.25.0",
54
- "@backstage/backend-plugin-api": "^1.0.2",
55
- "@backstage/config": "^1.3.0",
56
- "@backstage/errors": "^1.2.5",
57
- "@backstage/integration": "^1.15.2",
58
- "@backstage/plugin-scaffolder-node": "^0.6.0",
59
- "@gitbeaker/core": "^35.8.0",
60
- "@gitbeaker/node": "^35.8.0",
61
- "@gitbeaker/rest": "^39.25.0",
54
+ "@backstage/backend-plugin-api": "1.0.3-next.0",
55
+ "@backstage/config": "1.3.0",
56
+ "@backstage/errors": "1.2.5",
57
+ "@backstage/integration": "1.16.0-next.0",
58
+ "@backstage/plugin-scaffolder-node": "0.6.1-next.0",
59
+ "@gitbeaker/rest": "^41.2.0",
62
60
  "luxon": "^3.0.0",
63
61
  "winston": "^3.2.1",
64
62
  "yaml": "^2.0.0",
65
63
  "zod": "^3.22.4"
66
64
  },
67
65
  "devDependencies": {
68
- "@backstage/backend-test-utils": "^1.1.0",
69
- "@backstage/cli": "^0.29.0",
70
- "@backstage/core-app-api": "^1.15.2",
71
- "@backstage/plugin-scaffolder-node-test-utils": "^0.1.15"
66
+ "@backstage/backend-test-utils": "1.2.0-next.0",
67
+ "@backstage/cli": "0.29.3-next.0",
68
+ "@backstage/core-app-api": "1.15.3-next.0",
69
+ "@backstage/plugin-scaffolder-node-test-utils": "0.1.16-next.0"
72
70
  }
73
71
  }