@red-hat-developer-hub/backstage-plugin-bulk-import-backend 7.1.1 → 7.2.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.
Files changed (56) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/catalog/catalogHttpClient.cjs.js.map +1 -1
  3. package/dist/catalog/catalogInfoGenerator.cjs.js.map +1 -1
  4. package/dist/catalog/catalogUtils.cjs.js.map +1 -1
  5. package/dist/database/migration.cjs.js.map +1 -1
  6. package/dist/database/repositoryDao.cjs.js.map +1 -1
  7. package/dist/generated/openapidocument.cjs.js.map +1 -1
  8. package/dist/github/GithubAppManager.cjs.js +8 -8
  9. package/dist/github/GithubAppManager.cjs.js.map +1 -1
  10. package/dist/github/githubApiService.cjs.js +6 -6
  11. package/dist/github/githubApiService.cjs.js.map +1 -1
  12. package/dist/github/types.cjs.js.map +1 -1
  13. package/dist/github/utils/ghUtils.cjs.js +3 -3
  14. package/dist/github/utils/ghUtils.cjs.js.map +1 -1
  15. package/dist/github/utils/orgUtils.cjs.js +1 -1
  16. package/dist/github/utils/orgUtils.cjs.js.map +1 -1
  17. package/dist/github/utils/prUtils.cjs.js +1 -1
  18. package/dist/github/utils/prUtils.cjs.js.map +1 -1
  19. package/dist/github/utils/repoUtils.cjs.js +1 -1
  20. package/dist/github/utils/repoUtils.cjs.js.map +1 -1
  21. package/dist/github/utils/utils.cjs.js +3 -3
  22. package/dist/github/utils/utils.cjs.js.map +1 -1
  23. package/dist/gitlab/GitlabAppManager.cjs.js.map +1 -1
  24. package/dist/gitlab/gitlabApiService.cjs.js +11 -11
  25. package/dist/gitlab/gitlabApiService.cjs.js.map +1 -1
  26. package/dist/gitlab/utils/glUtils.cjs.js.map +1 -1
  27. package/dist/gitlab/utils/orgUtils.cjs.js +1 -1
  28. package/dist/gitlab/utils/orgUtils.cjs.js.map +1 -1
  29. package/dist/gitlab/utils/prUtils.cjs.js +1 -1
  30. package/dist/gitlab/utils/prUtils.cjs.js.map +1 -1
  31. package/dist/gitlab/utils/repoUtils.cjs.js +1 -1
  32. package/dist/gitlab/utils/repoUtils.cjs.js.map +1 -1
  33. package/dist/gitlab/utils/utils.cjs.js +3 -3
  34. package/dist/gitlab/utils/utils.cjs.js.map +1 -1
  35. package/dist/helpers/auditorUtils.cjs.js.map +1 -1
  36. package/dist/helpers/auth.cjs.js.map +1 -1
  37. package/dist/helpers/loggingUtils.cjs.js.map +1 -1
  38. package/dist/helpers/pagination.cjs.js.map +1 -1
  39. package/dist/helpers/utils.cjs.js +1 -1
  40. package/dist/helpers/utils.cjs.js.map +1 -1
  41. package/dist/index.d.ts +2 -1
  42. package/dist/plugin.cjs.js.map +1 -1
  43. package/dist/service/handlers/handlers.cjs.js.map +1 -1
  44. package/dist/service/handlers/import/bulkImports.cjs.js +12 -12
  45. package/dist/service/handlers/import/bulkImports.cjs.js.map +1 -1
  46. package/dist/service/handlers/import/execute-orchestrator-workflow.cjs.js.map +1 -1
  47. package/dist/service/handlers/import/execute-template.cjs.js.map +1 -1
  48. package/dist/service/handlers/import/importStatus.cjs.js.map +1 -1
  49. package/dist/service/handlers/organization/organizations.cjs.js +4 -4
  50. package/dist/service/handlers/organization/organizations.cjs.js.map +1 -1
  51. package/dist/service/handlers/ping/ping.cjs.js.map +1 -1
  52. package/dist/service/handlers/repository/repositories.cjs.js +5 -5
  53. package/dist/service/handlers/repository/repositories.cjs.js.map +1 -1
  54. package/dist/service/router.cjs.js +5 -7
  55. package/dist/service/router.cjs.js.map +1 -1
  56. package/package.json +2 -2
@@ -58,7 +58,7 @@ async function getCatalogInfoContentFromPR(logger, config, gitlab, owner, repo,
58
58
  `Error fetching catalog-info content from PR ${prNumber}`,
59
59
  error
60
60
  );
61
- return undefined;
61
+ return void 0;
62
62
  }
63
63
  }
64
64
  async function closePRWithComment(gitlab, owner, repo, prNum, comment) {
@@ -1 +1 @@
1
- {"version":3,"file":"prUtils.cjs.js","sources":["../../../src/gitlab/utils/prUtils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport { getCatalogFilename } from '../../catalog/catalogUtils';\nimport { logErrorIfNeeded } from '../../helpers';\n\nexport async function findOpenPRForBranch(\n logger: LoggerService,\n config: Config,\n gitlab: any,\n owner: string,\n repo: string,\n branchName: string,\n withCatalogInfoContent: boolean = false,\n): Promise<{\n prNum?: number;\n prUrl?: string;\n prTitle?: string;\n prBody?: string;\n prCatalogInfoContent?: string;\n lastUpdate?: string;\n}> {\n try {\n const response = await gitlab.MergeRequests.all({\n projectId: `${owner}/${repo}`,\n state: 'opened',\n });\n\n for (const pull of response) {\n if (pull.source_branch === branchName) {\n return {\n prNum: pull.iid,\n prUrl: pull.web_url,\n prTitle: pull.title,\n prBody: pull.description ?? undefined,\n prCatalogInfoContent: withCatalogInfoContent\n ? await getCatalogInfoContentFromPR(\n logger,\n config,\n gitlab,\n owner,\n repo,\n pull.iid,\n pull.sha,\n )\n : undefined,\n lastUpdate: pull.updated_at,\n };\n }\n }\n } catch (error) {\n logErrorIfNeeded(logger, 'Error fetching pull requests', error);\n }\n return {};\n}\n\nasync function getCatalogInfoContentFromPR(\n logger: LoggerService,\n config: Config,\n gitlab: any,\n owner: string,\n repo: string,\n prNumber: number,\n prHeadSha: string,\n): Promise<string | undefined> {\n try {\n const filePath = getCatalogFilename(config);\n const fileContentResponse = await gitlab.RepositoryFiles.show(\n `${owner}/${repo}`,\n filePath,\n prHeadSha,\n );\n if (!('content' in fileContentResponse)) {\n return undefined;\n }\n return Buffer.from(fileContentResponse.content, 'base64').toString('utf-8');\n } catch (error: any) {\n logErrorIfNeeded(\n logger,\n `Error fetching catalog-info content from PR ${prNumber}`,\n error,\n );\n return undefined;\n }\n}\n\nexport async function closePRWithComment(\n gitlab: any,\n owner: string,\n repo: string,\n prNum: number,\n comment: string,\n) {\n await gitlab.MergeRequestNotes.create(`${owner}/${repo}`, prNum, comment);\n await gitlab.MergeRequests.edit(`${owner}/${repo}`, prNum, {\n stateEvent: 'close',\n });\n}\n"],"names":["logErrorIfNeeded","getCatalogFilename"],"mappings":";;;;;;;;;;;AAsBsB,eAAA,mBAAA,CACpB,QACA,MACA,EAAA,MAAA,EACA,OACA,IACA,EAAA,UAAA,EACA,yBAAkC,KAQjC,EAAA;AACD,EAAI,IAAA;AACF,IAAA,MAAM,QAAW,GAAA,MAAM,MAAO,CAAA,aAAA,CAAc,GAAI,CAAA;AAAA,MAC9C,SAAW,EAAA,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MAC3B,KAAO,EAAA;AAAA,KACR,CAAA;AAED,IAAA,KAAA,MAAW,QAAQ,QAAU,EAAA;AAC3B,MAAI,IAAA,IAAA,CAAK,kBAAkB,UAAY,EAAA;AACrC,QAAO,OAAA;AAAA,UACL,OAAO,IAAK,CAAA,GAAA;AAAA,UACZ,OAAO,IAAK,CAAA,OAAA;AAAA,UACZ,SAAS,IAAK,CAAA,KAAA;AAAA,UACd,MAAA,EAAQ,KAAK,WAAe,IAAA,KAAA,CAAA;AAAA,UAC5B,oBAAA,EAAsB,yBAClB,MAAM,2BAAA;AAAA,YACJ,MAAA;AAAA,YACA,MAAA;AAAA,YACA,MAAA;AAAA,YACA,KAAA;AAAA,YACA,IAAA;AAAA,YACA,IAAK,CAAA,GAAA;AAAA,YACL,IAAK,CAAA;AAAA,WAEP,GAAA,KAAA,CAAA;AAAA,UACJ,YAAY,IAAK,CAAA;AAAA,SACnB;AAAA;AACF;AACF,WACO,KAAO,EAAA;AACd,IAAiBA,6BAAA,CAAA,MAAA,EAAQ,gCAAgC,KAAK,CAAA;AAAA;AAEhE,EAAA,OAAO,EAAC;AACV;AAEA,eAAe,4BACb,MACA,EAAA,MAAA,EACA,QACA,KACA,EAAA,IAAA,EACA,UACA,SAC6B,EAAA;AAC7B,EAAI,IAAA;AACF,IAAM,MAAA,QAAA,GAAWC,gCAAmB,MAAM,CAAA;AAC1C,IAAM,MAAA,mBAAA,GAAsB,MAAM,MAAA,CAAO,eAAgB,CAAA,IAAA;AAAA,MACvD,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MAChB,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAI,IAAA,EAAE,aAAa,mBAAsB,CAAA,EAAA;AACvC,MAAO,OAAA,KAAA,CAAA;AAAA;AAET,IAAA,OAAO,OAAO,IAAK,CAAA,mBAAA,CAAoB,SAAS,QAAQ,CAAA,CAAE,SAAS,OAAO,CAAA;AAAA,WACnE,KAAY,EAAA;AACnB,IAAAD,6BAAA;AAAA,MACE,MAAA;AAAA,MACA,+CAA+C,QAAQ,CAAA,CAAA;AAAA,MACvD;AAAA,KACF;AACA,IAAO,OAAA,SAAA;AAAA;AAEX;AAEA,eAAsB,kBACpB,CAAA,MAAA,EACA,KACA,EAAA,IAAA,EACA,OACA,OACA,EAAA;AACA,EAAM,MAAA,MAAA,CAAO,kBAAkB,MAAO,CAAA,CAAA,EAAG,KAAK,CAAI,CAAA,EAAA,IAAI,CAAI,CAAA,EAAA,KAAA,EAAO,OAAO,CAAA;AACxE,EAAM,MAAA,MAAA,CAAO,cAAc,IAAK,CAAA,CAAA,EAAG,KAAK,CAAI,CAAA,EAAA,IAAI,IAAI,KAAO,EAAA;AAAA,IACzD,UAAY,EAAA;AAAA,GACb,CAAA;AACH;;;;;"}
1
+ {"version":3,"file":"prUtils.cjs.js","sources":["../../../src/gitlab/utils/prUtils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport { getCatalogFilename } from '../../catalog/catalogUtils';\nimport { logErrorIfNeeded } from '../../helpers';\n\nexport async function findOpenPRForBranch(\n logger: LoggerService,\n config: Config,\n gitlab: any,\n owner: string,\n repo: string,\n branchName: string,\n withCatalogInfoContent: boolean = false,\n): Promise<{\n prNum?: number;\n prUrl?: string;\n prTitle?: string;\n prBody?: string;\n prCatalogInfoContent?: string;\n lastUpdate?: string;\n}> {\n try {\n const response = await gitlab.MergeRequests.all({\n projectId: `${owner}/${repo}`,\n state: 'opened',\n });\n\n for (const pull of response) {\n if (pull.source_branch === branchName) {\n return {\n prNum: pull.iid,\n prUrl: pull.web_url,\n prTitle: pull.title,\n prBody: pull.description ?? undefined,\n prCatalogInfoContent: withCatalogInfoContent\n ? await getCatalogInfoContentFromPR(\n logger,\n config,\n gitlab,\n owner,\n repo,\n pull.iid,\n pull.sha,\n )\n : undefined,\n lastUpdate: pull.updated_at,\n };\n }\n }\n } catch (error) {\n logErrorIfNeeded(logger, 'Error fetching pull requests', error);\n }\n return {};\n}\n\nasync function getCatalogInfoContentFromPR(\n logger: LoggerService,\n config: Config,\n gitlab: any,\n owner: string,\n repo: string,\n prNumber: number,\n prHeadSha: string,\n): Promise<string | undefined> {\n try {\n const filePath = getCatalogFilename(config);\n const fileContentResponse = await gitlab.RepositoryFiles.show(\n `${owner}/${repo}`,\n filePath,\n prHeadSha,\n );\n if (!('content' in fileContentResponse)) {\n return undefined;\n }\n return Buffer.from(fileContentResponse.content, 'base64').toString('utf-8');\n } catch (error: any) {\n logErrorIfNeeded(\n logger,\n `Error fetching catalog-info content from PR ${prNumber}`,\n error,\n );\n return undefined;\n }\n}\n\nexport async function closePRWithComment(\n gitlab: any,\n owner: string,\n repo: string,\n prNum: number,\n comment: string,\n) {\n await gitlab.MergeRequestNotes.create(`${owner}/${repo}`, prNum, comment);\n await gitlab.MergeRequests.edit(`${owner}/${repo}`, prNum, {\n stateEvent: 'close',\n });\n}\n"],"names":["logErrorIfNeeded","getCatalogFilename"],"mappings":";;;;;;;;;;;AAsBA,eAAsB,mBAAA,CACpB,QACA,MAAA,EACA,MAAA,EACA,OACA,IAAA,EACA,UAAA,EACA,yBAAkC,KAAA,EAQjC;AACD,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,aAAA,CAAc,GAAA,CAAI;AAAA,MAC9C,SAAA,EAAW,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MAC3B,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,IAAI,IAAA,CAAK,kBAAkB,UAAA,EAAY;AACrC,QAAA,OAAO;AAAA,UACL,OAAO,IAAA,CAAK,GAAA;AAAA,UACZ,OAAO,IAAA,CAAK,OAAA;AAAA,UACZ,SAAS,IAAA,CAAK,KAAA;AAAA,UACd,MAAA,EAAQ,KAAK,WAAA,IAAe,KAAA,CAAA;AAAA,UAC5B,oBAAA,EAAsB,yBAClB,MAAM,2BAAA;AAAA,YACJ,MAAA;AAAA,YACA,MAAA;AAAA,YACA,MAAA;AAAA,YACA,KAAA;AAAA,YACA,IAAA;AAAA,YACA,IAAA,CAAK,GAAA;AAAA,YACL,IAAA,CAAK;AAAA,WACP,GACA,KAAA,CAAA;AAAA,UACJ,YAAY,IAAA,CAAK;AAAA,SACnB;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAAA,6BAAA,CAAiB,MAAA,EAAQ,gCAAgC,KAAK,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,EAAC;AACV;AAEA,eAAe,4BACb,MAAA,EACA,MAAA,EACA,QACA,KAAA,EACA,IAAA,EACA,UACA,SAAA,EAC6B;AAC7B,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAWC,gCAAmB,MAAM,CAAA;AAC1C,IAAA,MAAM,mBAAA,GAAsB,MAAM,MAAA,CAAO,eAAA,CAAgB,IAAA;AAAA,MACvD,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA;AAAA,MAChB,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI,EAAE,aAAa,mBAAA,CAAA,EAAsB;AACvC,MAAA,OAAO,KAAA,CAAA;AAAA,IACT;AACA,IAAA,OAAO,OAAO,IAAA,CAAK,mBAAA,CAAoB,SAAS,QAAQ,CAAA,CAAE,SAAS,OAAO,CAAA;AAAA,EAC5E,SAAS,KAAA,EAAY;AACnB,IAAAD,6BAAA;AAAA,MACE,MAAA;AAAA,MACA,+CAA+C,QAAQ,CAAA,CAAA;AAAA,MACvD;AAAA,KACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAEA,eAAsB,kBAAA,CACpB,MAAA,EACA,KAAA,EACA,IAAA,EACA,OACA,OAAA,EACA;AACA,EAAA,MAAM,MAAA,CAAO,kBAAkB,MAAA,CAAO,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,KAAA,EAAO,OAAO,CAAA;AACxE,EAAA,MAAM,MAAA,CAAO,cAAc,IAAA,CAAK,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,IAAI,IAAI,KAAA,EAAO;AAAA,IACzD,UAAA,EAAY;AAAA,GACb,CAAA;AACH;;;;;"}
@@ -154,7 +154,7 @@ async function fileExistsInDefaultBranch(logger, gitlab, owner, repo, fileName,
154
154
  logger.debug(
155
155
  `Unable to determine if a file named ${fileName} already exists in repo ${repo}: ${error}`
156
156
  );
157
- return undefined;
157
+ return void 0;
158
158
  }
159
159
  }
160
160
  async function createOrUpdateFileInBranch(gitlab, owner, repo, branchName, fileName, fileContent) {
@@ -1 +1 @@
1
- {"version":3,"file":"repoUtils.cjs.js","sources":["../../../src/gitlab/utils/repoUtils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport type {\n GitlabCredentials,\n GitLabIntegrationConfig,\n ScmIntegrations,\n} from '@backstage/integration';\n\nimport {\n AllGroupProjectsOptions,\n BasePaginationRequestOptions,\n Gitlab,\n OffsetPaginationRequestOptions,\n ProjectSchema,\n ShowExpanded,\n Sudo,\n} from '@gitbeaker/rest';\nimport gitUrlParse from 'git-url-parse';\n\nimport { getBranchName } from '../../catalog/catalogUtils';\nimport {\n DefaultPageNumber,\n DefaultPageSize,\n} from '../../service/handlers/handlers';\nimport { CustomGitlabCredentialsProvider } from '../GitlabAppManager';\nimport type {\n ExtendedGitlabCredentials,\n GitlabFetchError,\n GitlabRepository,\n} from '../types';\nimport { computeTotalCountFromPaginationInfo, handleError } from './utils';\n\nexport type ValidatedRepo = {\n glConfig: GitLabIntegrationConfig;\n credentials: ExtendedGitlabCredentials[];\n owner: string;\n repo: string;\n branchName: string;\n};\n\nexport async function validateAndBuildRepoData(\n gitlabCredentialsProvider: CustomGitlabCredentialsProvider,\n integrations: ScmIntegrations,\n config: Config,\n input: {\n repoUrl: string;\n },\n): Promise<ValidatedRepo> {\n const glConfig = integrations.gitlab.byUrl(input.repoUrl)?.config;\n if (!glConfig) {\n throw new Error(`Could not find GL integration from ${input.repoUrl}`);\n }\n\n const gitUrl = gitUrlParse(input.repoUrl);\n const owner = gitUrl.organization;\n const repo = gitUrl.name;\n\n const credentials = await gitlabCredentialsProvider.getAllCredentials({\n host: glConfig.host,\n });\n if (credentials.length === 0) {\n throw new Error(`No credentials for GL integration`);\n }\n\n const branchName = getBranchName(config);\n return { glConfig, owner, repo, credentials, branchName };\n}\n\nexport async function searchRepos(\n gitlab: InstanceType<typeof Gitlab<false>>,\n glSearchQuery: string,\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n): Promise<{ totalCount?: number; repositories: GitlabRepository[] }> {\n const repoSearchResp = await gitlab.Projects.all<true, 'offset'>({\n search: glSearchQuery,\n membership: true,\n perPage: pageSize,\n page: pageNumber,\n });\n\n return {\n totalCount: repoSearchResp?.paginationInfo?.total,\n repositories:\n repoSearchResp?.data?.map((repo: ProjectSchema) => {\n return {\n name: repo.name,\n full_name: repo.path_with_namespace,\n url: repo._links.self,\n html_url: repo.web_url,\n default_branch: repo.default_branch,\n updated_at: repo.updated_at,\n };\n }) ?? [],\n };\n}\n\n/**\n * Adds the user or organization repositories accessible by the github token to the provided repositories Map<string, GithubRepository> if they're owned by the specified owner\n * If any errors occurs, adds them to the provided errors Map<number, GithubFetchError>\n */\nexport async function addGitlabTokenRepositories(\n deps: {\n logger: LoggerService;\n },\n gitlab: InstanceType<typeof Gitlab<false>>,\n credential: GitlabCredentials,\n repositories: Map<string, GitlabRepository>,\n errors: Map<number, GitlabFetchError>,\n reqParams?: {\n search?: string;\n pageNumber?: number;\n pageSize?: number;\n },\n): Promise<{ totalCount?: number }> {\n const search = reqParams?.search;\n const pageNumber = reqParams?.pageNumber ?? DefaultPageNumber;\n const pageSize = reqParams?.pageSize ?? DefaultPageSize;\n let totalCount: number | undefined;\n try {\n if (search) {\n // Use the projects api with the search param\n // that api gives us all the things the token has access to including the different projects in various groups\n\n const searchResp = await searchRepos(\n gitlab,\n search,\n pageNumber,\n pageSize,\n );\n totalCount = searchResp.totalCount;\n searchResp.repositories.forEach(repo =>\n repositories.set(repo.full_name, repo),\n );\n } else {\n /**\n * The Projects.all method with the membership: true option will grab all the repositories/projects the gitlab token has explicit access to.\n * These would include repositories they own, repositories where they are a collaborator,\n * and repositories that they can access through an organization membership.\n */\n const { data, paginationInfo } = await gitlab.Projects.all<\n true,\n 'offset'\n >({\n membership: true,\n perPage: pageSize,\n page: pageNumber,\n showExpanded: true,\n });\n\n data?.forEach((repo: ProjectSchema) => {\n repositories.set(repo.path_with_namespace, {\n name: repo.name,\n full_name: repo.path_with_namespace,\n url: repo._links.self,\n html_url: repo.web_url,\n default_branch: repo.default_branch,\n updated_at: repo?.updated_at,\n });\n });\n\n /*\n paginationInfo: {\n total: , This is the total amount of repos, but will be NaN if the value is above 10k, see: https://github.com/jdalrymple/gitbeaker/issues/839#issuecomment-636482319\n next: ,\n current: ,\n previous: ,\n perPage: ,\n totalPages:\n }\n */\n\n totalCount = await computeTotalCountFromPaginationInfo(\n deps,\n paginationInfo,\n pageSize, // Not thrilled with this for some reason\n );\n }\n } catch (err) {\n handleError(\n deps,\n 'Fetching repositories with token from token',\n credential,\n errors,\n err,\n );\n }\n return { totalCount };\n}\n\nexport async function addGitlabTokenOrgRepositories(\n deps: {\n logger: LoggerService;\n },\n gitlab: InstanceType<typeof Gitlab<false>>,\n credential: GitlabCredentials,\n org: string,\n repositories: Map<string, GitlabRepository>,\n errors: Map<number, GitlabFetchError>,\n reqParams?: {\n search?: string;\n pageNumber?: number;\n pageSize?: number;\n },\n): Promise<{ totalCount?: number }> {\n const search = reqParams?.search;\n const pageNumber = reqParams?.pageNumber ?? DefaultPageNumber;\n const pageSize = reqParams?.pageSize ?? DefaultPageSize;\n let totalCount: number | undefined;\n try {\n // For Search: Use the group allProjects api with the search param.\n // I noticed that using this api will only return values when 3 or more characters are used for the search\n // that api gives us all the things the token has access\n const params:\n | (AllGroupProjectsOptions &\n BasePaginationRequestOptions<'offset'> &\n OffsetPaginationRequestOptions &\n Sudo &\n ShowExpanded<true>)\n | undefined = {\n perPage: pageSize,\n search: search ?? undefined,\n page: pageNumber,\n showExpanded: true,\n };\n\n const { data, paginationInfo } = await gitlab.Groups.allProjects<\n true,\n 'offset'\n >(org, params);\n\n data?.forEach((repo: ProjectSchema) => {\n repositories.set(repo.path_with_namespace, {\n name: repo.name,\n full_name: repo.path_with_namespace,\n url: repo._links.self,\n html_url: repo.web_url,\n default_branch: repo.default_branch,\n updated_at: repo.updated_at,\n });\n });\n\n totalCount = await computeTotalCountFromPaginationInfo(\n deps,\n paginationInfo,\n pageSize, // Not thrilled with this for some reason\n );\n } catch (err) {\n handleError(\n deps,\n 'Fetching org repositories with token from token',\n credential,\n errors,\n err,\n );\n }\n return { totalCount };\n}\n\nexport async function fileExistsInDefaultBranch(\n logger: LoggerService,\n gitlab: InstanceType<typeof Gitlab<false>>,\n owner: string,\n repo: string,\n fileName: string,\n defaultBranch: string = 'main',\n) {\n try {\n await gitlab.RepositoryFiles.show(\n `${owner}/${repo}`,\n fileName,\n defaultBranch,\n );\n return true;\n } catch (error: any) {\n if (error.cause.response.status === 404) {\n return false;\n }\n logger.debug(\n `Unable to determine if a file named ${fileName} already exists in repo ${repo}: ${error}`,\n );\n return undefined;\n }\n}\n\nexport async function createOrUpdateFileInBranch(\n gitlab: InstanceType<typeof Gitlab<false>>,\n owner: string,\n repo: string,\n branchName: string,\n fileName: string,\n fileContent: string,\n): Promise<void> {\n try {\n const existingFile = await gitlab.RepositoryFiles.show(\n `${owner}/${repo}`,\n fileName,\n branchName,\n );\n // Response can either be a directory (array of files) or a single file element. In this case, we ensure it has the sha property to update it.\n if (Array.isArray(existingFile) || !('content_sha256' in existingFile)) {\n throw new Error(\n `The content at path ${fileName} is not a file or the response from gitlab does not contain the 'content_sha256' property.`,\n );\n }\n // If the file already exists, update it\n await gitlab.RepositoryFiles.edit(\n `${owner}/${repo}`,\n fileName,\n branchName,\n fileContent,\n `Add ${fileName} config file`,\n );\n } catch (error: any) {\n if (error.cause.response.status === 404) {\n // If the file does not exist, create it\n await gitlab.RepositoryFiles.create(\n `${owner}/${repo}`,\n fileName,\n branchName,\n fileContent,\n `Add ${fileName} config file`,\n );\n } else {\n throw error;\n }\n }\n}\n"],"names":["gitUrlParse","getBranchName","DefaultPageNumber","DefaultPageSize","computeTotalCountFromPaginationInfo","handleError"],"mappings":"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"}
1
+ {"version":3,"file":"repoUtils.cjs.js","sources":["../../../src/gitlab/utils/repoUtils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport type {\n GitlabCredentials,\n GitLabIntegrationConfig,\n ScmIntegrations,\n} from '@backstage/integration';\n\nimport {\n AllGroupProjectsOptions,\n BasePaginationRequestOptions,\n Gitlab,\n OffsetPaginationRequestOptions,\n ProjectSchema,\n ShowExpanded,\n Sudo,\n} from '@gitbeaker/rest';\nimport gitUrlParse from 'git-url-parse';\n\nimport { getBranchName } from '../../catalog/catalogUtils';\nimport {\n DefaultPageNumber,\n DefaultPageSize,\n} from '../../service/handlers/handlers';\nimport { CustomGitlabCredentialsProvider } from '../GitlabAppManager';\nimport type {\n ExtendedGitlabCredentials,\n GitlabFetchError,\n GitlabRepository,\n} from '../types';\nimport { computeTotalCountFromPaginationInfo, handleError } from './utils';\n\nexport type ValidatedRepo = {\n glConfig: GitLabIntegrationConfig;\n credentials: ExtendedGitlabCredentials[];\n owner: string;\n repo: string;\n branchName: string;\n};\n\nexport async function validateAndBuildRepoData(\n gitlabCredentialsProvider: CustomGitlabCredentialsProvider,\n integrations: ScmIntegrations,\n config: Config,\n input: {\n repoUrl: string;\n },\n): Promise<ValidatedRepo> {\n const glConfig = integrations.gitlab.byUrl(input.repoUrl)?.config;\n if (!glConfig) {\n throw new Error(`Could not find GL integration from ${input.repoUrl}`);\n }\n\n const gitUrl = gitUrlParse(input.repoUrl);\n const owner = gitUrl.organization;\n const repo = gitUrl.name;\n\n const credentials = await gitlabCredentialsProvider.getAllCredentials({\n host: glConfig.host,\n });\n if (credentials.length === 0) {\n throw new Error(`No credentials for GL integration`);\n }\n\n const branchName = getBranchName(config);\n return { glConfig, owner, repo, credentials, branchName };\n}\n\nexport async function searchRepos(\n gitlab: InstanceType<typeof Gitlab<false>>,\n glSearchQuery: string,\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n): Promise<{ totalCount?: number; repositories: GitlabRepository[] }> {\n const repoSearchResp = await gitlab.Projects.all<true, 'offset'>({\n search: glSearchQuery,\n membership: true,\n perPage: pageSize,\n page: pageNumber,\n });\n\n return {\n totalCount: repoSearchResp?.paginationInfo?.total,\n repositories:\n repoSearchResp?.data?.map((repo: ProjectSchema) => {\n return {\n name: repo.name,\n full_name: repo.path_with_namespace,\n url: repo._links.self,\n html_url: repo.web_url,\n default_branch: repo.default_branch,\n updated_at: repo.updated_at,\n };\n }) ?? [],\n };\n}\n\n/**\n * Adds the user or organization repositories accessible by the github token to the provided repositories Map<string, GithubRepository> if they're owned by the specified owner\n * If any errors occurs, adds them to the provided errors Map<number, GithubFetchError>\n */\nexport async function addGitlabTokenRepositories(\n deps: {\n logger: LoggerService;\n },\n gitlab: InstanceType<typeof Gitlab<false>>,\n credential: GitlabCredentials,\n repositories: Map<string, GitlabRepository>,\n errors: Map<number, GitlabFetchError>,\n reqParams?: {\n search?: string;\n pageNumber?: number;\n pageSize?: number;\n },\n): Promise<{ totalCount?: number }> {\n const search = reqParams?.search;\n const pageNumber = reqParams?.pageNumber ?? DefaultPageNumber;\n const pageSize = reqParams?.pageSize ?? DefaultPageSize;\n let totalCount: number | undefined;\n try {\n if (search) {\n // Use the projects api with the search param\n // that api gives us all the things the token has access to including the different projects in various groups\n\n const searchResp = await searchRepos(\n gitlab,\n search,\n pageNumber,\n pageSize,\n );\n totalCount = searchResp.totalCount;\n searchResp.repositories.forEach(repo =>\n repositories.set(repo.full_name, repo),\n );\n } else {\n /**\n * The Projects.all method with the membership: true option will grab all the repositories/projects the gitlab token has explicit access to.\n * These would include repositories they own, repositories where they are a collaborator,\n * and repositories that they can access through an organization membership.\n */\n const { data, paginationInfo } = await gitlab.Projects.all<\n true,\n 'offset'\n >({\n membership: true,\n perPage: pageSize,\n page: pageNumber,\n showExpanded: true,\n });\n\n data?.forEach((repo: ProjectSchema) => {\n repositories.set(repo.path_with_namespace, {\n name: repo.name,\n full_name: repo.path_with_namespace,\n url: repo._links.self,\n html_url: repo.web_url,\n default_branch: repo.default_branch,\n updated_at: repo?.updated_at,\n });\n });\n\n /*\n paginationInfo: {\n total: , This is the total amount of repos, but will be NaN if the value is above 10k, see: https://github.com/jdalrymple/gitbeaker/issues/839#issuecomment-636482319\n next: ,\n current: ,\n previous: ,\n perPage: ,\n totalPages:\n }\n */\n\n totalCount = await computeTotalCountFromPaginationInfo(\n deps,\n paginationInfo,\n pageSize, // Not thrilled with this for some reason\n );\n }\n } catch (err) {\n handleError(\n deps,\n 'Fetching repositories with token from token',\n credential,\n errors,\n err,\n );\n }\n return { totalCount };\n}\n\nexport async function addGitlabTokenOrgRepositories(\n deps: {\n logger: LoggerService;\n },\n gitlab: InstanceType<typeof Gitlab<false>>,\n credential: GitlabCredentials,\n org: string,\n repositories: Map<string, GitlabRepository>,\n errors: Map<number, GitlabFetchError>,\n reqParams?: {\n search?: string;\n pageNumber?: number;\n pageSize?: number;\n },\n): Promise<{ totalCount?: number }> {\n const search = reqParams?.search;\n const pageNumber = reqParams?.pageNumber ?? DefaultPageNumber;\n const pageSize = reqParams?.pageSize ?? DefaultPageSize;\n let totalCount: number | undefined;\n try {\n // For Search: Use the group allProjects api with the search param.\n // I noticed that using this api will only return values when 3 or more characters are used for the search\n // that api gives us all the things the token has access\n const params:\n | (AllGroupProjectsOptions &\n BasePaginationRequestOptions<'offset'> &\n OffsetPaginationRequestOptions &\n Sudo &\n ShowExpanded<true>)\n | undefined = {\n perPage: pageSize,\n search: search ?? undefined,\n page: pageNumber,\n showExpanded: true,\n };\n\n const { data, paginationInfo } = await gitlab.Groups.allProjects<\n true,\n 'offset'\n >(org, params);\n\n data?.forEach((repo: ProjectSchema) => {\n repositories.set(repo.path_with_namespace, {\n name: repo.name,\n full_name: repo.path_with_namespace,\n url: repo._links.self,\n html_url: repo.web_url,\n default_branch: repo.default_branch,\n updated_at: repo.updated_at,\n });\n });\n\n totalCount = await computeTotalCountFromPaginationInfo(\n deps,\n paginationInfo,\n pageSize, // Not thrilled with this for some reason\n );\n } catch (err) {\n handleError(\n deps,\n 'Fetching org repositories with token from token',\n credential,\n errors,\n err,\n );\n }\n return { totalCount };\n}\n\nexport async function fileExistsInDefaultBranch(\n logger: LoggerService,\n gitlab: InstanceType<typeof Gitlab<false>>,\n owner: string,\n repo: string,\n fileName: string,\n defaultBranch: string = 'main',\n) {\n try {\n await gitlab.RepositoryFiles.show(\n `${owner}/${repo}`,\n fileName,\n defaultBranch,\n );\n return true;\n } catch (error: any) {\n if (error.cause.response.status === 404) {\n return false;\n }\n logger.debug(\n `Unable to determine if a file named ${fileName} already exists in repo ${repo}: ${error}`,\n );\n return undefined;\n }\n}\n\nexport async function createOrUpdateFileInBranch(\n gitlab: InstanceType<typeof Gitlab<false>>,\n owner: string,\n repo: string,\n branchName: string,\n fileName: string,\n fileContent: string,\n): Promise<void> {\n try {\n const existingFile = await gitlab.RepositoryFiles.show(\n `${owner}/${repo}`,\n fileName,\n branchName,\n );\n // Response can either be a directory (array of files) or a single file element. In this case, we ensure it has the sha property to update it.\n if (Array.isArray(existingFile) || !('content_sha256' in existingFile)) {\n throw new Error(\n `The content at path ${fileName} is not a file or the response from gitlab does not contain the 'content_sha256' property.`,\n );\n }\n // If the file already exists, update it\n await gitlab.RepositoryFiles.edit(\n `${owner}/${repo}`,\n fileName,\n branchName,\n fileContent,\n `Add ${fileName} config file`,\n );\n } catch (error: any) {\n if (error.cause.response.status === 404) {\n // If the file does not exist, create it\n await gitlab.RepositoryFiles.create(\n `${owner}/${repo}`,\n fileName,\n branchName,\n fileContent,\n `Add ${fileName} config file`,\n );\n } else {\n throw error;\n }\n }\n}\n"],"names":["gitUrlParse","getBranchName","DefaultPageNumber","DefaultPageSize","computeTotalCountFromPaginationInfo","handleError"],"mappings":"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"}
@@ -20,7 +20,7 @@ function createCredentialError(err) {
20
20
  }
21
21
  };
22
22
  }
23
- return undefined;
23
+ return void 0;
24
24
  }
25
25
  function verifyAndGetIntegrations(deps, integrations) {
26
26
  const glConfigs = integrations.gitlab.list().map((glInit) => glInit.config);
@@ -85,7 +85,7 @@ async function executeFunctionOnFirstSuccessfulIntegration(deps, integrations, p
85
85
  }
86
86
  return res.result;
87
87
  }
88
- return undefined;
88
+ return void 0;
89
89
  }
90
90
  async function fetchFromAllIntegrations(deps, integrations, params) {
91
91
  const glConfigs = verifyAndGetIntegrations(deps, integrations);
@@ -105,7 +105,7 @@ async function fetchFromAllIntegrations(deps, integrations, params) {
105
105
  `Got ${credentials.length} credential(s) for ${glConfig.host}`
106
106
  );
107
107
  for (const credential of credentials) {
108
- const glKit = glUtils.buildGitlab(deps, { credential, errors }, glConfig.baseUrl);
108
+ const glKit = glUtils.buildGitlab(deps, { credential}, glConfig.baseUrl);
109
109
  const res = await params.dataFetcher(glKit, credential, glConfig);
110
110
  res.errors?.forEach((err) => dataErrs.push(err));
111
111
  if (res.result) {
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs.js","sources":["../../../src/gitlab/utils/utils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type {\n CacheService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport {\n ScmIntegrations,\n type GitLabIntegrationConfig,\n} from '@backstage/integration';\n\nimport { Gitlab, OffsetPagination } from '@gitbeaker/rest';\n\nimport { logErrorIfNeeded } from '../../helpers';\nimport type { CustomGitlabCredentialsProvider } from '../GitlabAppManager';\nimport {\n type ExtendedGitlabCredentials,\n type GitlabFetchError,\n} from '../types';\nimport { buildGitlab } from './glUtils';\nimport { validateAndBuildRepoData, ValidatedRepo } from './repoUtils';\n\n// /**\n// * Creates the GitlabFetchError to be stored in the returned errors array of the returned GitlabRepositoryResponse object\n// */\nexport function createCredentialError(\n err?: Error,\n): GitlabFetchError | undefined {\n if (err) {\n return {\n type: 'token',\n error: {\n name: err.name,\n message: err.message,\n },\n };\n }\n return undefined;\n}\n\nexport function verifyAndGetIntegrations(\n deps: {\n logger: LoggerService;\n },\n\n integrations: ScmIntegrations,\n) {\n const glConfigs = integrations.gitlab.list().map(glInit => glInit.config);\n\n if (glConfigs.length === 0) {\n deps.logger.debug(\n 'No GitLab Integration in config => returning an empty list of repositories.',\n );\n throw new Error(\n \"Looks like there is no GitLab Integration in config. Please add a configuration entry under 'integrations.gitlab\",\n );\n }\n return glConfigs;\n}\n\nexport async function getCredentialsFromIntegrations(\n gitlabCredentialsProvider: CustomGitlabCredentialsProvider,\n glConfigs: GitLabIntegrationConfig[],\n) {\n const credentialsByConfig = new Map<\n GitLabIntegrationConfig,\n ExtendedGitlabCredentials[]\n >();\n for (const glConfig of glConfigs) {\n const creds = await getCredentialsForConfig(\n gitlabCredentialsProvider,\n glConfig,\n );\n credentialsByConfig.set(glConfig, creds);\n }\n return credentialsByConfig;\n}\n\nexport async function getCredentialsForConfig(\n gitlabCredentialsProvider: CustomGitlabCredentialsProvider,\n glConfig: GitLabIntegrationConfig,\n) {\n return await gitlabCredentialsProvider.getAllCredentials({\n host: glConfig.host,\n });\n}\n\nexport function handleError(\n deps: {\n logger: LoggerService;\n },\n desc: string,\n _credential: ExtendedGitlabCredentials,\n errors: Map<number, GitlabFetchError>,\n err: any,\n) {\n logErrorIfNeeded(deps.logger, `${desc} failed`, err);\n const credentialError = createCredentialError(err as Error);\n if (credentialError) {\n errors.set(-1, credentialError);\n }\n}\n\nexport async function computeTotalCountFromPaginationInfo(\n deps: {\n logger: LoggerService;\n },\n paginationInfo: OffsetPagination,\n pageSize?: number,\n): Promise<number | undefined> {\n /*\n paginationInfo: {\n total: , This is the total amount of repos, but will be NaN if the value is above 10k, see: https://github.com/jdalrymple/gitbeaker/issues/839#issuecomment-636482319\n next: ,\n current: ,\n previous: ,\n perPage: ,\n totalPages:\n }\n */\n\n if (isNaN(paginationInfo.total)) {\n deps.logger.debug(\n `Too many result, total count is NaN, returning current page size`,\n );\n return pageSize;\n }\n return paginationInfo.total;\n}\n\nexport async function executeFunctionOnFirstSuccessfulIntegration<T>(\n deps: {\n logger: LoggerService;\n cache: CacheService;\n config: Config;\n gitlabCredentialsProvider: CustomGitlabCredentialsProvider;\n },\n integrations: ScmIntegrations,\n params: {\n repoUrl: string;\n fn: (\n validatedRepo: ValidatedRepo,\n gitlab: InstanceType<typeof Gitlab<false>>,\n ) => Promise<{ successful: boolean; result?: T }>;\n },\n) {\n const validatedRepo = await validateAndBuildRepoData(\n deps.gitlabCredentialsProvider,\n integrations,\n deps.config,\n params,\n );\n for (const credential of validatedRepo.credentials) {\n const glKit = buildGitlab(\n deps,\n { credential, owner: validatedRepo.owner },\n validatedRepo.glConfig.baseUrl,\n );\n const res = await params.fn(validatedRepo, glKit);\n if (!res.successful) {\n continue;\n }\n return res.result;\n }\n return undefined;\n}\n\nexport async function fetchFromAllIntegrations<T>(\n deps: {\n logger: LoggerService;\n cache: CacheService;\n gitlabCredentialsProvider: CustomGitlabCredentialsProvider;\n },\n integrations: ScmIntegrations,\n params: {\n dataFetcher: (\n gitlab: InstanceType<typeof Gitlab<false>>,\n credential: ExtendedGitlabCredentials,\n glConfig: GitLabIntegrationConfig,\n ) => Promise<{\n stopFetchingData?: boolean;\n result?: T;\n errors?: GitlabFetchError[];\n }>;\n },\n) {\n const glConfigs = verifyAndGetIntegrations(deps, integrations);\n\n const credentialsByConfig = await getCredentialsFromIntegrations(\n deps.gitlabCredentialsProvider,\n glConfigs,\n );\n const errors = new Map<number, GitlabFetchError>();\n const data: T[] = [];\n const dataErrs: GitlabFetchError[] = [];\n let stopFetchingData: boolean | undefined = false;\n for (const [glConfig, credentials] of credentialsByConfig) {\n if (stopFetchingData) {\n break;\n }\n deps.logger.debug(\n `Got ${credentials.length} credential(s) for ${glConfig.host}`,\n );\n for (const credential of credentials) {\n const glKit = buildGitlab(deps, { credential, errors }, glConfig.baseUrl);\n const res = await params.dataFetcher(glKit, credential, glConfig);\n res.errors?.forEach(err => dataErrs.push(err));\n\n if (res.result) {\n data.push(res.result);\n }\n\n stopFetchingData = res.stopFetchingData;\n }\n }\n\n const aggregatedErrors = new Map<number, GitlabFetchError>();\n errors.forEach((err, num) => aggregatedErrors.set(num, err));\n dataErrs.forEach((err, idx) => aggregatedErrors.set(idx, err));\n\n return { data, errors: aggregatedErrors };\n}\n"],"names":["logErrorIfNeeded","validateAndBuildRepoData","buildGitlab"],"mappings":"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"}
1
+ {"version":3,"file":"utils.cjs.js","sources":["../../../src/gitlab/utils/utils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type {\n CacheService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport {\n ScmIntegrations,\n type GitLabIntegrationConfig,\n} from '@backstage/integration';\n\nimport { Gitlab, OffsetPagination } from '@gitbeaker/rest';\n\nimport { logErrorIfNeeded } from '../../helpers';\nimport type { CustomGitlabCredentialsProvider } from '../GitlabAppManager';\nimport {\n type ExtendedGitlabCredentials,\n type GitlabFetchError,\n} from '../types';\nimport { buildGitlab } from './glUtils';\nimport { validateAndBuildRepoData, ValidatedRepo } from './repoUtils';\n\n// /**\n// * Creates the GitlabFetchError to be stored in the returned errors array of the returned GitlabRepositoryResponse object\n// */\nexport function createCredentialError(\n err?: Error,\n): GitlabFetchError | undefined {\n if (err) {\n return {\n type: 'token',\n error: {\n name: err.name,\n message: err.message,\n },\n };\n }\n return undefined;\n}\n\nexport function verifyAndGetIntegrations(\n deps: {\n logger: LoggerService;\n },\n\n integrations: ScmIntegrations,\n) {\n const glConfigs = integrations.gitlab.list().map(glInit => glInit.config);\n\n if (glConfigs.length === 0) {\n deps.logger.debug(\n 'No GitLab Integration in config => returning an empty list of repositories.',\n );\n throw new Error(\n \"Looks like there is no GitLab Integration in config. Please add a configuration entry under 'integrations.gitlab\",\n );\n }\n return glConfigs;\n}\n\nexport async function getCredentialsFromIntegrations(\n gitlabCredentialsProvider: CustomGitlabCredentialsProvider,\n glConfigs: GitLabIntegrationConfig[],\n) {\n const credentialsByConfig = new Map<\n GitLabIntegrationConfig,\n ExtendedGitlabCredentials[]\n >();\n for (const glConfig of glConfigs) {\n const creds = await getCredentialsForConfig(\n gitlabCredentialsProvider,\n glConfig,\n );\n credentialsByConfig.set(glConfig, creds);\n }\n return credentialsByConfig;\n}\n\nexport async function getCredentialsForConfig(\n gitlabCredentialsProvider: CustomGitlabCredentialsProvider,\n glConfig: GitLabIntegrationConfig,\n) {\n return await gitlabCredentialsProvider.getAllCredentials({\n host: glConfig.host,\n });\n}\n\nexport function handleError(\n deps: {\n logger: LoggerService;\n },\n desc: string,\n _credential: ExtendedGitlabCredentials,\n errors: Map<number, GitlabFetchError>,\n err: any,\n) {\n logErrorIfNeeded(deps.logger, `${desc} failed`, err);\n const credentialError = createCredentialError(err as Error);\n if (credentialError) {\n errors.set(-1, credentialError);\n }\n}\n\nexport async function computeTotalCountFromPaginationInfo(\n deps: {\n logger: LoggerService;\n },\n paginationInfo: OffsetPagination,\n pageSize?: number,\n): Promise<number | undefined> {\n /*\n paginationInfo: {\n total: , This is the total amount of repos, but will be NaN if the value is above 10k, see: https://github.com/jdalrymple/gitbeaker/issues/839#issuecomment-636482319\n next: ,\n current: ,\n previous: ,\n perPage: ,\n totalPages:\n }\n */\n\n if (isNaN(paginationInfo.total)) {\n deps.logger.debug(\n `Too many result, total count is NaN, returning current page size`,\n );\n return pageSize;\n }\n return paginationInfo.total;\n}\n\nexport async function executeFunctionOnFirstSuccessfulIntegration<T>(\n deps: {\n logger: LoggerService;\n cache: CacheService;\n config: Config;\n gitlabCredentialsProvider: CustomGitlabCredentialsProvider;\n },\n integrations: ScmIntegrations,\n params: {\n repoUrl: string;\n fn: (\n validatedRepo: ValidatedRepo,\n gitlab: InstanceType<typeof Gitlab<false>>,\n ) => Promise<{ successful: boolean; result?: T }>;\n },\n) {\n const validatedRepo = await validateAndBuildRepoData(\n deps.gitlabCredentialsProvider,\n integrations,\n deps.config,\n params,\n );\n for (const credential of validatedRepo.credentials) {\n const glKit = buildGitlab(\n deps,\n { credential, owner: validatedRepo.owner },\n validatedRepo.glConfig.baseUrl,\n );\n const res = await params.fn(validatedRepo, glKit);\n if (!res.successful) {\n continue;\n }\n return res.result;\n }\n return undefined;\n}\n\nexport async function fetchFromAllIntegrations<T>(\n deps: {\n logger: LoggerService;\n cache: CacheService;\n gitlabCredentialsProvider: CustomGitlabCredentialsProvider;\n },\n integrations: ScmIntegrations,\n params: {\n dataFetcher: (\n gitlab: InstanceType<typeof Gitlab<false>>,\n credential: ExtendedGitlabCredentials,\n glConfig: GitLabIntegrationConfig,\n ) => Promise<{\n stopFetchingData?: boolean;\n result?: T;\n errors?: GitlabFetchError[];\n }>;\n },\n) {\n const glConfigs = verifyAndGetIntegrations(deps, integrations);\n\n const credentialsByConfig = await getCredentialsFromIntegrations(\n deps.gitlabCredentialsProvider,\n glConfigs,\n );\n const errors = new Map<number, GitlabFetchError>();\n const data: T[] = [];\n const dataErrs: GitlabFetchError[] = [];\n let stopFetchingData: boolean | undefined = false;\n for (const [glConfig, credentials] of credentialsByConfig) {\n if (stopFetchingData) {\n break;\n }\n deps.logger.debug(\n `Got ${credentials.length} credential(s) for ${glConfig.host}`,\n );\n for (const credential of credentials) {\n const glKit = buildGitlab(deps, { credential, errors }, glConfig.baseUrl);\n const res = await params.dataFetcher(glKit, credential, glConfig);\n res.errors?.forEach(err => dataErrs.push(err));\n\n if (res.result) {\n data.push(res.result);\n }\n\n stopFetchingData = res.stopFetchingData;\n }\n }\n\n const aggregatedErrors = new Map<number, GitlabFetchError>();\n errors.forEach((err, num) => aggregatedErrors.set(num, err));\n dataErrs.forEach((err, idx) => aggregatedErrors.set(idx, err));\n\n return { data, errors: aggregatedErrors };\n}\n"],"names":["logErrorIfNeeded","validateAndBuildRepoData","buildGitlab"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"auditorUtils.cjs.js","sources":["../../src/helpers/auditorUtils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type {\n AuditorService,\n AuditorServiceEvent,\n} from '@backstage/backend-plugin-api';\nimport { JsonObject } from '@backstage/types';\n\nimport express from 'express';\nimport kebabCase from 'just-kebab-case';\n\nconst UNKNOWN_ENDPOINT_EVENT = `unknown-endpoint`;\n\nexport async function auditCreateEvent(\n auditor: AuditorService,\n eventId: string | undefined,\n req: express.Request,\n meta?: JsonObject,\n): Promise<AuditorServiceEvent> {\n return await auditor.createEvent({\n eventId: eventId ? kebabCase(eventId) : UNKNOWN_ENDPOINT_EVENT,\n severityLevel: 'medium',\n request: req,\n meta,\n });\n}\n"],"names":["kebabCase"],"mappings":";;;;;;;;AAyBA,MAAM,sBAAyB,GAAA,CAAA,gBAAA,CAAA;AAE/B,eAAsB,gBACpB,CAAA,OAAA,EACA,OACA,EAAA,GAAA,EACA,IAC8B,EAAA;AAC9B,EAAO,OAAA,MAAM,QAAQ,WAAY,CAAA;AAAA,IAC/B,OAAS,EAAA,OAAA,GAAUA,0BAAU,CAAA,OAAO,CAAI,GAAA,sBAAA;AAAA,IACxC,aAAe,EAAA,QAAA;AAAA,IACf,OAAS,EAAA,GAAA;AAAA,IACT;AAAA,GACD,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"auditorUtils.cjs.js","sources":["../../src/helpers/auditorUtils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type {\n AuditorService,\n AuditorServiceEvent,\n} from '@backstage/backend-plugin-api';\nimport { JsonObject } from '@backstage/types';\n\nimport express from 'express';\nimport kebabCase from 'just-kebab-case';\n\nconst UNKNOWN_ENDPOINT_EVENT = `unknown-endpoint`;\n\nexport async function auditCreateEvent(\n auditor: AuditorService,\n eventId: string | undefined,\n req: express.Request,\n meta?: JsonObject,\n): Promise<AuditorServiceEvent> {\n return await auditor.createEvent({\n eventId: eventId ? kebabCase(eventId) : UNKNOWN_ENDPOINT_EVENT,\n severityLevel: 'medium',\n request: req,\n meta,\n });\n}\n"],"names":["kebabCase"],"mappings":";;;;;;;;AAyBA,MAAM,sBAAA,GAAyB,CAAA,gBAAA,CAAA;AAE/B,eAAsB,gBAAA,CACpB,OAAA,EACA,OAAA,EACA,GAAA,EACA,IAAA,EAC8B;AAC9B,EAAA,OAAO,MAAM,QAAQ,WAAA,CAAY;AAAA,IAC/B,OAAA,EAAS,OAAA,GAAUA,0BAAA,CAAU,OAAO,CAAA,GAAI,sBAAA;AAAA,IACxC,aAAA,EAAe,QAAA;AAAA,IACf,OAAA,EAAS,GAAA;AAAA,IACT;AAAA,GACD,CAAA;AACH;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"auth.cjs.js","sources":["../../src/helpers/auth.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type {\n AuditorService,\n AuthService,\n HttpAuthService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\nimport { NotAllowedError } from '@backstage/errors';\nimport { AuthorizeResult } from '@backstage/plugin-permission-common';\n\nimport express from 'express';\n\nimport { bulkImportPermission } from '@red-hat-developer-hub/backstage-plugin-bulk-import-common';\n\nimport { auditCreateEvent } from './auditorUtils';\n\n/**\n * This will resolve to { result: AuthorizeResult.ALLOW } if the permission framework is disabled\n */\nexport async function permissionCheck(\n auditor: AuditorService,\n openApiOperationId: string | undefined,\n permissions: PermissionsService,\n httpAuth: HttpAuthService,\n req: express.Request,\n) {\n const decision = (\n await permissions.authorize(\n [\n {\n permission: bulkImportPermission,\n resourceRef: bulkImportPermission.resourceType,\n },\n ],\n {\n credentials: await httpAuth.credentials(req),\n },\n )\n )[0];\n\n if (decision.result === AuthorizeResult.DENY) {\n const err = new NotAllowedError('Unauthorized');\n const auditorEvent = await auditCreateEvent(\n auditor,\n openApiOperationId,\n req,\n );\n await auditorEvent.fail({ error: err, meta: { responseStatus: 403 } });\n throw err;\n }\n}\n\nexport async function getTokenForPlugin(\n auth: AuthService,\n targetPluginId: string,\n): Promise<string> {\n const resp = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId,\n });\n return resp.token;\n}\n"],"names":["bulkImportPermission","AuthorizeResult","NotAllowedError","auditCreateEvent"],"mappings":";;;;;;;AAkCA,eAAsB,eACpB,CAAA,OAAA,EACA,kBACA,EAAA,WAAA,EACA,UACA,GACA,EAAA;AACA,EAAM,MAAA,QAAA,GAAA,CACJ,MAAM,WAAY,CAAA,SAAA;AAAA,IAChB;AAAA,MACE;AAAA,QACE,UAAY,EAAAA,oDAAA;AAAA,QACZ,aAAaA,oDAAqB,CAAA;AAAA;AACpC,KACF;AAAA,IACA;AAAA,MACE,WAAa,EAAA,MAAM,QAAS,CAAA,WAAA,CAAY,GAAG;AAAA;AAC7C,KAEF,CAAC,CAAA;AAEH,EAAI,IAAA,QAAA,CAAS,MAAW,KAAAC,sCAAA,CAAgB,IAAM,EAAA;AAC5C,IAAM,MAAA,GAAA,GAAM,IAAIC,sBAAA,CAAgB,cAAc,CAAA;AAC9C,IAAA,MAAM,eAAe,MAAMC,6BAAA;AAAA,MACzB,OAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAM,MAAA,YAAA,CAAa,IAAK,CAAA,EAAE,KAAO,EAAA,GAAA,EAAK,MAAM,EAAE,cAAA,EAAgB,GAAI,EAAA,EAAG,CAAA;AACrE,IAAM,MAAA,GAAA;AAAA;AAEV;AAEsB,eAAA,iBAAA,CACpB,MACA,cACiB,EAAA;AACjB,EAAM,MAAA,IAAA,GAAO,MAAM,IAAA,CAAK,qBAAsB,CAAA;AAAA,IAC5C,UAAA,EAAY,MAAM,IAAA,CAAK,wBAAyB,EAAA;AAAA,IAChD;AAAA,GACD,CAAA;AACD,EAAA,OAAO,IAAK,CAAA,KAAA;AACd;;;;;"}
1
+ {"version":3,"file":"auth.cjs.js","sources":["../../src/helpers/auth.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type {\n AuditorService,\n AuthService,\n HttpAuthService,\n PermissionsService,\n} from '@backstage/backend-plugin-api';\nimport { NotAllowedError } from '@backstage/errors';\nimport { AuthorizeResult } from '@backstage/plugin-permission-common';\n\nimport express from 'express';\n\nimport { bulkImportPermission } from '@red-hat-developer-hub/backstage-plugin-bulk-import-common';\n\nimport { auditCreateEvent } from './auditorUtils';\n\n/**\n * This will resolve to { result: AuthorizeResult.ALLOW } if the permission framework is disabled\n */\nexport async function permissionCheck(\n auditor: AuditorService,\n openApiOperationId: string | undefined,\n permissions: PermissionsService,\n httpAuth: HttpAuthService,\n req: express.Request,\n) {\n const decision = (\n await permissions.authorize(\n [\n {\n permission: bulkImportPermission,\n resourceRef: bulkImportPermission.resourceType,\n },\n ],\n {\n credentials: await httpAuth.credentials(req),\n },\n )\n )[0];\n\n if (decision.result === AuthorizeResult.DENY) {\n const err = new NotAllowedError('Unauthorized');\n const auditorEvent = await auditCreateEvent(\n auditor,\n openApiOperationId,\n req,\n );\n await auditorEvent.fail({ error: err, meta: { responseStatus: 403 } });\n throw err;\n }\n}\n\nexport async function getTokenForPlugin(\n auth: AuthService,\n targetPluginId: string,\n): Promise<string> {\n const resp = await auth.getPluginRequestToken({\n onBehalfOf: await auth.getOwnServiceCredentials(),\n targetPluginId,\n });\n return resp.token;\n}\n"],"names":["bulkImportPermission","AuthorizeResult","NotAllowedError","auditCreateEvent"],"mappings":";;;;;;;AAkCA,eAAsB,eAAA,CACpB,OAAA,EACA,kBAAA,EACA,WAAA,EACA,UACA,GAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAA,CACJ,MAAM,WAAA,CAAY,SAAA;AAAA,IAChB;AAAA,MACE;AAAA,QACE,UAAA,EAAYA,oDAAA;AAAA,QACZ,aAAaA,oDAAA,CAAqB;AAAA;AACpC,KACF;AAAA,IACA;AAAA,MACE,WAAA,EAAa,MAAM,QAAA,CAAS,WAAA,CAAY,GAAG;AAAA;AAC7C,KAEF,CAAC,CAAA;AAEH,EAAA,IAAI,QAAA,CAAS,MAAA,KAAWC,sCAAA,CAAgB,IAAA,EAAM;AAC5C,IAAA,MAAM,GAAA,GAAM,IAAIC,sBAAA,CAAgB,cAAc,CAAA;AAC9C,IAAA,MAAM,eAAe,MAAMC,6BAAA;AAAA,MACzB,OAAA;AAAA,MACA,kBAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,YAAA,CAAa,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,MAAM,EAAE,cAAA,EAAgB,GAAA,EAAI,EAAG,CAAA;AACrE,IAAA,MAAM,GAAA;AAAA,EACR;AACF;AAEA,eAAsB,iBAAA,CACpB,MACA,cAAA,EACiB;AACjB,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,CAAK,qBAAA,CAAsB;AAAA,IAC5C,UAAA,EAAY,MAAM,IAAA,CAAK,wBAAA,EAAyB;AAAA,IAChD;AAAA,GACD,CAAA;AACD,EAAA,OAAO,IAAA,CAAK,KAAA;AACd;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"loggingUtils.cjs.js","sources":["../../src/helpers/loggingUtils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type { LoggerService } from '@backstage/backend-plugin-api';\nimport { isError } from '@backstage/errors';\n\n/**\n * Logs the error specified by ensuring no sensitive internal data is disclosed.\n * @param logger the logger\n * @param logMsg the log message\n * @param error the error\n */\nexport function logErrorIfNeeded(\n logger: LoggerService,\n logMsg: string,\n error: any,\n) {\n if (isError(error)) {\n // Ensure that we don't log any sensitive internal data:\n logger.error(logMsg, {\n // Default Error properties:\n name: error.name,\n message: error.message,\n stack: error.stack,\n // Additional status code if available:\n status: (error.response as { status?: string })?.status,\n });\n }\n}\n"],"names":["isError"],"mappings":";;;;AAyBgB,SAAA,gBAAA,CACd,MACA,EAAA,MAAA,EACA,KACA,EAAA;AACA,EAAI,IAAAA,cAAA,CAAQ,KAAK,CAAG,EAAA;AAElB,IAAA,MAAA,CAAO,MAAM,MAAQ,EAAA;AAAA;AAAA,MAEnB,MAAM,KAAM,CAAA,IAAA;AAAA,MACZ,SAAS,KAAM,CAAA,OAAA;AAAA,MACf,OAAO,KAAM,CAAA,KAAA;AAAA;AAAA,MAEb,MAAA,EAAS,MAAM,QAAkC,EAAA;AAAA,KAClD,CAAA;AAAA;AAEL;;;;"}
1
+ {"version":3,"file":"loggingUtils.cjs.js","sources":["../../src/helpers/loggingUtils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type { LoggerService } from '@backstage/backend-plugin-api';\nimport { isError } from '@backstage/errors';\n\n/**\n * Logs the error specified by ensuring no sensitive internal data is disclosed.\n * @param logger the logger\n * @param logMsg the log message\n * @param error the error\n */\nexport function logErrorIfNeeded(\n logger: LoggerService,\n logMsg: string,\n error: any,\n) {\n if (isError(error)) {\n // Ensure that we don't log any sensitive internal data:\n logger.error(logMsg, {\n // Default Error properties:\n name: error.name,\n message: error.message,\n stack: error.stack,\n // Additional status code if available:\n status: (error.response as { status?: string })?.status,\n });\n }\n}\n"],"names":["isError"],"mappings":";;;;AAyBO,SAAS,gBAAA,CACd,MAAA,EACA,MAAA,EACA,KAAA,EACA;AACA,EAAA,IAAIA,cAAA,CAAQ,KAAK,CAAA,EAAG;AAElB,IAAA,MAAA,CAAO,MAAM,MAAA,EAAQ;AAAA;AAAA,MAEnB,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,OAAO,KAAA,CAAM,KAAA;AAAA;AAAA,MAEb,MAAA,EAAS,MAAM,QAAA,EAAkC;AAAA,KAClD,CAAA;AAAA,EACH;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"pagination.cjs.js","sources":["../../src/helpers/pagination.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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\n/**\n * Returns a paginated chunk of the specified array\n * @param array the array to paginate\n * @param page the page number\n * @param size the maximum number of elements in each page\n */\nexport function paginateArray<T>(\n array: T[] | undefined,\n page: number,\n size: number,\n): { result: T[]; totalCount: number } {\n if (page <= 0) {\n throw new Error(`page must be >0. Got page=${page}`);\n }\n if (size < 0) {\n throw new Error(`size must be >=0. Got size=${size}`);\n }\n\n const startIndex = (page - 1) * size;\n const endIndex = startIndex + size;\n\n return {\n result: array?.slice(startIndex, endIndex) ?? [],\n totalCount: array?.length ?? 0,\n };\n}\n"],"names":[],"mappings":";;AAsBgB,SAAA,aAAA,CACd,KACA,EAAA,IAAA,EACA,IACqC,EAAA;AACrC,EAAA,IAAI,QAAQ,CAAG,EAAA;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAA6B,0BAAA,EAAA,IAAI,CAAE,CAAA,CAAA;AAAA;AAErD,EAAA,IAAI,OAAO,CAAG,EAAA;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAA8B,2BAAA,EAAA,IAAI,CAAE,CAAA,CAAA;AAAA;AAGtD,EAAM,MAAA,UAAA,GAAA,CAAc,OAAO,CAAK,IAAA,IAAA;AAChC,EAAA,MAAM,WAAW,UAAa,GAAA,IAAA;AAE9B,EAAO,OAAA;AAAA,IACL,QAAQ,KAAO,EAAA,KAAA,CAAM,UAAY,EAAA,QAAQ,KAAK,EAAC;AAAA,IAC/C,UAAA,EAAY,OAAO,MAAU,IAAA;AAAA,GAC/B;AACF;;;;"}
1
+ {"version":3,"file":"pagination.cjs.js","sources":["../../src/helpers/pagination.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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\n/**\n * Returns a paginated chunk of the specified array\n * @param array the array to paginate\n * @param page the page number\n * @param size the maximum number of elements in each page\n */\nexport function paginateArray<T>(\n array: T[] | undefined,\n page: number,\n size: number,\n): { result: T[]; totalCount: number } {\n if (page <= 0) {\n throw new Error(`page must be >0. Got page=${page}`);\n }\n if (size < 0) {\n throw new Error(`size must be >=0. Got size=${size}`);\n }\n\n const startIndex = (page - 1) * size;\n const endIndex = startIndex + size;\n\n return {\n result: array?.slice(startIndex, endIndex) ?? [],\n totalCount: array?.length ?? 0,\n };\n}\n"],"names":[],"mappings":";;AAsBO,SAAS,aAAA,CACd,KAAA,EACA,IAAA,EACA,IAAA,EACqC;AACrC,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,0BAAA,EAA6B,IAAI,CAAA,CAAE,CAAA;AAAA,EACrD;AACA,EAAA,IAAI,OAAO,CAAA,EAAG;AACZ,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,CAAE,CAAA;AAAA,EACtD;AAEA,EAAA,MAAM,UAAA,GAAA,CAAc,OAAO,CAAA,IAAK,IAAA;AAChC,EAAA,MAAM,WAAW,UAAA,GAAa,IAAA;AAE9B,EAAA,OAAO;AAAA,IACL,QAAQ,KAAA,EAAO,KAAA,CAAM,UAAA,EAAY,QAAQ,KAAK,EAAC;AAAA,IAC/C,UAAA,EAAY,OAAO,MAAA,IAAU;AAAA,GAC/B;AACF;;;;"}
@@ -10,7 +10,7 @@ var gitUrlParse__default = /*#__PURE__*/_interopDefaultCompat(gitUrlParse);
10
10
 
11
11
  function getNestedValue(obj, path) {
12
12
  return path.split(".").reduce(
13
- (acc, key) => acc && acc[key] ? acc[key] : undefined,
13
+ (acc, key) => acc && acc[key] ? acc[key] : void 0,
14
14
  obj
15
15
  );
16
16
  }
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs.js","sources":["../../src/helpers/utils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\nimport { InputError } from '@backstage/errors';\n\nimport gitUrlParse from 'git-url-parse';\n\nexport function getNestedValue<T>(obj: T, path: string): any {\n return path\n .split('.')\n .reduce(\n (acc, key) =>\n acc && (acc as Record<string, any>)[key]\n ? (acc as Record<string, any>)[key]\n : undefined,\n obj,\n );\n}\n\nexport function extractLocationOwnerMap(locationUrls: string[]) {\n const locationGitOwnerMap = new Map<string, string>();\n for (const locationUrl of locationUrls) {\n const split = locationUrl.split('/blob/');\n if (split.length < 2) {\n continue;\n }\n locationGitOwnerMap.set(locationUrl, gitUrlParse(split[0]).owner);\n }\n return locationGitOwnerMap;\n}\n\nexport function computeTotalCount<T>(\n data: T[],\n countList: number[],\n pageSize: number,\n) {\n let totalCount = countList.reduce(\n (accumulator, currentValue) => accumulator + currentValue,\n 0,\n );\n if (totalCount < pageSize) {\n totalCount = data.length;\n }\n return totalCount;\n}\n\nexport function parseGitURLForApprovalTool(repoUrl: string) {\n const parsedRepoUrl = new URL(repoUrl);\n if (parsedRepoUrl.hostname.includes('gitlab')) {\n return 'GITLAB';\n }\n\n return 'GIT';\n}\n\nexport function getImportTemplateRef(templateRef: string): string {\n try {\n const { name, namespace, kind } = parseEntityRef(templateRef, {\n defaultKind: 'template',\n defaultNamespace: 'default',\n });\n\n if (kind !== 'template') {\n throw new InputError(\n `Invalid 'kind' in bulkImport.importTemplate: expected 'template' but got '${kind}'.`,\n );\n }\n\n return stringifyEntityRef({ kind, namespace, name });\n } catch (err) {\n throw new InputError(\n `Invalid scaffolder template entity reference in the configuration 'bulkImport.importTemplate': '${templateRef}'. ` +\n `Error: ${(err as Error).message}`,\n );\n }\n}\n"],"names":["gitUrlParse","parseEntityRef","InputError","stringifyEntityRef"],"mappings":";;;;;;;;;;AAqBgB,SAAA,cAAA,CAAkB,KAAQ,IAAmB,EAAA;AAC3D,EAAO,OAAA,IAAA,CACJ,KAAM,CAAA,GAAG,CACT,CAAA,MAAA;AAAA,IACC,CAAC,KAAK,GACJ,KAAA,GAAA,IAAQ,IAA4B,GAAG,CAAA,GAClC,GAA4B,CAAA,GAAG,CAChC,GAAA,SAAA;AAAA,IACN;AAAA,GACF;AACJ;AAEO,SAAS,wBAAwB,YAAwB,EAAA;AAC9D,EAAM,MAAA,mBAAA,uBAA0B,GAAoB,EAAA;AACpD,EAAA,KAAA,MAAW,eAAe,YAAc,EAAA;AACtC,IAAM,MAAA,KAAA,GAAQ,WAAY,CAAA,KAAA,CAAM,QAAQ,CAAA;AACxC,IAAI,IAAA,KAAA,CAAM,SAAS,CAAG,EAAA;AACpB,MAAA;AAAA;AAEF,IAAA,mBAAA,CAAoB,IAAI,WAAa,EAAAA,4BAAA,CAAY,MAAM,CAAC,CAAC,EAAE,KAAK,CAAA;AAAA;AAElE,EAAO,OAAA,mBAAA;AACT;AAEgB,SAAA,iBAAA,CACd,IACA,EAAA,SAAA,EACA,QACA,EAAA;AACA,EAAA,IAAI,aAAa,SAAU,CAAA,MAAA;AAAA,IACzB,CAAC,WAAa,EAAA,YAAA,KAAiB,WAAc,GAAA,YAAA;AAAA,IAC7C;AAAA,GACF;AACA,EAAA,IAAI,aAAa,QAAU,EAAA;AACzB,IAAA,UAAA,GAAa,IAAK,CAAA,MAAA;AAAA;AAEpB,EAAO,OAAA,UAAA;AACT;AAEO,SAAS,2BAA2B,OAAiB,EAAA;AAC1D,EAAM,MAAA,aAAA,GAAgB,IAAI,GAAA,CAAI,OAAO,CAAA;AACrC,EAAA,IAAI,aAAc,CAAA,QAAA,CAAS,QAAS,CAAA,QAAQ,CAAG,EAAA;AAC7C,IAAO,OAAA,QAAA;AAAA;AAGT,EAAO,OAAA,KAAA;AACT;AAEO,SAAS,qBAAqB,WAA6B,EAAA;AAChE,EAAI,IAAA;AACF,IAAA,MAAM,EAAE,IAAM,EAAA,SAAA,EAAW,IAAK,EAAA,GAAIC,4BAAe,WAAa,EAAA;AAAA,MAC5D,WAAa,EAAA,UAAA;AAAA,MACb,gBAAkB,EAAA;AAAA,KACnB,CAAA;AAED,IAAA,IAAI,SAAS,UAAY,EAAA;AACvB,MAAA,MAAM,IAAIC,iBAAA;AAAA,QACR,6EAA6E,IAAI,CAAA,EAAA;AAAA,OACnF;AAAA;AAGF,IAAA,OAAOC,+BAAmB,CAAA,EAAE,IAAM,EAAA,SAAA,EAAW,MAAM,CAAA;AAAA,WAC5C,GAAK,EAAA;AACZ,IAAA,MAAM,IAAID,iBAAA;AAAA,MACR,CAAmG,gGAAA,EAAA,WAAW,CACjG,UAAA,EAAA,GAAA,CAAc,OAAO,CAAA;AAAA,KACpC;AAAA;AAEJ;;;;;;;;"}
1
+ {"version":3,"file":"utils.cjs.js","sources":["../../src/helpers/utils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\nimport { InputError } from '@backstage/errors';\n\nimport gitUrlParse from 'git-url-parse';\n\nexport function getNestedValue<T>(obj: T, path: string): any {\n return path\n .split('.')\n .reduce(\n (acc, key) =>\n acc && (acc as Record<string, any>)[key]\n ? (acc as Record<string, any>)[key]\n : undefined,\n obj,\n );\n}\n\nexport function extractLocationOwnerMap(locationUrls: string[]) {\n const locationGitOwnerMap = new Map<string, string>();\n for (const locationUrl of locationUrls) {\n const split = locationUrl.split('/blob/');\n if (split.length < 2) {\n continue;\n }\n locationGitOwnerMap.set(locationUrl, gitUrlParse(split[0]).owner);\n }\n return locationGitOwnerMap;\n}\n\nexport function computeTotalCount<T>(\n data: T[],\n countList: number[],\n pageSize: number,\n) {\n let totalCount = countList.reduce(\n (accumulator, currentValue) => accumulator + currentValue,\n 0,\n );\n if (totalCount < pageSize) {\n totalCount = data.length;\n }\n return totalCount;\n}\n\nexport function parseGitURLForApprovalTool(repoUrl: string) {\n const parsedRepoUrl = new URL(repoUrl);\n if (parsedRepoUrl.hostname.includes('gitlab')) {\n return 'GITLAB';\n }\n\n return 'GIT';\n}\n\nexport function getImportTemplateRef(templateRef: string): string {\n try {\n const { name, namespace, kind } = parseEntityRef(templateRef, {\n defaultKind: 'template',\n defaultNamespace: 'default',\n });\n\n if (kind !== 'template') {\n throw new InputError(\n `Invalid 'kind' in bulkImport.importTemplate: expected 'template' but got '${kind}'.`,\n );\n }\n\n return stringifyEntityRef({ kind, namespace, name });\n } catch (err) {\n throw new InputError(\n `Invalid scaffolder template entity reference in the configuration 'bulkImport.importTemplate': '${templateRef}'. ` +\n `Error: ${(err as Error).message}`,\n );\n }\n}\n"],"names":["gitUrlParse","parseEntityRef","InputError","stringifyEntityRef"],"mappings":";;;;;;;;;;AAqBO,SAAS,cAAA,CAAkB,KAAQ,IAAA,EAAmB;AAC3D,EAAA,OAAO,IAAA,CACJ,KAAA,CAAM,GAAG,CAAA,CACT,MAAA;AAAA,IACC,CAAC,KAAK,GAAA,KACJ,GAAA,IAAQ,IAA4B,GAAG,CAAA,GAClC,GAAA,CAA4B,GAAG,CAAA,GAChC,MAAA;AAAA,IACN;AAAA,GACF;AACJ;AAEO,SAAS,wBAAwB,YAAA,EAAwB;AAC9D,EAAA,MAAM,mBAAA,uBAA0B,GAAA,EAAoB;AACpD,EAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,IAAA,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAA;AACxC,IAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,MAAA;AAAA,IACF;AACA,IAAA,mBAAA,CAAoB,IAAI,WAAA,EAAaA,4BAAA,CAAY,MAAM,CAAC,CAAC,EAAE,KAAK,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,mBAAA;AACT;AAEO,SAAS,iBAAA,CACd,IAAA,EACA,SAAA,EACA,QAAA,EACA;AACA,EAAA,IAAI,aAAa,SAAA,CAAU,MAAA;AAAA,IACzB,CAAC,WAAA,EAAa,YAAA,KAAiB,WAAA,GAAc,YAAA;AAAA,IAC7C;AAAA,GACF;AACA,EAAA,IAAI,aAAa,QAAA,EAAU;AACzB,IAAA,UAAA,GAAa,IAAA,CAAK,MAAA;AAAA,EACpB;AACA,EAAA,OAAO,UAAA;AACT;AAEO,SAAS,2BAA2B,OAAA,EAAiB;AAC1D,EAAA,MAAM,aAAA,GAAgB,IAAI,GAAA,CAAI,OAAO,CAAA;AACrC,EAAA,IAAI,aAAA,CAAc,QAAA,CAAS,QAAA,CAAS,QAAQ,CAAA,EAAG;AAC7C,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;AAEO,SAAS,qBAAqB,WAAA,EAA6B;AAChE,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,IAAA,EAAM,SAAA,EAAW,IAAA,EAAK,GAAIC,4BAAe,WAAA,EAAa;AAAA,MAC5D,WAAA,EAAa,UAAA;AAAA,MACb,gBAAA,EAAkB;AAAA,KACnB,CAAA;AAED,IAAA,IAAI,SAAS,UAAA,EAAY;AACvB,MAAA,MAAM,IAAIC,iBAAA;AAAA,QACR,6EAA6E,IAAI,CAAA,EAAA;AAAA,OACnF;AAAA,IACF;AAEA,IAAA,OAAOC,+BAAA,CAAmB,EAAE,IAAA,EAAM,SAAA,EAAW,MAAM,CAAA;AAAA,EACrD,SAAS,GAAA,EAAK;AACZ,IAAA,MAAM,IAAID,iBAAA;AAAA,MACR,CAAA,gGAAA,EAAmG,WAAW,CAAA,UAAA,EACjG,GAAA,CAAc,OAAO,CAAA;AAAA,KACpC;AAAA,EACF;AACF;;;;;;;;"}
package/dist/index.d.ts CHANGED
@@ -33,4 +33,5 @@ interface RouterOptions {
33
33
  */
34
34
  declare function createRouter(options: RouterOptions): Promise<express.Router>;
35
35
 
36
- export { type RouterOptions, createRouter, bulkImportPlugin as default };
36
+ export { createRouter, bulkImportPlugin as default };
37
+ export type { RouterOptions };
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha';\n\nimport { createRouter } from './service/router';\n\n/**\n * The bulk-import backend plugin.\n * @public\n */\nexport const bulkImportPlugin = createBackendPlugin({\n pluginId: 'bulk-import',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n http: coreServices.httpRouter,\n cache: coreServices.cache,\n discovery: coreServices.discovery,\n permissions: coreServices.permissions,\n httpAuth: coreServices.httpAuth,\n auth: coreServices.auth,\n catalogApi: catalogServiceRef,\n auditor: coreServices.auditor,\n database: coreServices.database,\n },\n async init({\n config,\n logger,\n http,\n cache,\n discovery,\n permissions,\n httpAuth,\n auth,\n catalogApi,\n auditor,\n database,\n }) {\n const router = await createRouter({\n config,\n cache,\n discovery,\n permissions,\n logger,\n httpAuth,\n auth,\n catalogApi,\n auditor,\n database,\n });\n http.use(router);\n http.addAuthPolicy({\n path: '/ping',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createBackendPlugin","coreServices","catalogServiceRef","router","createRouter"],"mappings":";;;;;;AA4BO,MAAM,mBAAmBA,oCAAoB,CAAA;AAAA,EAClD,QAAU,EAAA,aAAA;AAAA,EACV,SAAS,GAAK,EAAA;AACZ,IAAA,GAAA,CAAI,YAAa,CAAA;AAAA,MACf,IAAM,EAAA;AAAA,QACJ,QAAQC,6BAAa,CAAA,MAAA;AAAA,QACrB,QAAQA,6BAAa,CAAA,UAAA;AAAA,QACrB,MAAMA,6BAAa,CAAA,UAAA;AAAA,QACnB,OAAOA,6BAAa,CAAA,KAAA;AAAA,QACpB,WAAWA,6BAAa,CAAA,SAAA;AAAA,QACxB,aAAaA,6BAAa,CAAA,WAAA;AAAA,QAC1B,UAAUA,6BAAa,CAAA,QAAA;AAAA,QACvB,MAAMA,6BAAa,CAAA,IAAA;AAAA,QACnB,UAAY,EAAAC,uBAAA;AAAA,QACZ,SAASD,6BAAa,CAAA,OAAA;AAAA,QACtB,UAAUA,6BAAa,CAAA;AAAA,OACzB;AAAA,MACA,MAAM,IAAK,CAAA;AAAA,QACT,MAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACC,EAAA;AACD,QAAM,MAAAE,QAAA,GAAS,MAAMC,mBAAa,CAAA;AAAA,UAChC,MAAA;AAAA,UACA,KAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAA;AAAA,UACA,IAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,IAAA,CAAK,IAAID,QAAM,CAAA;AACf,QAAA,IAAA,CAAK,aAAc,CAAA;AAAA,UACjB,IAAM,EAAA,OAAA;AAAA,UACN,KAAO,EAAA;AAAA,SACR,CAAA;AAAA;AACH,KACD,CAAA;AAAA;AAEL,CAAC;;;;"}
1
+ {"version":3,"file":"plugin.cjs.js","sources":["../src/plugin.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 coreServices,\n createBackendPlugin,\n} from '@backstage/backend-plugin-api';\nimport { catalogServiceRef } from '@backstage/plugin-catalog-node/alpha';\n\nimport { createRouter } from './service/router';\n\n/**\n * The bulk-import backend plugin.\n * @public\n */\nexport const bulkImportPlugin = createBackendPlugin({\n pluginId: 'bulk-import',\n register(env) {\n env.registerInit({\n deps: {\n logger: coreServices.logger,\n config: coreServices.rootConfig,\n http: coreServices.httpRouter,\n cache: coreServices.cache,\n discovery: coreServices.discovery,\n permissions: coreServices.permissions,\n httpAuth: coreServices.httpAuth,\n auth: coreServices.auth,\n catalogApi: catalogServiceRef,\n auditor: coreServices.auditor,\n database: coreServices.database,\n },\n async init({\n config,\n logger,\n http,\n cache,\n discovery,\n permissions,\n httpAuth,\n auth,\n catalogApi,\n auditor,\n database,\n }) {\n const router = await createRouter({\n config,\n cache,\n discovery,\n permissions,\n logger,\n httpAuth,\n auth,\n catalogApi,\n auditor,\n database,\n });\n http.use(router);\n http.addAuthPolicy({\n path: '/ping',\n allow: 'unauthenticated',\n });\n },\n });\n },\n});\n"],"names":["createBackendPlugin","coreServices","catalogServiceRef","router","createRouter"],"mappings":";;;;;;AA4BO,MAAM,mBAAmBA,oCAAA,CAAoB;AAAA,EAClD,QAAA,EAAU,aAAA;AAAA,EACV,SAAS,GAAA,EAAK;AACZ,IAAA,GAAA,CAAI,YAAA,CAAa;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,QAAQC,6BAAA,CAAa,MAAA;AAAA,QACrB,QAAQA,6BAAA,CAAa,UAAA;AAAA,QACrB,MAAMA,6BAAA,CAAa,UAAA;AAAA,QACnB,OAAOA,6BAAA,CAAa,KAAA;AAAA,QACpB,WAAWA,6BAAA,CAAa,SAAA;AAAA,QACxB,aAAaA,6BAAA,CAAa,WAAA;AAAA,QAC1B,UAAUA,6BAAA,CAAa,QAAA;AAAA,QACvB,MAAMA,6BAAA,CAAa,IAAA;AAAA,QACnB,UAAA,EAAYC,uBAAA;AAAA,QACZ,SAASD,6BAAA,CAAa,OAAA;AAAA,QACtB,UAAUA,6BAAA,CAAa;AAAA,OACzB;AAAA,MACA,MAAM,IAAA,CAAK;AAAA,QACT,MAAA;AAAA,QACA,MAAA;AAAA,QACA,IAAA;AAAA,QACA,KAAA;AAAA,QACA,SAAA;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA;AAAA,QACA,UAAA;AAAA,QACA,OAAA;AAAA,QACA;AAAA,OACF,EAAG;AACD,QAAA,MAAME,QAAA,GAAS,MAAMC,mBAAA,CAAa;AAAA,UAChC,MAAA;AAAA,UACA,KAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAA;AAAA,UACA,MAAA;AAAA,UACA,QAAA;AAAA,UACA,IAAA;AAAA,UACA,UAAA;AAAA,UACA,OAAA;AAAA,UACA;AAAA,SACD,CAAA;AACD,QAAA,IAAA,CAAK,IAAID,QAAM,CAAA;AACf,QAAA,IAAA,CAAK,aAAA,CAAc;AAAA,UACjB,IAAA,EAAM,OAAA;AAAA,UACN,KAAA,EAAO;AAAA,SACR,CAAA;AAAA,MACH;AAAA,KACD,CAAA;AAAA,EACH;AACF,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"handlers.cjs.js","sources":["../../../src/service/handlers/handlers.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type { Components } from '../../generated/openapi';\n\nexport const DefaultPageNumber = 1;\nexport const DefaultPageSize = 20;\n\nexport const DefaultSortColumn: Components.Parameters.SortColumnQueryParam =\n 'repository.name';\nexport const DefaultSortOrder: Components.Parameters.SortOrderQueryParam =\n 'asc';\n\nexport interface HandlerResponse<ResponseBody = any> {\n statusCode: number;\n responseBody?: ResponseBody;\n}\n"],"names":[],"mappings":";;AAiBO,MAAM,iBAAoB,GAAA;AAC1B,MAAM,eAAkB,GAAA;AAExB,MAAM,iBACX,GAAA;AACK,MAAM,gBACX,GAAA;;;;;;;"}
1
+ {"version":3,"file":"handlers.cjs.js","sources":["../../../src/service/handlers/handlers.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\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 type { Components } from '../../generated/openapi';\n\nexport const DefaultPageNumber = 1;\nexport const DefaultPageSize = 20;\n\nexport const DefaultSortColumn: Components.Parameters.SortColumnQueryParam =\n 'repository.name';\nexport const DefaultSortOrder: Components.Parameters.SortOrderQueryParam =\n 'asc';\n\nexport interface HandlerResponse<ResponseBody = any> {\n statusCode: number;\n responseBody?: ResponseBody;\n}\n"],"names":[],"mappings":";;AAiBO,MAAM,iBAAA,GAAoB;AAC1B,MAAM,eAAA,GAAkB;AAExB,MAAM,iBAAA,GACX;AACK,MAAM,gBAAA,GACX;;;;;;;"}
@@ -20,9 +20,9 @@ function sortImports(imports, sortColumn = handlers.DefaultSortColumn, sortOrder
20
20
  imports.sort((a, b) => {
21
21
  const value1 = utils.getNestedValue(a, sortColumn);
22
22
  const value2 = utils.getNestedValue(b, sortColumn);
23
- if (value1 === undefined && value2 === undefined) return 0;
24
- if (value1 === undefined) return sortOrder === "asc" ? -1 : 1;
25
- if (value2 === undefined) return sortOrder === "asc" ? 1 : -1;
23
+ if (value1 === void 0 && value2 === void 0) return 0;
24
+ if (value1 === void 0) return sortOrder === "asc" ? -1 : 1;
25
+ if (value2 === void 0) return sortOrder === "asc" ? 1 : -1;
26
26
  if (sortColumn === "lastUpdate") {
27
27
  const date1 = new Date(value1);
28
28
  const date2 = new Date(value2);
@@ -105,10 +105,10 @@ async function findAllImports(deps, requestHeaders, queryParams) {
105
105
  const result = await Promise.all(importStatusPromises);
106
106
  const imports = result.filter((res) => res.responseBody).map((res) => res.responseBody).map((res) => {
107
107
  const key = res?.repository?.url;
108
- const location = key ? repoUrlToLocation.get(key) : undefined;
108
+ const location = key ? repoUrlToLocation.get(key) : void 0;
109
109
  return {
110
110
  ...res,
111
- source: location ? allLocations.get(location)?.source : undefined
111
+ source: location ? allLocations.get(location)?.source : void 0
112
112
  };
113
113
  });
114
114
  sortImports(imports, sortColumn, sortOrder);
@@ -153,7 +153,7 @@ async function resolveReposDefaultBranches(logger, gitlabApiService, githubApiSe
153
153
  );
154
154
  return {
155
155
  repoUrl,
156
- defaultBranch: undefined
156
+ defaultBranch: void 0
157
157
  };
158
158
  })
159
159
  );
@@ -168,7 +168,7 @@ async function resolveReposDefaultBranches(logger, gitlabApiService, githubApiSe
168
168
  function repoUrlFromLocation(loc) {
169
169
  const split = loc.split("/blob/");
170
170
  if (split.length < 2) {
171
- return undefined;
171
+ return void 0;
172
172
  }
173
173
  return split[0];
174
174
  }
@@ -242,7 +242,7 @@ async function handleAddedReposFromCreateImportJobs(deps, importRequests) {
242
242
  const gitUrl = gitUrlParse__default.default(req.repository.url);
243
243
  result.push({
244
244
  status: "ADDED",
245
- lastUpdate: ghRepo?.repository?.updated_at ?? undefined,
245
+ lastUpdate: ghRepo?.repository?.updated_at ?? void 0,
246
246
  repository: {
247
247
  url: req.repository.url,
248
248
  name: gitUrl.name,
@@ -706,7 +706,7 @@ async function findOrchestratorImportStatusByRepo(deps, repoUrl, token, skipWork
706
706
  }
707
707
  async function parsePullOrMergeRequestInfo(checkpoints, githubApiService, gitlabApiService, approvalTool, logger, repoUrl) {
708
708
  if (approvalTool !== "GITLAB" && approvalTool !== "GIT") {
709
- return undefined;
709
+ return void 0;
710
710
  }
711
711
  const gitApiService = approvalTool === "GITLAB" ? gitlabApiService : githubApiService;
712
712
  for (const key in checkpoints) {
@@ -743,7 +743,7 @@ async function parsePullOrMergeRequestInfo(checkpoints, githubApiService, gitlab
743
743
  continue;
744
744
  }
745
745
  }
746
- return undefined;
746
+ return void 0;
747
747
  }
748
748
  async function deleteImportByRepo(deps, repoUrl, defaultBranch) {
749
749
  deps.logger.debug(`Deleting bulk import job status for ${repoUrl}..`);
@@ -771,7 +771,7 @@ async function deleteImportByRepo(deps, repoUrl, defaultBranch) {
771
771
  return loc.id;
772
772
  }
773
773
  }
774
- return undefined;
774
+ return void 0;
775
775
  };
776
776
  const locationId = findLocationFrom(
777
777
  (await deps.catalogHttpClient.listCatalogUrlLocationsByIdFromLocationsEndpoint()).locations
@@ -781,7 +781,7 @@ async function deleteImportByRepo(deps, repoUrl, defaultBranch) {
781
781
  }
782
782
  return {
783
783
  statusCode: 204,
784
- responseBody: undefined
784
+ responseBody: void 0
785
785
  };
786
786
  }
787
787
  async function deleteRepositoryRecord(deps, repoUrl) {