@red-hat-developer-hub/backstage-plugin-bulk-import-backend 7.3.7 → 8.0.1
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 +24 -0
- package/config.schema.json +21 -0
- package/dist/catalog/catalogHttpClient.cjs.js +43 -71
- package/dist/catalog/catalogHttpClient.cjs.js.map +1 -1
- package/dist/database/repositoryDao.cjs.js +6 -1
- package/dist/database/repositoryDao.cjs.js.map +1 -1
- package/dist/github/types.cjs.js.map +1 -1
- package/dist/github/utils/orgUtils.cjs.js.map +1 -1
- package/dist/helpers/auth.cjs.js +0 -8
- package/dist/helpers/auth.cjs.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/plugin.cjs.js +8 -4
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/service/handlers/import/bulkImports.cjs.js.map +1 -1
- package/dist/service/router.cjs.js +2 -10
- package/dist/service/router.cjs.js.map +1 -1
- package/package.json +21 -24
- package/config.d.ts +0 -30
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.cjs.js","sources":["../../src/service/router.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 { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport type {\n AuditorService,\n AuditorServiceEvent,\n AuthService,\n CacheService,\n DatabaseService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport type { CatalogApi } from '@backstage/catalog-client';\nimport type { Config } from '@backstage/config';\nimport { InputError } from '@backstage/errors';\nimport type { PermissionEvaluator } from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\n\nimport { fullFormats } from 'ajv-formats/dist/formats';\nimport express, { Router, type Request, type Response } from 'express';\nimport {\n Document,\n OpenAPIBackend,\n type Context,\n type Request as OpenAPIRequest,\n} from 'openapi-backend';\n\nimport { bulkImportPermission } from '@red-hat-developer-hub/backstage-plugin-bulk-import-common';\n\nimport { CatalogHttpClient } from '../catalog/catalogHttpClient';\nimport { CatalogInfoGenerator } from '../catalog/catalogInfoGenerator';\nimport { migrate } from '../database/migration';\nimport {\n OrchestratorWorkflowDao,\n RepositoryDao,\n ScaffolderTaskDao,\n TaskLocationsDao,\n} from '../database/repositoryDao';\nimport type { Components, Paths, SourceImport } from '../generated/openapi.d';\nimport { openApiDocument } from '../generated/openapidocument';\nimport { GithubApiService } from '../github';\nimport { GitlabApiService } from '../gitlab';\nimport {\n getImportTemplateRef,\n parseGitURLForApprovalTool,\n permissionCheck,\n} from '../helpers';\nimport { auditCreateEvent } from '../helpers/auditorUtils';\nimport {\n createImportJobs,\n deleteImportByRepo,\n deleteRepositoryRecord,\n findAllImports,\n findImportStatusByRepo,\n findOrchestratorImportStatusByRepo,\n findTaskImportStatusByRepo,\n sortImports,\n} from './handlers/import';\nimport { createWorkflowImportJobs } from './handlers/import/execute-orchestrator-workflow';\nimport { createTaskImportJobs } from './handlers/import/execute-template';\nimport { findAllOrganizations } from './handlers/organization';\nimport { ping } from './handlers/ping';\nimport {\n findAllRepositories,\n findRepositoriesByOrganization,\n} from './handlers/repository';\nimport { findAllSCMHosts } from './handlers/scm/scm';\n\n/**\n * Router Options\n * @public\n */\nexport interface RouterOptions {\n logger: LoggerService;\n permissions: PermissionEvaluator;\n config: Config;\n cache: CacheService;\n discovery: DiscoveryService;\n httpAuth: HttpAuthService;\n auth: AuthService;\n catalogApi: CatalogApi;\n auditor: AuditorService;\n database: DatabaseService;\n}\n\nnamespace Operations {\n export const PING = 'ping';\n export const FIND_ALL_SCM_HOSTS = 'findAllSCMHosts';\n export const FIND_ALL_ORGANIZATIONS = 'findAllOrganizations';\n export const FIND_ALL_REPOSITORIES = 'findAllRepositories';\n\n export const FIND_REPOSITORIES_BY_ORGANIZATION =\n 'findRepositoriesByOrganization';\n\n export const FIND_ALL_IMPORTS = 'findAllImports';\n export const FIND_ALL_TASK_IMPORTS = 'findAllTaskImports';\n export const FIND_ALL_ORCHESTRATOR_WORKFLOW_IMPORTS =\n 'findAllOrchestratorWorkflowImports';\n\n export const CREATE_IMPORT_JOBS = 'createImportJobs';\n export const CREATE_TASK_IMPORT_JOBS = 'createTaskImportJobs';\n export const CREATE_ORCHESTRATOR_WORKFLOW_JOBS =\n 'createOrchestratorWorkflowJobs';\n\n export const FIND_IMPORT_STATUS_BY_REPO = 'findImportStatusByRepo';\n export const FIND_TASK_IMPORT_STATUS_BY_REPO = 'findTaskImportStatusByRepo';\n export const FIND_ORCHESTRATOR_IMPORT_STATUS_BY_REPO =\n 'findOrchestratorImportStatusByRepo';\n\n export const DELETE_IMPORT_BY_REPO = 'deleteImportByRepo';\n export const DELETE_TASK_IMPORT_BY_REPO = 'deleteTaskImportByRepo';\n export const DELETE_ORCHESTRATOR_IMPORT_BY_REPO =\n 'deleteOrchestratorImportByRepo';\n}\n\nconst SCM_TOKENS_MAX_BYTES = 4096;\n\nconst isValidTokenMap = (v: unknown): v is Record<string, string> =>\n typeof v === 'object' &&\n v !== null &&\n Object.values(v).every(val => typeof val === 'string' && val.length > 0);\n\nfunction parseScmTokensHeader(\n rawTokenHeader: string | undefined,\n logger: LoggerService,\n): Record<string, string> | undefined {\n let token: Record<string, string> | undefined;\n if (!rawTokenHeader) return undefined;\n if (rawTokenHeader.length > SCM_TOKENS_MAX_BYTES) {\n logger.warn('x-scm-tokens header exceeds maximum allowed size; ignoring');\n return undefined;\n }\n try {\n token = JSON.parse(rawTokenHeader) as Record<string, string>;\n if (typeof token !== 'object' || token === null || Array.isArray(token)) {\n throw new Error('x-scm-tokens must be a JSON object');\n }\n } catch (e) {\n throw new InputError(\n `Invalid x-scm-tokens header: ${(e as Error).message}`,\n );\n }\n\n if (!isValidTokenMap(token)) {\n throw new InputError(\n 'Invalid x-scm-tokens header: all values must be non-empty strings',\n );\n }\n return token;\n}\n\n/**\n * Router\n * @public\n */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n logger,\n httpAuth,\n auth,\n permissions,\n config,\n cache,\n discovery,\n catalogApi,\n auditor: auditor,\n database,\n } = options;\n\n const knex = await migrate(database);\n const repositoryDao = new RepositoryDao(knex, logger, 'repositories');\n const taskDao = new ScaffolderTaskDao(knex);\n const taskLocationsDao = new TaskLocationsDao(knex);\n const orchestratorRepositoryDao = new RepositoryDao(\n knex,\n logger,\n 'orchestrator_repositories',\n );\n const orchestratorWorkflowDao = new OrchestratorWorkflowDao(knex);\n // GitHub and GitLab both implement the GitApiService interface; the router\n // selects the appropriate service per request based on approvalTool.\n const githubApiService = new GithubApiService(logger, config, cache);\n const gitlabApiService = new GitlabApiService(logger, config, cache);\n const catalogHttpClient = new CatalogHttpClient({\n logger,\n config,\n discovery,\n auth,\n catalogApi,\n });\n const catalogInfoGenerator = new CatalogInfoGenerator(\n logger,\n catalogHttpClient,\n );\n\n // create openapi requests handler\n const api = new OpenAPIBackend({\n ajvOpts: {\n verbose: true,\n formats: fullFormats, // open issue: https://github.com/openapistack/openapi-backend/issues/280\n },\n validate: true,\n definition: openApiDocument,\n handlers: {\n validationFail: async (c, _req: Request, res: Response) =>\n res.status(400).json({ err: c.validation.errors }),\n notFound: async (_c, req: Request, res: Response) =>\n res.status(404).json({ err: `'${req.method} ${req.path}' not found` }),\n notImplemented: async (_c, req: Request, res: Response) =>\n res\n .status(500)\n .json({ err: `'${req.method} ${req.path}' not implemented` }),\n },\n });\n\n const templateRef = config.getOptionalString('bulkImport.importTemplate');\n let finalTemplateRef: string | undefined;\n if (templateRef) {\n finalTemplateRef = getImportTemplateRef(templateRef);\n }\n\n const orchestratorWorkflowId = config.getOptionalString(\n 'bulkImport.orchestratorWorkflow',\n );\n\n await api.init();\n\n api.register(\n Operations.PING,\n async (_c: Context, _req: Request, res: Response) => {\n const result = await ping(logger);\n return res.status(result.statusCode).json(result.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_ALL_SCM_HOSTS,\n async (_c: Context, _req: Request, res: Response) => {\n const result = await findAllSCMHosts(config);\n return res.status(result.statusCode).json(result.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_ALL_ORGANIZATIONS,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindAllOrganizations.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n const response = await findAllOrganizations(\n logger,\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n q.search,\n q.pagePerIntegration,\n q.sizePerIntegration,\n );\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n organizations: response.responseBody?.organizations,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: response.responseBody?.pagePerIntegration,\n sizePerIntegration: response.responseBody?.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.OrganizationList);\n },\n );\n\n api.register(\n Operations.FIND_ALL_REPOSITORIES,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindAllRepositories.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n q.checkImportStatus = stringToBoolean(q.checkImportStatus);\n\n const userTokens = res.locals.scmTokens as\n | Record<string, string>\n | undefined;\n\n if (!userTokens || Object.keys(userTokens).length === 0) {\n return res.status(401).json({\n error:\n 'User SCM credentials are required to list repositories. Ensure the SCM OAuth integration is configured.',\n });\n }\n\n const response = await findAllRepositories(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n },\n {\n search: q.search,\n checkStatus: q.checkImportStatus,\n pageNumber: q.pagePerIntegration,\n pageSize: q.sizePerIntegration,\n userTokens,\n },\n );\n const repos = response.responseBody?.repositories;\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n repositories: repos,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: q.pagePerIntegration,\n sizePerIntegration: q.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.RepositoryList);\n },\n );\n\n api.register(\n Operations.FIND_REPOSITORIES_BY_ORGANIZATION,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindRepositoriesByOrganization.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n q.checkImportStatus = stringToBoolean(q.checkImportStatus);\n\n const userTokens = res.locals.scmTokens as\n | Record<string, string>\n | undefined;\n\n if (!userTokens || Object.keys(userTokens).length === 0) {\n return res.status(401).json({\n error:\n 'User SCM credentials are required to list repositories. Ensure the SCM OAuth integration is configured.',\n });\n }\n\n const response = await findRepositoriesByOrganization(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n },\n c.request.params.organizationName?.toString(),\n q.search,\n q.checkImportStatus,\n q.pagePerIntegration,\n q.sizePerIntegration,\n userTokens,\n );\n const repos = response.responseBody?.repositories;\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n repositories: repos,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: q.pagePerIntegration,\n sizePerIntegration: q.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.RepositoryList);\n },\n );\n\n api.register(\n Operations.FIND_ALL_IMPORTS,\n async (c: Context, _req: Request, res: Response) => {\n const {\n pageNumber,\n pageSize,\n apiVersion,\n search,\n sortColumn,\n sortOrder,\n } = getFindImportsParams(c);\n const response = await findAllImports(\n {\n logger,\n config,\n githubApiService,\n gitlabApiService,\n catalogHttpClient,\n },\n {\n apiVersion,\n },\n {\n search,\n pageNumber,\n pageSize,\n sortColumn,\n sortOrder,\n },\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n api.register(\n Operations.FIND_ALL_TASK_IMPORTS,\n async (c: Context, _req: Request, res: Response) => {\n const { pageNumber, pageSize, search, sortColumn, sortOrder } =\n getFindImportsParams(c);\n const imports: SourceImport[] = [];\n const repositories = await repositoryDao.findRepositories(\n pageNumber,\n pageSize,\n search,\n );\n\n for (const repo of repositories.data) {\n const response = await findTaskImportStatusByRepo(\n {\n logger,\n config,\n githubApiService,\n gitlabApiService,\n catalogHttpClient,\n repositoryDao,\n taskDao,\n taskLocationsDao,\n discovery,\n auth,\n },\n repo.url,\n true,\n );\n if (response.responseBody) {\n imports.push(response.responseBody);\n }\n }\n\n sortImports(imports, sortColumn, sortOrder);\n\n const responseBody: Components.Schemas.ImportJobListV2 = {\n imports,\n totalCount: repositories.total,\n page: pageNumber || 1,\n size: pageSize || 5,\n };\n\n return res.status(200).json(responseBody);\n },\n );\n\n api.register(\n Operations.FIND_ALL_ORCHESTRATOR_WORKFLOW_IMPORTS,\n async (c: Context, req: Request, res: Response) => {\n const { pageNumber, pageSize, search, sortColumn, sortOrder } =\n getFindImportsParams(c);\n const imports: SourceImport[] = [];\n const repositories = await orchestratorRepositoryDao.findRepositories(\n pageNumber,\n pageSize,\n search,\n );\n\n const token = getBearerTokenFromReq(req);\n\n for (const repo of repositories.data) {\n const response = await findOrchestratorImportStatusByRepo(\n {\n logger,\n orchestratorRepositoryDao,\n orchestratorWorkflowDao,\n discovery,\n },\n repo.url,\n token,\n true,\n );\n if (response.responseBody) {\n imports.push(response.responseBody);\n }\n }\n\n sortImports(imports, sortColumn, sortOrder);\n\n const responseBody: Components.Schemas.ImportJobListV2 = {\n imports,\n totalCount: repositories.total,\n page: pageNumber || 1,\n size: pageSize || 5,\n };\n\n return res.status(200).json(responseBody);\n },\n );\n\n api.register(\n Operations.CREATE_IMPORT_JOBS,\n async (\n c: Context<Paths.CreateImportJobs.RequestBody>,\n _req: Request,\n res: Response,\n ) => {\n const q: Paths.CreateImportJobs.QueryParameters = {\n ...c.request.query,\n };\n q.dryRun = stringToBoolean(q.dryRun);\n const response = await createImportJobs(\n {\n logger,\n config,\n auth,\n catalogApi,\n gitlabApiService,\n githubApiService,\n catalogInfoGenerator,\n catalogHttpClient,\n },\n {\n importRequests: c.request.requestBody,\n dryRun: q.dryRun,\n },\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.CREATE_TASK_IMPORT_JOBS,\n async (\n c: Context<Paths.CreateImportJobs.RequestBody>,\n _req: Request,\n res: Response,\n ) => {\n if (!finalTemplateRef) {\n throw new Error(\n `Missing required config value: 'bulkImport.importTemplate'`,\n );\n }\n const response = await createTaskImportJobs(\n finalTemplateRef,\n discovery,\n logger,\n auth,\n config,\n repositoryDao,\n taskDao,\n taskLocationsDao,\n c.request.requestBody,\n githubApiService,\n );\n\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.CREATE_ORCHESTRATOR_WORKFLOW_JOBS,\n async (\n c: Context<Paths.CreateImportJobs.RequestBody>,\n req: Request,\n res: Response,\n ) => {\n if (!orchestratorWorkflowId) {\n throw new Error(\n `Missing required config value: 'bulkImport.orchestratorWorkflow'`,\n );\n }\n\n const token = getBearerTokenFromReq(req);\n\n const response = await createWorkflowImportJobs({\n orchestratorWorkflowId,\n discovery,\n token,\n requestBody: c.request.requestBody,\n orchestratorWorkflowDao,\n orchestratorRepositoryDao,\n githubApiService,\n gitlabApiService,\n });\n\n res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_TASK_IMPORT_STATUS_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindImportStatusByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank parameter');\n }\n const response = await findTaskImportStatusByRepo(\n {\n logger,\n config,\n githubApiService,\n gitlabApiService,\n catalogHttpClient,\n repositoryDao,\n taskDao,\n taskLocationsDao,\n discovery,\n auth,\n },\n q.repo,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_IMPORT_STATUS_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindImportStatusByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank parameter');\n }\n const response = await findImportStatusByRepo(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n approvalTool: q.approvalTool,\n },\n q.repo,\n q.defaultBranch,\n true,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_ORCHESTRATOR_IMPORT_STATUS_BY_REPO,\n async (c: Context, req: Request, res: Response) => {\n const q: Paths.FindImportStatusByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank parameter');\n }\n const token = getBearerTokenFromReq(req);\n const response = await findOrchestratorImportStatusByRepo(\n {\n logger,\n orchestratorRepositoryDao,\n orchestratorWorkflowDao,\n discovery,\n },\n q.repo,\n token,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.DELETE_TASK_IMPORT_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.DeleteImportByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank \"repo\" parameter');\n }\n const response = await deleteRepositoryRecord(\n {\n logger,\n dao: repositoryDao,\n },\n q.repo,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.DELETE_IMPORT_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.DeleteImportByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank \"repo\" parameter');\n }\n const response = await deleteImportByRepo(\n {\n logger,\n config,\n gitApiService:\n parseGitURLForApprovalTool(q.repo) === 'GITLAB'\n ? gitlabApiService\n : githubApiService,\n catalogHttpClient,\n },\n q.repo,\n q.defaultBranch,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.DELETE_ORCHESTRATOR_IMPORT_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.DeleteImportByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank \"repo\" parameter');\n }\n const response = await deleteRepositoryRecord(\n {\n logger,\n dao: orchestratorRepositoryDao,\n },\n q.repo,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n const router = Router();\n router.use(express.json());\n\n const permissionIntegrationRouter = createPermissionIntegrationRouter({\n permissions: [bulkImportPermission],\n });\n router.use(permissionIntegrationRouter);\n\n // Strip x-scm-tokens from req.headers before the permission check and audit\n // middleware run so that OAuth tokens are never captured in audit logs.\n // The parsed map is stored in res.locals.scmTokens for handler use.\n router.use((req, res, next) => {\n const raw = req.headers['x-scm-tokens'];\n const rawStr = Array.isArray(raw) ? raw[0] : raw;\n delete req.headers['x-scm-tokens'];\n if (rawStr) {\n try {\n res.locals.scmTokens = parseScmTokensHeader(rawStr, logger);\n } catch (e) {\n next(e);\n return;\n }\n }\n next();\n });\n\n router.use(async (req, _res, next) => {\n if (req.path !== '/ping') {\n try {\n await permissionCheck(\n auditor,\n api.matchOperation(req as OpenAPIRequest)?.operationId,\n permissions,\n httpAuth,\n req,\n );\n } catch (e) {\n next(e);\n return;\n }\n }\n next();\n });\n\n router.use(async (req, res, next) => {\n const reqCast = req as OpenAPIRequest;\n const operationId = api.matchOperation(reqCast)?.operationId;\n\n const auditorEvent = await createAuditorEventByOperationId(\n operationId,\n req,\n auditor,\n );\n try {\n const response = (await api.handleRequest(reqCast, req, res)) as Response;\n auditorEvent?.success({ meta: { responseStatus: response.statusCode } });\n next();\n } catch (err: any) {\n auditorEvent?.fail({ error: err, meta: { responseStatus: 500 } });\n next(err);\n }\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n router.use(middleware.error());\n\n return router;\n}\n\nasync function createAuditorEventByOperationId(\n operationId: string | undefined,\n req: Request,\n auditor: AuditorService,\n): Promise<AuditorServiceEvent | undefined> {\n let auditorEvent;\n switch (operationId) {\n case Operations.PING:\n auditorEvent = await auditCreateEvent(auditor, 'ping', req);\n break;\n case Operations.FIND_ALL_SCM_HOSTS:\n auditorEvent = await auditCreateEvent(auditor, 'scm-hosts-read', req);\n break;\n\n case Operations.FIND_ALL_ORGANIZATIONS:\n auditorEvent = await auditCreateEvent(auditor, 'org-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query?.search,\n });\n break;\n case Operations.FIND_ALL_REPOSITORIES:\n auditorEvent = await auditCreateEvent(auditor, 'repo-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query.search,\n });\n break;\n case Operations.FIND_REPOSITORIES_BY_ORGANIZATION: {\n const organizationName = req.params.organizationName?.toString();\n auditorEvent = await auditCreateEvent(auditor, 'repo-read', req, {\n queryType: 'by-org',\n organizationName,\n });\n break;\n }\n case Operations.FIND_ALL_IMPORTS:\n case Operations.FIND_ALL_TASK_IMPORTS:\n case Operations.FIND_ALL_ORCHESTRATOR_WORKFLOW_IMPORTS:\n auditorEvent = await auditCreateEvent(auditor, 'import-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query.search,\n });\n break;\n case Operations.CREATE_IMPORT_JOBS:\n case Operations.CREATE_TASK_IMPORT_JOBS:\n case Operations.CREATE_ORCHESTRATOR_WORKFLOW_JOBS:\n auditorEvent = await auditCreateEvent(auditor, 'import-write', req, {\n actionType: 'create',\n });\n break;\n case Operations.FIND_IMPORT_STATUS_BY_REPO:\n case Operations.FIND_TASK_IMPORT_STATUS_BY_REPO:\n case Operations.FIND_ORCHESTRATOR_IMPORT_STATUS_BY_REPO:\n auditorEvent = await auditCreateEvent(\n auditor,\n 'import-status-read',\n req,\n { queryType: 'by-query', repo: req.query.repo },\n );\n break;\n case Operations.DELETE_IMPORT_BY_REPO:\n case Operations.DELETE_TASK_IMPORT_BY_REPO:\n case Operations.DELETE_ORCHESTRATOR_IMPORT_BY_REPO:\n auditorEvent = await auditCreateEvent(auditor, 'import-write', req, {\n actionType: 'delete',\n repository: req.query.repo,\n });\n break;\n case undefined:\n auditorEvent = await auditCreateEvent(auditor, operationId, req);\n break;\n default:\n // do nothing\n break;\n }\n return auditorEvent;\n}\n\nfunction stringToNumber(s: number | undefined): number | undefined {\n return s ? Number.parseInt(s.toString(), 10) : undefined;\n}\n\nfunction stringToBoolean(s: boolean | undefined): boolean | undefined {\n if (!s) {\n return undefined;\n }\n return s.toString() === 'true';\n}\nfunction getFindImportsParams(c: Context<any, any, any, any, any, Document>): {\n pageNumber?: number;\n pageSize?: number;\n apiVersion?: Paths.FindAllImports.Parameters.ApiVersion;\n search?: string;\n sortColumn?: Components.Parameters.SortColumnQueryParam;\n sortOrder?: Components.Parameters.SortOrderQueryParam;\n} {\n const h: Paths.FindAllImports.HeaderParameters = {\n ...c.request.headers,\n };\n const apiVersion = h['api-version'];\n const q: Paths.FindAllImports.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n let pageNumber: number | undefined;\n let pageSize: number | undefined;\n if (apiVersion === undefined || apiVersion === 'v1') {\n // pagePerIntegration and sizePerIntegration deprecated in v1. 'page' and 'size' take precedence.\n pageNumber = stringToNumber(q.page || q.pagePerIntegration);\n pageSize = stringToNumber(q.size || q.sizePerIntegration);\n } else {\n // pagePerIntegration and sizePerIntegration removed in v2+ and replaced by 'page' and 'size'.\n pageNumber = stringToNumber(q.page);\n pageSize = stringToNumber(q.size);\n }\n return {\n pageNumber,\n pageSize,\n apiVersion: apiVersion,\n search: q.search,\n sortColumn: q.sortColumn,\n sortOrder: q.sortOrder,\n };\n}\n\nfunction getBearerTokenFromReq(req: express.Request): string {\n const header = req.header('authorization') ?? req.headers.authorization;\n if (header?.startsWith(`Bearer `)) {\n return header.replace('Bearer ', '');\n }\n throw new InputError(`Request provided without token`);\n}\n"],"names":["Operations","InputError","auth","migrate","repositoryDao","RepositoryDao","ScaffolderTaskDao","TaskLocationsDao","OrchestratorWorkflowDao","githubApiService","GithubApiService","gitlabApiService","GitlabApiService","catalogHttpClient","CatalogHttpClient","catalogInfoGenerator","CatalogInfoGenerator","OpenAPIBackend","fullFormats","openApiDocument","getImportTemplateRef","ping","findAllSCMHosts","findAllOrganizations","findAllRepositories","findRepositoriesByOrganization","findAllImports","findTaskImportStatusByRepo","sortImports","findOrchestratorImportStatusByRepo","createImportJobs","createTaskImportJobs","createWorkflowImportJobs","findImportStatusByRepo","deleteRepositoryRecord","deleteImportByRepo","parseGitURLForApprovalTool","Router","express","createPermissionIntegrationRouter","bulkImportPermission","permissionCheck","MiddlewareFactory","auditCreateEvent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoGA,IAAU,UAAA;AAAA,CAAV,CAAUA,WAAAA,KAAV;AACS,EAAMA,YAAA,IAAA,GAAO,MAAA;AACb,EAAMA,YAAA,kBAAA,GAAqB,iBAAA;AAC3B,EAAMA,YAAA,sBAAA,GAAyB,sBAAA;AAC/B,EAAMA,YAAA,qBAAA,GAAwB,qBAAA;AAE9B,EAAMA,YAAA,iCAAA,GACX,gCAAA;AAEK,EAAMA,YAAA,gBAAA,GAAmB,gBAAA;AACzB,EAAMA,YAAA,qBAAA,GAAwB,oBAAA;AAC9B,EAAMA,YAAA,sCAAA,GACX,oCAAA;AAEK,EAAMA,YAAA,kBAAA,GAAqB,kBAAA;AAC3B,EAAMA,YAAA,uBAAA,GAA0B,sBAAA;AAChC,EAAMA,YAAA,iCAAA,GACX,gCAAA;AAEK,EAAMA,YAAA,0BAAA,GAA6B,wBAAA;AACnC,EAAMA,YAAA,+BAAA,GAAkC,4BAAA;AACxC,EAAMA,YAAA,uCAAA,GACX,oCAAA;AAEK,EAAMA,YAAA,qBAAA,GAAwB,oBAAA;AAC9B,EAAMA,YAAA,0BAAA,GAA6B,wBAAA;AACnC,EAAMA,YAAA,kCAAA,GACX,gCAAA;AAAA,CAAA,EA3BM,UAAA,KAAA,UAAA,GAAA,EAAA,CAAA,CAAA;AA8BV,MAAM,oBAAA,GAAuB,IAAA;AAE7B,MAAM,kBAAkB,CAAC,CAAA,KACvB,OAAO,CAAA,KAAM,QAAA,IACb,MAAM,IAAA,IACN,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,GAAA,KAAO,OAAO,QAAQ,QAAA,IAAY,GAAA,CAAI,SAAS,CAAC,CAAA;AAEzE,SAAS,oBAAA,CACP,gBACA,MAAA,EACoC;AACpC,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,CAAC,gBAAgB,OAAO,MAAA;AAC5B,EAAA,IAAI,cAAA,CAAe,SAAS,oBAAA,EAAsB;AAChD,IAAA,MAAA,CAAO,KAAK,4DAA4D,CAAA;AACxE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,IAAA,CAAK,MAAM,cAAc,CAAA;AACjC,IAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AAAA,EACF,SAAS,CAAA,EAAG;AACV,IAAA,MAAM,IAAIC,iBAAA;AAAA,MACR,CAAA,6BAAA,EAAiC,EAAY,OAAO,CAAA;AAAA,KACtD;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAIA,iBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAMA,eAAsB,aACpB,OAAA,EACyB;AACzB,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,QAAA;AAAA,UACAC,MAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,IAAA,GAAO,MAAMC,iBAAA,CAAQ,QAAQ,CAAA;AACnC,EAAA,MAAMC,eAAA,GAAgB,IAAIC,2BAAA,CAAc,IAAA,EAAM,QAAQ,cAAc,CAAA;AACpE,EAAA,MAAM,OAAA,GAAU,IAAIC,+BAAA,CAAkB,IAAI,CAAA;AAC1C,EAAA,MAAM,gBAAA,GAAmB,IAAIC,8BAAA,CAAiB,IAAI,CAAA;AAClD,EAAA,MAAM,4BAA4B,IAAIF,2BAAA;AAAA,IACpC,IAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,uBAAA,GAA0B,IAAIG,qCAAA,CAAwB,IAAI,CAAA;AAGhE,EAAA,MAAMC,kBAAA,GAAmB,IAAIC,iCAAA,CAAiB,MAAA,EAAQ,QAAQ,KAAK,CAAA;AACnE,EAAA,MAAMC,kBAAA,GAAmB,IAAIC,iCAAA,CAAiB,MAAA,EAAQ,QAAQ,KAAK,CAAA;AACnE,EAAA,MAAMC,mBAAA,GAAoB,IAAIC,mCAAA,CAAkB;AAAA,IAC9C,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,UACAZ,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAMa,yBAAuB,IAAIC,yCAAA;AAAA,IAC/B,MAAA;AAAA,IACAH;AAAA,GACF;AAGA,EAAA,MAAM,GAAA,GAAM,IAAII,6BAAA,CAAe;AAAA,IAC7B,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAASC;AAAA;AAAA,KACX;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAYC,+BAAA;AAAA,IACZ,QAAA,EAAU;AAAA,MACR,cAAA,EAAgB,OAAO,CAAA,EAAG,IAAA,EAAe,QACvC,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,KAAK,EAAE,GAAA,EAAK,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAA;AAAA,MACnD,UAAU,OAAO,EAAA,EAAI,KAAc,GAAA,KACjC,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,GAAA,EAAK,IAAI,GAAA,CAAI,MAAM,IAAI,GAAA,CAAI,IAAI,eAAe,CAAA;AAAA,MACvE,gBAAgB,OAAO,EAAA,EAAI,KAAc,GAAA,KACvC,GAAA,CACG,OAAO,GAAG,CAAA,CACV,KAAK,EAAE,GAAA,EAAK,IAAI,GAAA,CAAI,MAAM,IAAI,GAAA,CAAI,IAAI,qBAAqB;AAAA;AAClE,GACD,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,iBAAA,CAAkB,2BAA2B,CAAA;AACxE,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,gBAAA,GAAmBC,2BAAqB,WAAW,CAAA;AAAA,EACrD;AAEA,EAAA,MAAM,yBAAyB,MAAA,CAAO,iBAAA;AAAA,IACpC;AAAA,GACF;AAEA,EAAA,MAAM,IAAI,IAAA,EAAK;AAEf,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,IAAA;AAAA,IACX,OAAO,EAAA,EAAa,IAAA,EAAe,GAAA,KAAkB;AACnD,MAAA,MAAM,MAAA,GAAS,MAAMC,SAAA,CAAK,MAAM,CAAA;AAChC,MAAA,OAAO,IAAI,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA,IAC/D;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,kBAAA;AAAA,IACX,OAAO,EAAA,EAAa,IAAA,EAAe,GAAA,KAAkB;AACnD,MAAA,MAAM,MAAA,GAAS,MAAMC,mBAAA,CAAgB,MAAM,CAAA;AAC3C,MAAA,OAAO,IAAI,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA,IAC/D;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,sBAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAAgD;AAAA,QACpD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AAEA,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,MAAM,WAAW,MAAMC,kCAAA;AAAA,QACrB,MAAA;AAAA,QACA,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAWZ,kBAAA,GAAmBF,kBAAA;AAAA,QACjD,CAAA,CAAE,MAAA;AAAA,QACF,CAAA,CAAE,kBAAA;AAAA,QACF,CAAA,CAAE;AAAA,OACJ;AACA,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,UAAU,EAAE,IAAA,CAAK;AAAA,QAC1C,MAAA,EAAQ,SAAS,YAAA,EAAc,MAAA;AAAA,QAC/B,aAAA,EAAe,SAAS,YAAA,EAAc,aAAA;AAAA,QACtC,UAAA,EAAY,SAAS,YAAA,EAAc,UAAA;AAAA,QACnC,kBAAA,EAAoB,SAAS,YAAA,EAAc,kBAAA;AAAA,QAC3C,kBAAA,EAAoB,SAAS,YAAA,EAAc,kBAAA;AAAA,QAC3C,cAAc,CAAA,CAAE;AAAA,OACsB,CAAA;AAAA,IAC1C;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,qBAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAA+C;AAAA,QACnD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AAEA,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,CAAA,CAAE,iBAAA,GAAoB,eAAA,CAAgB,CAAA,CAAE,iBAAiB,CAAA;AAEzD,MAAA,MAAM,UAAA,GAAa,IAAI,MAAA,CAAO,SAAA;AAI9B,MAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,WAAW,CAAA,EAAG;AACvD,QAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,UAC1B,KAAA,EACE;AAAA,SACH,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,WAAW,MAAMe,gCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAA,EACE,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAWb,kBAAA,GAAmBF,kBAAA;AAAA,6BACnDI;AAAA,SACF;AAAA,QACA;AAAA,UACE,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,aAAa,CAAA,CAAE,iBAAA;AAAA,UACf,YAAY,CAAA,CAAE,kBAAA;AAAA,UACd,UAAU,CAAA,CAAE,kBAAA;AAAA,UACZ;AAAA;AACF,OACF;AACA,MAAA,MAAM,KAAA,GAAQ,SAAS,YAAA,EAAc,YAAA;AACrC,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,UAAU,EAAE,IAAA,CAAK;AAAA,QAC1C,MAAA,EAAQ,SAAS,YAAA,EAAc,MAAA;AAAA,QAC/B,YAAA,EAAc,KAAA;AAAA,QACd,UAAA,EAAY,SAAS,YAAA,EAAc,UAAA;AAAA,QACnC,oBAAoB,CAAA,CAAE,kBAAA;AAAA,QACtB,oBAAoB,CAAA,CAAE,kBAAA;AAAA,QACtB,cAAc,CAAA,CAAE;AAAA,OACoB,CAAA;AAAA,IACxC;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,iCAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAA0D;AAAA,QAC9D,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AAEA,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,CAAA,CAAE,iBAAA,GAAoB,eAAA,CAAgB,CAAA,CAAE,iBAAiB,CAAA;AAEzD,MAAA,MAAM,UAAA,GAAa,IAAI,MAAA,CAAO,SAAA;AAI9B,MAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,WAAW,CAAA,EAAG;AACvD,QAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,UAC1B,KAAA,EACE;AAAA,SACH,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,WAAW,MAAMY,2CAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAA,EACE,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAWd,kBAAA,GAAmBF,kBAAA;AAAA,6BACnDI;AAAA,SACF;AAAA,QACA,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,gBAAA,EAAkB,QAAA,EAAS;AAAA,QAC5C,CAAA,CAAE,MAAA;AAAA,QACF,CAAA,CAAE,iBAAA;AAAA,QACF,CAAA,CAAE,kBAAA;AAAA,QACF,CAAA,CAAE,kBAAA;AAAA,QACF;AAAA,OACF;AACA,MAAA,MAAM,KAAA,GAAQ,SAAS,YAAA,EAAc,YAAA;AACrC,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,UAAU,EAAE,IAAA,CAAK;AAAA,QAC1C,MAAA,EAAQ,SAAS,YAAA,EAAc,MAAA;AAAA,QAC/B,YAAA,EAAc,KAAA;AAAA,QACd,UAAA,EAAY,SAAS,YAAA,EAAc,UAAA;AAAA,QACnC,oBAAoB,CAAA,CAAE,kBAAA;AAAA,QACtB,oBAAoB,CAAA,CAAE,kBAAA;AAAA,QACtB,cAAc,CAAA,CAAE;AAAA,OACoB,CAAA;AAAA,IACxC;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,gBAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM;AAAA,QACJ,UAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF,GAAI,qBAAqB,CAAC,CAAA;AAC1B,MAAA,MAAM,WAAW,MAAMa,0BAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,4BACAjB,kBAAA;AAAA,4BACAE,kBAAA;AAAA,6BACAE;AAAA,SACF;AAAA,QACA;AAAA,UACE;AAAA,SACF;AAAA,QACA;AAAA,UACE,MAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA;AACF,OACF;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AACA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,qBAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,EAAE,YAAY,QAAA,EAAU,MAAA,EAAQ,YAAY,SAAA,EAAU,GAC1D,qBAAqB,CAAC,CAAA;AACxB,MAAA,MAAM,UAA0B,EAAC;AACjC,MAAA,MAAM,YAAA,GAAe,MAAMT,eAAA,CAAc,gBAAA;AAAA,QACvC,UAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,KAAA,MAAW,IAAA,IAAQ,aAAa,IAAA,EAAM;AACpC,QAAA,MAAM,WAAW,MAAMuB,sCAAA;AAAA,UACrB;AAAA,YACE,MAAA;AAAA,YACA,MAAA;AAAA,8BACAlB,kBAAA;AAAA,8BACAE,kBAAA;AAAA,+BACAE,mBAAA;AAAA,2BACAT,eAAA;AAAA,YACA,OAAA;AAAA,YACA,gBAAA;AAAA,YACA,SAAA;AAAA,kBACAF;AAAA,WACF;AAAA,UACA,IAAA,CAAK,GAAA;AAAA,UACL;AAAA,SACF;AACA,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,QACpC;AAAA,MACF;AAEA,MAAA0B,uBAAA,CAAY,OAAA,EAAS,YAAY,SAAS,CAAA;AAE1C,MAAA,MAAM,YAAA,GAAmD;AAAA,QACvD,OAAA;AAAA,QACA,YAAY,YAAA,CAAa,KAAA;AAAA,QACzB,MAAM,UAAA,IAAc,CAAA;AAAA,QACpB,MAAM,QAAA,IAAY;AAAA,OACpB;AAEA,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,IAC1C;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,sCAAA;AAAA,IACX,OAAO,CAAA,EAAY,GAAA,EAAc,GAAA,KAAkB;AACjD,MAAA,MAAM,EAAE,YAAY,QAAA,EAAU,MAAA,EAAQ,YAAY,SAAA,EAAU,GAC1D,qBAAqB,CAAC,CAAA;AACxB,MAAA,MAAM,UAA0B,EAAC;AACjC,MAAA,MAAM,YAAA,GAAe,MAAM,yBAAA,CAA0B,gBAAA;AAAA,QACnD,UAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,KAAA,GAAQ,sBAAsB,GAAG,CAAA;AAEvC,MAAA,KAAA,MAAW,IAAA,IAAQ,aAAa,IAAA,EAAM;AACpC,QAAA,MAAM,WAAW,MAAMC,8CAAA;AAAA,UACrB;AAAA,YACE,MAAA;AAAA,YACA,yBAAA;AAAA,YACA,uBAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,IAAA,CAAK,GAAA;AAAA,UACL,KAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,QACpC;AAAA,MACF;AAEA,MAAAD,uBAAA,CAAY,OAAA,EAAS,YAAY,SAAS,CAAA;AAE1C,MAAA,MAAM,YAAA,GAAmD;AAAA,QACvD,OAAA;AAAA,QACA,YAAY,YAAA,CAAa,KAAA;AAAA,QACzB,MAAM,UAAA,IAAc,CAAA;AAAA,QACpB,MAAM,QAAA,IAAY;AAAA,OACpB;AAEA,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,IAC1C;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,kBAAA;AAAA,IACX,OACE,CAAA,EACA,IAAA,EACA,GAAA,KACG;AACH,MAAA,MAAM,CAAA,GAA4C;AAAA,QAChD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,CAAA,CAAE,MAAA,GAAS,eAAA,CAAgB,CAAA,CAAE,MAAM,CAAA;AACnC,MAAA,MAAM,WAAW,MAAME,4BAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,gBACA5B,MAAA;AAAA,UACA,UAAA;AAAA,4BACAS,kBAAA;AAAA,4BACAF,kBAAA;AAAA,gCACAM,sBAAA;AAAA,6BACAF;AAAA,SACF;AAAA,QACA;AAAA,UACE,cAAA,EAAgB,EAAE,OAAA,CAAQ,WAAA;AAAA,UAC1B,QAAQ,CAAA,CAAE;AAAA;AACZ,OACF;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,uBAAA;AAAA,IACX,OACE,CAAA,EACA,IAAA,EACA,GAAA,KACG;AACH,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,0DAAA;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,WAAW,MAAMkB,oCAAA;AAAA,QACrB,gBAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA7B,MAAA;AAAA,QACA,MAAA;AAAA,QACAE,eAAA;AAAA,QACA,OAAA;AAAA,QACA,gBAAA;AAAA,QACA,EAAE,OAAA,CAAQ,WAAA;AAAA,QACVK;AAAA,OACF;AAEA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,iCAAA;AAAA,IACX,OACE,CAAA,EACA,GAAA,EACA,GAAA,KACG;AACH,MAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,gEAAA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,sBAAsB,GAAG,CAAA;AAEvC,MAAA,MAAM,QAAA,GAAW,MAAMuB,oDAAA,CAAyB;AAAA,QAC9C,sBAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA,EAAa,EAAE,OAAA,CAAQ,WAAA;AAAA,QACvB,uBAAA;AAAA,QACA,yBAAA;AAAA,0BACAvB,kBAAA;AAAA,0BACAE;AAAA,OACD,CAAA;AAED,MAAA,GAAA,CAAI,OAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IAC5D;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,+BAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAAkD;AAAA,QACtD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,MAC9C;AACA,MAAA,MAAM,WAAW,MAAMgB,sCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,4BACAlB,kBAAA;AAAA,4BACAE,kBAAA;AAAA,6BACAE,mBAAA;AAAA,yBACAT,eAAA;AAAA,UACA,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,SAAA;AAAA,gBACAF;AAAA,SACF;AAAA,QACA,CAAA,CAAE;AAAA,OACJ;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,0BAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAAkD;AAAA,QACtD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,MAC9C;AACA,MAAA,MAAM,WAAW,MAAM+B,kCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAA,EACE,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAWtB,kBAAA,GAAmBF,kBAAA;AAAA,6BACnDI,mBAAA;AAAA,UACA,cAAc,CAAA,CAAE;AAAA,SAClB;AAAA,QACA,CAAA,CAAE,IAAA;AAAA,QACF,CAAA,CAAE,aAAA;AAAA,QACF;AAAA,OACF;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,uCAAA;AAAA,IACX,OAAO,CAAA,EAAY,GAAA,EAAc,GAAA,KAAkB;AACjD,MAAA,MAAM,CAAA,GAAkD;AAAA,QACtD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,MAC9C;AACA,MAAA,MAAM,KAAA,GAAQ,sBAAsB,GAAG,CAAA;AACvC,MAAA,MAAM,WAAW,MAAMgB,8CAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,yBAAA;AAAA,UACA,uBAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,CAAA,CAAE,IAAA;AAAA,QACF;AAAA,OACF;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,0BAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAA8C;AAAA,QAClD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrD;AACA,MAAA,MAAM,WAAW,MAAMK,kCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,GAAA,EAAK9B;AAAA,SACP;AAAA,QACA,CAAA,CAAE;AAAA,OACJ;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,qBAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAA8C;AAAA,QAClD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrD;AACA,MAAA,MAAM,WAAW,MAAM+B,8BAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,eACEC,gCAAA,CAA2B,CAAA,CAAE,IAAI,CAAA,KAAM,WACnCzB,kBAAA,GACAF,kBAAA;AAAA,6BACNI;AAAA,SACF;AAAA,QACA,CAAA,CAAE,IAAA;AAAA,QACF,CAAA,CAAE;AAAA,OACJ;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,kCAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAA8C;AAAA,QAClD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrD;AACA,MAAA,MAAM,WAAW,MAAMqB,kCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,GAAA,EAAK;AAAA,SACP;AAAA,QACA,CAAA,CAAE;AAAA,OACJ;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,MAAM,SAASG,cAAA,EAAO;AACtB,EAAA,MAAA,CAAO,GAAA,CAAIC,wBAAA,CAAQ,IAAA,EAAM,CAAA;AAEzB,EAAA,MAAM,8BAA8BC,sDAAA,CAAkC;AAAA,IACpE,WAAA,EAAa,CAACC,oDAAoB;AAAA,GACnC,CAAA;AACD,EAAA,MAAA,CAAO,IAAI,2BAA2B,CAAA;AAKtC,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,KAAS;AAC7B,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,cAAc,CAAA;AACtC,IAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AAC7C,IAAA,OAAO,GAAA,CAAI,QAAQ,cAAc,CAAA;AACjC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI;AACF,QAAA,GAAA,CAAI,MAAA,CAAO,SAAA,GAAY,oBAAA,CAAqB,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC5D,SAAS,CAAA,EAAG;AACV,QAAA,IAAA,CAAK,CAAC,CAAA;AACN,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,EAAK;AAAA,EACP,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,OAAO,GAAA,EAAK,IAAA,EAAM,IAAA,KAAS;AACpC,IAAA,IAAI,GAAA,CAAI,SAAS,OAAA,EAAS;AACxB,MAAA,IAAI;AACF,QAAA,MAAMC,oBAAA;AAAA,UACJ,OAAA;AAAA,UACA,GAAA,CAAI,cAAA,CAAe,GAAqB,CAAA,EAAG,WAAA;AAAA,UAC3C,WAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,IAAA,CAAK,CAAC,CAAA;AACN,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,EAAK;AAAA,EACP,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,OAAO,GAAA,EAAK,GAAA,EAAK,IAAA,KAAS;AACnC,IAAA,MAAM,OAAA,GAAU,GAAA;AAChB,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,cAAA,CAAe,OAAO,CAAA,EAAG,WAAA;AAEjD,IAAA,MAAM,eAAe,MAAM,+BAAA;AAAA,MACzB,WAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,WAAY,MAAM,GAAA,CAAI,aAAA,CAAc,OAAA,EAAS,KAAK,GAAG,CAAA;AAC3D,MAAA,YAAA,EAAc,OAAA,CAAQ,EAAE,IAAA,EAAM,EAAE,gBAAgB,QAAA,CAAS,UAAA,IAAc,CAAA;AACvE,MAAA,IAAA,EAAK;AAAA,IACP,SAAS,GAAA,EAAU;AACjB,MAAA,YAAA,EAAc,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,MAAM,EAAE,cAAA,EAAgB,GAAA,EAAI,EAAG,CAAA;AAChE,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,aAAaC,gCAAA,CAAkB,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAC9D,EAAA,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,CAAA;AAE7B,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,+BAAA,CACb,WAAA,EACA,GAAA,EACA,OAAA,EAC0C;AAC1C,EAAA,IAAI,YAAA;AACJ,EAAA,QAAQ,WAAA;AAAa,IACnB,KAAK,UAAA,CAAW,IAAA;AACd,MAAA,YAAA,GAAe,MAAMC,6BAAA,CAAiB,OAAA,EAAS,MAAA,EAAQ,GAAG,CAAA;AAC1D,MAAA;AAAA,IACF,KAAK,UAAA,CAAW,kBAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,gBAAA,EAAkB,GAAG,CAAA;AACpE,MAAA;AAAA,IAEF,KAAK,UAAA,CAAW,sBAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,UAAA,EAAY,GAAA,EAAK;AAAA,QAC9D,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,UAAA,GAAa,KAAA;AAAA,QAC3C,MAAA,EAAQ,IAAI,KAAA,EAAO;AAAA,OACpB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,UAAA,CAAW,qBAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,GAAA,EAAK;AAAA,QAC/D,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,UAAA,GAAa,KAAA;AAAA,QAC3C,MAAA,EAAQ,IAAI,KAAA,CAAM;AAAA,OACnB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,WAAW,iCAAA,EAAmC;AACjD,MAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,MAAA,CAAO,gBAAA,EAAkB,QAAA,EAAS;AAC/D,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,GAAA,EAAK;AAAA,QAC/D,SAAA,EAAW,QAAA;AAAA,QACX;AAAA,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,UAAA,CAAW,gBAAA;AAAA,IAChB,KAAK,UAAA,CAAW,qBAAA;AAAA,IAChB,KAAK,UAAA,CAAW,sCAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,aAAA,EAAe,GAAA,EAAK;AAAA,QACjE,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,UAAA,GAAa,KAAA;AAAA,QAC3C,MAAA,EAAQ,IAAI,KAAA,CAAM;AAAA,OACnB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,UAAA,CAAW,kBAAA;AAAA,IAChB,KAAK,UAAA,CAAW,uBAAA;AAAA,IAChB,KAAK,UAAA,CAAW,iCAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,cAAA,EAAgB,GAAA,EAAK;AAAA,QAClE,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA;AAAA,IACF,KAAK,UAAA,CAAW,0BAAA;AAAA,IAChB,KAAK,UAAA,CAAW,+BAAA;AAAA,IAChB,KAAK,UAAA,CAAW,uCAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA;AAAA,QACnB,OAAA;AAAA,QACA,oBAAA;AAAA,QACA,GAAA;AAAA,QACA,EAAE,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,GAAA,CAAI,MAAM,IAAA;AAAK,OAChD;AACA,MAAA;AAAA,IACF,KAAK,UAAA,CAAW,qBAAA;AAAA,IAChB,KAAK,UAAA,CAAW,0BAAA;AAAA,IAChB,KAAK,UAAA,CAAW,kCAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,cAAA,EAAgB,GAAA,EAAK;AAAA,QAClE,UAAA,EAAY,QAAA;AAAA,QACZ,UAAA,EAAY,IAAI,KAAA,CAAM;AAAA,OACvB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,GAAG,CAAA;AAC/D,MAAA;AAGA;AAEJ,EAAA,OAAO,YAAA;AACT;AAEA,SAAS,eAAe,CAAA,EAA2C;AACjE,EAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,EAAE,QAAA,EAAS,EAAG,EAAE,CAAA,GAAI,MAAA;AACjD;AAEA,SAAS,gBAAgB,CAAA,EAA6C;AACpE,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,CAAE,UAAS,KAAM,MAAA;AAC1B;AACA,SAAS,qBAAqB,CAAA,EAO5B;AACA,EAAA,MAAM,CAAA,GAA2C;AAAA,IAC/C,GAAG,EAAE,OAAA,CAAQ;AAAA,GACf;AACA,EAAA,MAAM,UAAA,GAAa,EAAE,aAAa,CAAA;AAClC,EAAA,MAAM,CAAA,GAA0C;AAAA,IAC9C,GAAG,EAAE,OAAA,CAAQ;AAAA,GACf;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,KAAe,IAAA,EAAM;AAEnD,IAAA,UAAA,GAAa,cAAA,CAAe,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,kBAAkB,CAAA;AAC1D,IAAA,QAAA,GAAW,cAAA,CAAe,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,kBAAkB,CAAA;AAAA,EAC1D,CAAA,MAAO;AAEL,IAAA,UAAA,GAAa,cAAA,CAAe,EAAE,IAAI,CAAA;AAClC,IAAA,QAAA,GAAW,cAAA,CAAe,EAAE,IAAI,CAAA;AAAA,EAClC;AACA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,YAAY,CAAA,CAAE,UAAA;AAAA,IACd,WAAW,CAAA,CAAE;AAAA,GACf;AACF;AAEA,SAAS,sBAAsB,GAAA,EAA8B;AAC3D,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA,CAAO,eAAe,CAAA,IAAK,IAAI,OAAA,CAAQ,aAAA;AAC1D,EAAA,IAAI,MAAA,EAAQ,UAAA,CAAW,CAAA,OAAA,CAAS,CAAA,EAAG;AACjC,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAAA,EACrC;AACA,EAAA,MAAM,IAAI1C,kBAAW,CAAA,8BAAA,CAAgC,CAAA;AACvD;;;;"}
|
|
1
|
+
{"version":3,"file":"router.cjs.js","sources":["../../src/service/router.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 { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport type {\n AuditorService,\n AuditorServiceEvent,\n AuthService,\n CacheService,\n DatabaseService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport { InputError } from '@backstage/errors';\nimport type { CatalogService } from '@backstage/plugin-catalog-node';\nimport type { PermissionEvaluator } from '@backstage/plugin-permission-common';\n\nimport { fullFormats } from 'ajv-formats/dist/formats';\nimport express, { Router, type Request, type Response } from 'express';\nimport {\n Document,\n OpenAPIBackend,\n type Context,\n type Request as OpenAPIRequest,\n} from 'openapi-backend';\n\nimport { CatalogHttpClient } from '../catalog/catalogHttpClient';\nimport { CatalogInfoGenerator } from '../catalog/catalogInfoGenerator';\nimport { migrate } from '../database/migration';\nimport {\n OrchestratorWorkflowDao,\n RepositoryDao,\n ScaffolderTaskDao,\n TaskLocationsDao,\n} from '../database/repositoryDao';\nimport type { Components, Paths, SourceImport } from '../generated/openapi.d';\nimport { openApiDocument } from '../generated/openapidocument';\nimport { GithubApiService } from '../github';\nimport { GitlabApiService } from '../gitlab';\nimport {\n getImportTemplateRef,\n parseGitURLForApprovalTool,\n permissionCheck,\n} from '../helpers';\nimport { auditCreateEvent } from '../helpers/auditorUtils';\nimport {\n createImportJobs,\n deleteImportByRepo,\n deleteRepositoryRecord,\n findAllImports,\n findImportStatusByRepo,\n findOrchestratorImportStatusByRepo,\n findTaskImportStatusByRepo,\n sortImports,\n} from './handlers/import';\nimport { createWorkflowImportJobs } from './handlers/import/execute-orchestrator-workflow';\nimport { createTaskImportJobs } from './handlers/import/execute-template';\nimport { findAllOrganizations } from './handlers/organization';\nimport { ping } from './handlers/ping';\nimport {\n findAllRepositories,\n findRepositoriesByOrganization,\n} from './handlers/repository';\nimport { findAllSCMHosts } from './handlers/scm/scm';\n\n/**\n * Router Options\n * @public\n */\nexport interface RouterOptions {\n logger: LoggerService;\n permissions: PermissionEvaluator;\n config: Config;\n cache: CacheService;\n discovery: DiscoveryService;\n httpAuth: HttpAuthService;\n auth: AuthService;\n catalog: CatalogService;\n auditor: AuditorService;\n database: DatabaseService;\n}\n\nnamespace Operations {\n export const PING = 'ping';\n export const FIND_ALL_SCM_HOSTS = 'findAllSCMHosts';\n export const FIND_ALL_ORGANIZATIONS = 'findAllOrganizations';\n export const FIND_ALL_REPOSITORIES = 'findAllRepositories';\n\n export const FIND_REPOSITORIES_BY_ORGANIZATION =\n 'findRepositoriesByOrganization';\n\n export const FIND_ALL_IMPORTS = 'findAllImports';\n export const FIND_ALL_TASK_IMPORTS = 'findAllTaskImports';\n export const FIND_ALL_ORCHESTRATOR_WORKFLOW_IMPORTS =\n 'findAllOrchestratorWorkflowImports';\n\n export const CREATE_IMPORT_JOBS = 'createImportJobs';\n export const CREATE_TASK_IMPORT_JOBS = 'createTaskImportJobs';\n export const CREATE_ORCHESTRATOR_WORKFLOW_JOBS =\n 'createOrchestratorWorkflowJobs';\n\n export const FIND_IMPORT_STATUS_BY_REPO = 'findImportStatusByRepo';\n export const FIND_TASK_IMPORT_STATUS_BY_REPO = 'findTaskImportStatusByRepo';\n export const FIND_ORCHESTRATOR_IMPORT_STATUS_BY_REPO =\n 'findOrchestratorImportStatusByRepo';\n\n export const DELETE_IMPORT_BY_REPO = 'deleteImportByRepo';\n export const DELETE_TASK_IMPORT_BY_REPO = 'deleteTaskImportByRepo';\n export const DELETE_ORCHESTRATOR_IMPORT_BY_REPO =\n 'deleteOrchestratorImportByRepo';\n}\n\nconst SCM_TOKENS_MAX_BYTES = 4096;\n\nconst isValidTokenMap = (v: unknown): v is Record<string, string> =>\n typeof v === 'object' &&\n v !== null &&\n Object.values(v).every(val => typeof val === 'string' && val.length > 0);\n\nfunction parseScmTokensHeader(\n rawTokenHeader: string | undefined,\n logger: LoggerService,\n): Record<string, string> | undefined {\n let token: Record<string, string> | undefined;\n if (!rawTokenHeader) return undefined;\n if (rawTokenHeader.length > SCM_TOKENS_MAX_BYTES) {\n logger.warn('x-scm-tokens header exceeds maximum allowed size; ignoring');\n return undefined;\n }\n try {\n token = JSON.parse(rawTokenHeader) as Record<string, string>;\n if (typeof token !== 'object' || token === null || Array.isArray(token)) {\n throw new Error('x-scm-tokens must be a JSON object');\n }\n } catch (e) {\n throw new InputError(\n `Invalid x-scm-tokens header: ${(e as Error).message}`,\n );\n }\n\n if (!isValidTokenMap(token)) {\n throw new InputError(\n 'Invalid x-scm-tokens header: all values must be non-empty strings',\n );\n }\n return token;\n}\n\n/**\n * Router\n * @public\n */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n logger,\n httpAuth,\n auth,\n permissions,\n config,\n cache,\n discovery,\n catalog,\n auditor,\n database,\n } = options;\n\n const knex = await migrate(database);\n const repositoryDao = new RepositoryDao(knex, logger, 'repositories');\n const taskDao = new ScaffolderTaskDao(knex);\n const taskLocationsDao = new TaskLocationsDao(knex);\n const orchestratorRepositoryDao = new RepositoryDao(\n knex,\n logger,\n 'orchestrator_repositories',\n );\n const orchestratorWorkflowDao = new OrchestratorWorkflowDao(knex);\n // GitHub and GitLab both implement the GitApiService interface; the router\n // selects the appropriate service per request based on approvalTool.\n const githubApiService = new GithubApiService(logger, config, cache);\n const gitlabApiService = new GitlabApiService(logger, config, cache);\n const catalogHttpClient = new CatalogHttpClient({\n logger,\n config,\n auth,\n catalog,\n });\n const catalogInfoGenerator = new CatalogInfoGenerator(\n logger,\n catalogHttpClient,\n );\n\n // create openapi requests handler\n const api = new OpenAPIBackend({\n ajvOpts: {\n verbose: true,\n formats: fullFormats, // open issue: https://github.com/openapistack/openapi-backend/issues/280\n },\n validate: true,\n definition: openApiDocument,\n handlers: {\n validationFail: async (c, _req: Request, res: Response) =>\n res.status(400).json({ err: c.validation.errors }),\n notFound: async (_c, req: Request, res: Response) =>\n res.status(404).json({ err: `'${req.method} ${req.path}' not found` }),\n notImplemented: async (_c, req: Request, res: Response) =>\n res\n .status(500)\n .json({ err: `'${req.method} ${req.path}' not implemented` }),\n },\n });\n\n const templateRef = config.getOptionalString('bulkImport.importTemplate');\n let finalTemplateRef: string | undefined;\n if (templateRef) {\n finalTemplateRef = getImportTemplateRef(templateRef);\n }\n\n const orchestratorWorkflowId = config.getOptionalString(\n 'bulkImport.orchestratorWorkflow',\n );\n\n await api.init();\n\n api.register(\n Operations.PING,\n async (_c: Context, _req: Request, res: Response) => {\n const result = await ping(logger);\n return res.status(result.statusCode).json(result.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_ALL_SCM_HOSTS,\n async (_c: Context, _req: Request, res: Response) => {\n const result = await findAllSCMHosts(config);\n return res.status(result.statusCode).json(result.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_ALL_ORGANIZATIONS,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindAllOrganizations.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n const response = await findAllOrganizations(\n logger,\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n q.search,\n q.pagePerIntegration,\n q.sizePerIntegration,\n );\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n organizations: response.responseBody?.organizations,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: response.responseBody?.pagePerIntegration,\n sizePerIntegration: response.responseBody?.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.OrganizationList);\n },\n );\n\n api.register(\n Operations.FIND_ALL_REPOSITORIES,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindAllRepositories.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n q.checkImportStatus = stringToBoolean(q.checkImportStatus);\n\n const userTokens = res.locals.scmTokens as\n Record<string, string> | undefined;\n\n if (!userTokens || Object.keys(userTokens).length === 0) {\n return res.status(401).json({\n error:\n 'User SCM credentials are required to list repositories. Ensure the SCM OAuth integration is configured.',\n });\n }\n\n const response = await findAllRepositories(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n },\n {\n search: q.search,\n checkStatus: q.checkImportStatus,\n pageNumber: q.pagePerIntegration,\n pageSize: q.sizePerIntegration,\n userTokens,\n },\n );\n const repos = response.responseBody?.repositories;\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n repositories: repos,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: q.pagePerIntegration,\n sizePerIntegration: q.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.RepositoryList);\n },\n );\n\n api.register(\n Operations.FIND_REPOSITORIES_BY_ORGANIZATION,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindRepositoriesByOrganization.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n q.checkImportStatus = stringToBoolean(q.checkImportStatus);\n\n const userTokens = res.locals.scmTokens as\n Record<string, string> | undefined;\n\n if (!userTokens || Object.keys(userTokens).length === 0) {\n return res.status(401).json({\n error:\n 'User SCM credentials are required to list repositories. Ensure the SCM OAuth integration is configured.',\n });\n }\n\n const response = await findRepositoriesByOrganization(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n },\n c.request.params.organizationName?.toString(),\n q.search,\n q.checkImportStatus,\n q.pagePerIntegration,\n q.sizePerIntegration,\n userTokens,\n );\n const repos = response.responseBody?.repositories;\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n repositories: repos,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: q.pagePerIntegration,\n sizePerIntegration: q.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.RepositoryList);\n },\n );\n\n api.register(\n Operations.FIND_ALL_IMPORTS,\n async (c: Context, _req: Request, res: Response) => {\n const {\n pageNumber,\n pageSize,\n apiVersion,\n search,\n sortColumn,\n sortOrder,\n } = getFindImportsParams(c);\n const response = await findAllImports(\n {\n logger,\n config,\n githubApiService,\n gitlabApiService,\n catalogHttpClient,\n },\n {\n apiVersion,\n },\n {\n search,\n pageNumber,\n pageSize,\n sortColumn,\n sortOrder,\n },\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n api.register(\n Operations.FIND_ALL_TASK_IMPORTS,\n async (c: Context, _req: Request, res: Response) => {\n const { pageNumber, pageSize, search, sortColumn, sortOrder } =\n getFindImportsParams(c);\n const imports: SourceImport[] = [];\n const repositories = await repositoryDao.findRepositories(\n pageNumber,\n pageSize,\n search,\n );\n\n for (const repo of repositories.data) {\n const response = await findTaskImportStatusByRepo(\n {\n logger,\n config,\n githubApiService,\n gitlabApiService,\n catalogHttpClient,\n repositoryDao,\n taskDao,\n taskLocationsDao,\n discovery,\n auth,\n },\n repo.url,\n true,\n );\n if (response.responseBody) {\n imports.push(response.responseBody);\n }\n }\n\n sortImports(imports, sortColumn, sortOrder);\n\n const responseBody: Components.Schemas.ImportJobListV2 = {\n imports,\n totalCount: repositories.total,\n page: pageNumber || 1,\n size: pageSize || 5,\n };\n\n return res.status(200).json(responseBody);\n },\n );\n\n api.register(\n Operations.FIND_ALL_ORCHESTRATOR_WORKFLOW_IMPORTS,\n async (c: Context, req: Request, res: Response) => {\n const { pageNumber, pageSize, search, sortColumn, sortOrder } =\n getFindImportsParams(c);\n const imports: SourceImport[] = [];\n const repositories = await orchestratorRepositoryDao.findRepositories(\n pageNumber,\n pageSize,\n search,\n );\n\n const token = getBearerTokenFromReq(req);\n\n for (const repo of repositories.data) {\n const response = await findOrchestratorImportStatusByRepo(\n {\n logger,\n orchestratorRepositoryDao,\n orchestratorWorkflowDao,\n discovery,\n },\n repo.url,\n token,\n true,\n );\n if (response.responseBody) {\n imports.push(response.responseBody);\n }\n }\n\n sortImports(imports, sortColumn, sortOrder);\n\n const responseBody: Components.Schemas.ImportJobListV2 = {\n imports,\n totalCount: repositories.total,\n page: pageNumber || 1,\n size: pageSize || 5,\n };\n\n return res.status(200).json(responseBody);\n },\n );\n\n api.register(\n Operations.CREATE_IMPORT_JOBS,\n async (\n c: Context<Paths.CreateImportJobs.RequestBody>,\n _req: Request,\n res: Response,\n ) => {\n const q: Paths.CreateImportJobs.QueryParameters = {\n ...c.request.query,\n };\n q.dryRun = stringToBoolean(q.dryRun);\n const response = await createImportJobs(\n {\n logger,\n config,\n auth,\n gitlabApiService,\n githubApiService,\n catalogInfoGenerator,\n catalogHttpClient,\n },\n {\n importRequests: c.request.requestBody,\n dryRun: q.dryRun,\n },\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.CREATE_TASK_IMPORT_JOBS,\n async (\n c: Context<Paths.CreateImportJobs.RequestBody>,\n _req: Request,\n res: Response,\n ) => {\n if (!finalTemplateRef) {\n throw new Error(\n `Missing required config value: 'bulkImport.importTemplate'`,\n );\n }\n const response = await createTaskImportJobs(\n finalTemplateRef,\n discovery,\n logger,\n auth,\n config,\n repositoryDao,\n taskDao,\n taskLocationsDao,\n c.request.requestBody,\n githubApiService,\n );\n\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.CREATE_ORCHESTRATOR_WORKFLOW_JOBS,\n async (\n c: Context<Paths.CreateImportJobs.RequestBody>,\n req: Request,\n res: Response,\n ) => {\n if (!orchestratorWorkflowId) {\n throw new Error(\n `Missing required config value: 'bulkImport.orchestratorWorkflow'`,\n );\n }\n\n const token = getBearerTokenFromReq(req);\n\n const response = await createWorkflowImportJobs({\n orchestratorWorkflowId,\n discovery,\n token,\n requestBody: c.request.requestBody,\n orchestratorWorkflowDao,\n orchestratorRepositoryDao,\n githubApiService,\n gitlabApiService,\n });\n\n res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_TASK_IMPORT_STATUS_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindImportStatusByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank parameter');\n }\n const response = await findTaskImportStatusByRepo(\n {\n logger,\n config,\n githubApiService,\n gitlabApiService,\n catalogHttpClient,\n repositoryDao,\n taskDao,\n taskLocationsDao,\n discovery,\n auth,\n },\n q.repo,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_IMPORT_STATUS_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindImportStatusByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank parameter');\n }\n const response = await findImportStatusByRepo(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n approvalTool: q.approvalTool,\n },\n q.repo,\n q.defaultBranch,\n true,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_ORCHESTRATOR_IMPORT_STATUS_BY_REPO,\n async (c: Context, req: Request, res: Response) => {\n const q: Paths.FindImportStatusByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank parameter');\n }\n const token = getBearerTokenFromReq(req);\n const response = await findOrchestratorImportStatusByRepo(\n {\n logger,\n orchestratorRepositoryDao,\n orchestratorWorkflowDao,\n discovery,\n },\n q.repo,\n token,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.DELETE_TASK_IMPORT_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.DeleteImportByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank \"repo\" parameter');\n }\n const response = await deleteRepositoryRecord(\n {\n logger,\n dao: repositoryDao,\n },\n q.repo,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.DELETE_IMPORT_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.DeleteImportByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank \"repo\" parameter');\n }\n const response = await deleteImportByRepo(\n {\n logger,\n config,\n gitApiService:\n parseGitURLForApprovalTool(q.repo) === 'GITLAB'\n ? gitlabApiService\n : githubApiService,\n catalogHttpClient,\n },\n q.repo,\n q.defaultBranch,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.DELETE_ORCHESTRATOR_IMPORT_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.DeleteImportByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank \"repo\" parameter');\n }\n const response = await deleteRepositoryRecord(\n {\n logger,\n dao: orchestratorRepositoryDao,\n },\n q.repo,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n const router = Router();\n router.use(express.json());\n\n // Strip x-scm-tokens from req.headers before the permission check and audit\n // middleware run so that OAuth tokens are never captured in audit logs.\n // The parsed map is stored in res.locals.scmTokens for handler use.\n router.use((req, res, next) => {\n const raw = req.headers['x-scm-tokens'];\n const rawStr = Array.isArray(raw) ? raw[0] : raw;\n delete req.headers['x-scm-tokens'];\n if (rawStr) {\n try {\n res.locals.scmTokens = parseScmTokensHeader(rawStr, logger);\n } catch (e) {\n next(e);\n return;\n }\n }\n next();\n });\n\n router.use(async (req, _res, next) => {\n if (req.path !== '/ping') {\n try {\n await permissionCheck(\n auditor,\n api.matchOperation(req as OpenAPIRequest)?.operationId,\n permissions,\n httpAuth,\n req,\n );\n } catch (e) {\n next(e);\n return;\n }\n }\n next();\n });\n\n router.use(async (req, res, next) => {\n const reqCast = req as OpenAPIRequest;\n const operationId = api.matchOperation(reqCast)?.operationId;\n\n const auditorEvent = await createAuditorEventByOperationId(\n operationId,\n req,\n auditor,\n );\n try {\n const response = (await api.handleRequest(reqCast, req, res)) as Response;\n auditorEvent?.success({ meta: { responseStatus: response.statusCode } });\n next();\n } catch (err: any) {\n auditorEvent?.fail({ error: err, meta: { responseStatus: 500 } });\n next(err);\n }\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n router.use(middleware.error());\n\n return router;\n}\n\nasync function createAuditorEventByOperationId(\n operationId: string | undefined,\n req: Request,\n auditor: AuditorService,\n): Promise<AuditorServiceEvent | undefined> {\n let auditorEvent;\n switch (operationId) {\n case Operations.PING:\n auditorEvent = await auditCreateEvent(auditor, 'ping', req);\n break;\n case Operations.FIND_ALL_SCM_HOSTS:\n auditorEvent = await auditCreateEvent(auditor, 'scm-hosts-read', req);\n break;\n\n case Operations.FIND_ALL_ORGANIZATIONS:\n auditorEvent = await auditCreateEvent(auditor, 'org-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query?.search,\n });\n break;\n case Operations.FIND_ALL_REPOSITORIES:\n auditorEvent = await auditCreateEvent(auditor, 'repo-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query.search,\n });\n break;\n case Operations.FIND_REPOSITORIES_BY_ORGANIZATION: {\n const organizationName = req.params.organizationName?.toString();\n auditorEvent = await auditCreateEvent(auditor, 'repo-read', req, {\n queryType: 'by-org',\n organizationName,\n });\n break;\n }\n case Operations.FIND_ALL_IMPORTS:\n case Operations.FIND_ALL_TASK_IMPORTS:\n case Operations.FIND_ALL_ORCHESTRATOR_WORKFLOW_IMPORTS:\n auditorEvent = await auditCreateEvent(auditor, 'import-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query.search,\n });\n break;\n case Operations.CREATE_IMPORT_JOBS:\n case Operations.CREATE_TASK_IMPORT_JOBS:\n case Operations.CREATE_ORCHESTRATOR_WORKFLOW_JOBS:\n auditorEvent = await auditCreateEvent(auditor, 'import-write', req, {\n actionType: 'create',\n });\n break;\n case Operations.FIND_IMPORT_STATUS_BY_REPO:\n case Operations.FIND_TASK_IMPORT_STATUS_BY_REPO:\n case Operations.FIND_ORCHESTRATOR_IMPORT_STATUS_BY_REPO:\n auditorEvent = await auditCreateEvent(\n auditor,\n 'import-status-read',\n req,\n { queryType: 'by-query', repo: req.query.repo },\n );\n break;\n case Operations.DELETE_IMPORT_BY_REPO:\n case Operations.DELETE_TASK_IMPORT_BY_REPO:\n case Operations.DELETE_ORCHESTRATOR_IMPORT_BY_REPO:\n auditorEvent = await auditCreateEvent(auditor, 'import-write', req, {\n actionType: 'delete',\n repository: req.query.repo,\n });\n break;\n case undefined:\n auditorEvent = await auditCreateEvent(auditor, operationId, req);\n break;\n default:\n // do nothing\n break;\n }\n return auditorEvent;\n}\n\nfunction stringToNumber(s: number | undefined): number | undefined {\n return s ? Number.parseInt(s.toString(), 10) : undefined;\n}\n\nfunction stringToBoolean(s: boolean | undefined): boolean | undefined {\n if (!s) {\n return undefined;\n }\n return s.toString() === 'true';\n}\nfunction getFindImportsParams(c: Context<any, any, any, any, any, Document>): {\n pageNumber?: number;\n pageSize?: number;\n apiVersion?: Paths.FindAllImports.Parameters.ApiVersion;\n search?: string;\n sortColumn?: Components.Parameters.SortColumnQueryParam;\n sortOrder?: Components.Parameters.SortOrderQueryParam;\n} {\n const h: Paths.FindAllImports.HeaderParameters = {\n ...c.request.headers,\n };\n const apiVersion = h['api-version'];\n const q: Paths.FindAllImports.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n let pageNumber: number | undefined;\n let pageSize: number | undefined;\n if (apiVersion === undefined || apiVersion === 'v1') {\n // pagePerIntegration and sizePerIntegration deprecated in v1. 'page' and 'size' take precedence.\n pageNumber = stringToNumber(q.page || q.pagePerIntegration);\n pageSize = stringToNumber(q.size || q.sizePerIntegration);\n } else {\n // pagePerIntegration and sizePerIntegration removed in v2+ and replaced by 'page' and 'size'.\n pageNumber = stringToNumber(q.page);\n pageSize = stringToNumber(q.size);\n }\n return {\n pageNumber,\n pageSize,\n apiVersion: apiVersion,\n search: q.search,\n sortColumn: q.sortColumn,\n sortOrder: q.sortOrder,\n };\n}\n\nfunction getBearerTokenFromReq(req: express.Request): string {\n const header = req.header('authorization') ?? req.headers.authorization;\n if (header?.startsWith(`Bearer `)) {\n return header.replace('Bearer ', '');\n }\n throw new InputError(`Request provided without token`);\n}\n"],"names":["Operations","InputError","auth","migrate","repositoryDao","RepositoryDao","ScaffolderTaskDao","TaskLocationsDao","OrchestratorWorkflowDao","githubApiService","GithubApiService","gitlabApiService","GitlabApiService","catalogHttpClient","CatalogHttpClient","catalogInfoGenerator","CatalogInfoGenerator","OpenAPIBackend","fullFormats","openApiDocument","getImportTemplateRef","ping","findAllSCMHosts","findAllOrganizations","findAllRepositories","findRepositoriesByOrganization","findAllImports","findTaskImportStatusByRepo","sortImports","findOrchestratorImportStatusByRepo","createImportJobs","createTaskImportJobs","createWorkflowImportJobs","findImportStatusByRepo","deleteRepositoryRecord","deleteImportByRepo","parseGitURLForApprovalTool","Router","express","permissionCheck","MiddlewareFactory","auditCreateEvent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiGA,IAAU,UAAA;AAAA,CAAV,CAAUA,WAAAA,KAAV;AACS,EAAMA,YAAA,IAAA,GAAO,MAAA;AACb,EAAMA,YAAA,kBAAA,GAAqB,iBAAA;AAC3B,EAAMA,YAAA,sBAAA,GAAyB,sBAAA;AAC/B,EAAMA,YAAA,qBAAA,GAAwB,qBAAA;AAE9B,EAAMA,YAAA,iCAAA,GACX,gCAAA;AAEK,EAAMA,YAAA,gBAAA,GAAmB,gBAAA;AACzB,EAAMA,YAAA,qBAAA,GAAwB,oBAAA;AAC9B,EAAMA,YAAA,sCAAA,GACX,oCAAA;AAEK,EAAMA,YAAA,kBAAA,GAAqB,kBAAA;AAC3B,EAAMA,YAAA,uBAAA,GAA0B,sBAAA;AAChC,EAAMA,YAAA,iCAAA,GACX,gCAAA;AAEK,EAAMA,YAAA,0BAAA,GAA6B,wBAAA;AACnC,EAAMA,YAAA,+BAAA,GAAkC,4BAAA;AACxC,EAAMA,YAAA,uCAAA,GACX,oCAAA;AAEK,EAAMA,YAAA,qBAAA,GAAwB,oBAAA;AAC9B,EAAMA,YAAA,0BAAA,GAA6B,wBAAA;AACnC,EAAMA,YAAA,kCAAA,GACX,gCAAA;AAAA,CAAA,EA3BM,UAAA,KAAA,UAAA,GAAA,EAAA,CAAA,CAAA;AA8BV,MAAM,oBAAA,GAAuB,IAAA;AAE7B,MAAM,kBAAkB,CAAC,CAAA,KACvB,OAAO,CAAA,KAAM,QAAA,IACb,MAAM,IAAA,IACN,MAAA,CAAO,OAAO,CAAC,CAAA,CAAE,MAAM,CAAA,GAAA,KAAO,OAAO,QAAQ,QAAA,IAAY,GAAA,CAAI,SAAS,CAAC,CAAA;AAEzE,SAAS,oBAAA,CACP,gBACA,MAAA,EACoC;AACpC,EAAA,IAAI,KAAA;AACJ,EAAA,IAAI,CAAC,gBAAgB,OAAO,MAAA;AAC5B,EAAA,IAAI,cAAA,CAAe,SAAS,oBAAA,EAAsB;AAChD,IAAA,MAAA,CAAO,KAAK,4DAA4D,CAAA;AACxE,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IAAI;AACF,IAAA,KAAA,GAAQ,IAAA,CAAK,MAAM,cAAc,CAAA;AACjC,IAAA,IAAI,OAAO,UAAU,QAAA,IAAY,KAAA,KAAU,QAAQ,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvE,MAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,IACtD;AAAA,EACF,SAAS,CAAA,EAAG;AACV,IAAA,MAAM,IAAIC,iBAAA;AAAA,MACR,CAAA,6BAAA,EAAiC,EAAY,OAAO,CAAA;AAAA,KACtD;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,eAAA,CAAgB,KAAK,CAAA,EAAG;AAC3B,IAAA,MAAM,IAAIA,iBAAA;AAAA,MACR;AAAA,KACF;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAMA,eAAsB,aACpB,OAAA,EACyB;AACzB,EAAA,MAAM;AAAA,IACJ,MAAA;AAAA,IACA,QAAA;AAAA,UACAC,MAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,IAAA,GAAO,MAAMC,iBAAA,CAAQ,QAAQ,CAAA;AACnC,EAAA,MAAMC,eAAA,GAAgB,IAAIC,2BAAA,CAAc,IAAA,EAAM,QAAQ,cAAc,CAAA;AACpE,EAAA,MAAM,OAAA,GAAU,IAAIC,+BAAA,CAAkB,IAAI,CAAA;AAC1C,EAAA,MAAM,gBAAA,GAAmB,IAAIC,8BAAA,CAAiB,IAAI,CAAA;AAClD,EAAA,MAAM,4BAA4B,IAAIF,2BAAA;AAAA,IACpC,IAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,MAAM,uBAAA,GAA0B,IAAIG,qCAAA,CAAwB,IAAI,CAAA;AAGhE,EAAA,MAAMC,kBAAA,GAAmB,IAAIC,iCAAA,CAAiB,MAAA,EAAQ,QAAQ,KAAK,CAAA;AACnE,EAAA,MAAMC,kBAAA,GAAmB,IAAIC,iCAAA,CAAiB,MAAA,EAAQ,QAAQ,KAAK,CAAA;AACnE,EAAA,MAAMC,mBAAA,GAAoB,IAAIC,mCAAA,CAAkB;AAAA,IAC9C,MAAA;AAAA,IACA,MAAA;AAAA,UACAZ,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAMa,yBAAuB,IAAIC,yCAAA;AAAA,IAC/B,MAAA;AAAA,IACAH;AAAA,GACF;AAGA,EAAA,MAAM,GAAA,GAAM,IAAII,6BAAA,CAAe;AAAA,IAC7B,OAAA,EAAS;AAAA,MACP,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAASC;AAAA;AAAA,KACX;AAAA,IACA,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAYC,+BAAA;AAAA,IACZ,QAAA,EAAU;AAAA,MACR,cAAA,EAAgB,OAAO,CAAA,EAAG,IAAA,EAAe,QACvC,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,KAAK,EAAE,GAAA,EAAK,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAA;AAAA,MACnD,UAAU,OAAO,EAAA,EAAI,KAAc,GAAA,KACjC,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,GAAA,EAAK,IAAI,GAAA,CAAI,MAAM,IAAI,GAAA,CAAI,IAAI,eAAe,CAAA;AAAA,MACvE,gBAAgB,OAAO,EAAA,EAAI,KAAc,GAAA,KACvC,GAAA,CACG,OAAO,GAAG,CAAA,CACV,KAAK,EAAE,GAAA,EAAK,IAAI,GAAA,CAAI,MAAM,IAAI,GAAA,CAAI,IAAI,qBAAqB;AAAA;AAClE,GACD,CAAA;AAED,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,iBAAA,CAAkB,2BAA2B,CAAA;AACxE,EAAA,IAAI,gBAAA;AACJ,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,gBAAA,GAAmBC,2BAAqB,WAAW,CAAA;AAAA,EACrD;AAEA,EAAA,MAAM,yBAAyB,MAAA,CAAO,iBAAA;AAAA,IACpC;AAAA,GACF;AAEA,EAAA,MAAM,IAAI,IAAA,EAAK;AAEf,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,IAAA;AAAA,IACX,OAAO,EAAA,EAAa,IAAA,EAAe,GAAA,KAAkB;AACnD,MAAA,MAAM,MAAA,GAAS,MAAMC,SAAA,CAAK,MAAM,CAAA;AAChC,MAAA,OAAO,IAAI,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA,IAC/D;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,kBAAA;AAAA,IACX,OAAO,EAAA,EAAa,IAAA,EAAe,GAAA,KAAkB;AACnD,MAAA,MAAM,MAAA,GAAS,MAAMC,mBAAA,CAAgB,MAAM,CAAA;AAC3C,MAAA,OAAO,IAAI,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAE,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA,IAC/D;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,sBAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAAgD;AAAA,QACpD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AAEA,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,MAAM,WAAW,MAAMC,kCAAA;AAAA,QACrB,MAAA;AAAA,QACA,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAWZ,kBAAA,GAAmBF,kBAAA;AAAA,QACjD,CAAA,CAAE,MAAA;AAAA,QACF,CAAA,CAAE,kBAAA;AAAA,QACF,CAAA,CAAE;AAAA,OACJ;AACA,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,UAAU,EAAE,IAAA,CAAK;AAAA,QAC1C,MAAA,EAAQ,SAAS,YAAA,EAAc,MAAA;AAAA,QAC/B,aAAA,EAAe,SAAS,YAAA,EAAc,aAAA;AAAA,QACtC,UAAA,EAAY,SAAS,YAAA,EAAc,UAAA;AAAA,QACnC,kBAAA,EAAoB,SAAS,YAAA,EAAc,kBAAA;AAAA,QAC3C,kBAAA,EAAoB,SAAS,YAAA,EAAc,kBAAA;AAAA,QAC3C,cAAc,CAAA,CAAE;AAAA,OACsB,CAAA;AAAA,IAC1C;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,qBAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAA+C;AAAA,QACnD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AAEA,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,CAAA,CAAE,iBAAA,GAAoB,eAAA,CAAgB,CAAA,CAAE,iBAAiB,CAAA;AAEzD,MAAA,MAAM,UAAA,GAAa,IAAI,MAAA,CAAO,SAAA;AAG9B,MAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,WAAW,CAAA,EAAG;AACvD,QAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,UAC1B,KAAA,EACE;AAAA,SACH,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,WAAW,MAAMe,gCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAA,EACE,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAWb,kBAAA,GAAmBF,kBAAA;AAAA,6BACnDI;AAAA,SACF;AAAA,QACA;AAAA,UACE,QAAQ,CAAA,CAAE,MAAA;AAAA,UACV,aAAa,CAAA,CAAE,iBAAA;AAAA,UACf,YAAY,CAAA,CAAE,kBAAA;AAAA,UACd,UAAU,CAAA,CAAE,kBAAA;AAAA,UACZ;AAAA;AACF,OACF;AACA,MAAA,MAAM,KAAA,GAAQ,SAAS,YAAA,EAAc,YAAA;AACrC,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,UAAU,EAAE,IAAA,CAAK;AAAA,QAC1C,MAAA,EAAQ,SAAS,YAAA,EAAc,MAAA;AAAA,QAC/B,YAAA,EAAc,KAAA;AAAA,QACd,UAAA,EAAY,SAAS,YAAA,EAAc,UAAA;AAAA,QACnC,oBAAoB,CAAA,CAAE,kBAAA;AAAA,QACtB,oBAAoB,CAAA,CAAE,kBAAA;AAAA,QACtB,cAAc,CAAA,CAAE;AAAA,OACoB,CAAA;AAAA,IACxC;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,iCAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAA0D;AAAA,QAC9D,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AAEA,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,CAAA,CAAE,kBAAA,GAAqB,cAAA,CAAe,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,CAAA,CAAE,iBAAA,GAAoB,eAAA,CAAgB,CAAA,CAAE,iBAAiB,CAAA;AAEzD,MAAA,MAAM,UAAA,GAAa,IAAI,MAAA,CAAO,SAAA;AAG9B,MAAA,IAAI,CAAC,UAAA,IAAc,MAAA,CAAO,KAAK,UAAU,CAAA,CAAE,WAAW,CAAA,EAAG;AACvD,QAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,UAC1B,KAAA,EACE;AAAA,SACH,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,WAAW,MAAMY,2CAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAA,EACE,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAWd,kBAAA,GAAmBF,kBAAA;AAAA,6BACnDI;AAAA,SACF;AAAA,QACA,CAAA,CAAE,OAAA,CAAQ,MAAA,CAAO,gBAAA,EAAkB,QAAA,EAAS;AAAA,QAC5C,CAAA,CAAE,MAAA;AAAA,QACF,CAAA,CAAE,iBAAA;AAAA,QACF,CAAA,CAAE,kBAAA;AAAA,QACF,CAAA,CAAE,kBAAA;AAAA,QACF;AAAA,OACF;AACA,MAAA,MAAM,KAAA,GAAQ,SAAS,YAAA,EAAc,YAAA;AACrC,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,QAAA,CAAS,UAAU,EAAE,IAAA,CAAK;AAAA,QAC1C,MAAA,EAAQ,SAAS,YAAA,EAAc,MAAA;AAAA,QAC/B,YAAA,EAAc,KAAA;AAAA,QACd,UAAA,EAAY,SAAS,YAAA,EAAc,UAAA;AAAA,QACnC,oBAAoB,CAAA,CAAE,kBAAA;AAAA,QACtB,oBAAoB,CAAA,CAAE,kBAAA;AAAA,QACtB,cAAc,CAAA,CAAE;AAAA,OACoB,CAAA;AAAA,IACxC;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,gBAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM;AAAA,QACJ,UAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF,GAAI,qBAAqB,CAAC,CAAA;AAC1B,MAAA,MAAM,WAAW,MAAMa,0BAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,4BACAjB,kBAAA;AAAA,4BACAE,kBAAA;AAAA,6BACAE;AAAA,SACF;AAAA,QACA;AAAA,UACE;AAAA,SACF;AAAA,QACA;AAAA,UACE,MAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA;AACF,OACF;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AACA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,qBAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,EAAE,YAAY,QAAA,EAAU,MAAA,EAAQ,YAAY,SAAA,EAAU,GAC1D,qBAAqB,CAAC,CAAA;AACxB,MAAA,MAAM,UAA0B,EAAC;AACjC,MAAA,MAAM,YAAA,GAAe,MAAMT,eAAA,CAAc,gBAAA;AAAA,QACvC,UAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,KAAA,MAAW,IAAA,IAAQ,aAAa,IAAA,EAAM;AACpC,QAAA,MAAM,WAAW,MAAMuB,sCAAA;AAAA,UACrB;AAAA,YACE,MAAA;AAAA,YACA,MAAA;AAAA,8BACAlB,kBAAA;AAAA,8BACAE,kBAAA;AAAA,+BACAE,mBAAA;AAAA,2BACAT,eAAA;AAAA,YACA,OAAA;AAAA,YACA,gBAAA;AAAA,YACA,SAAA;AAAA,kBACAF;AAAA,WACF;AAAA,UACA,IAAA,CAAK,GAAA;AAAA,UACL;AAAA,SACF;AACA,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,QACpC;AAAA,MACF;AAEA,MAAA0B,uBAAA,CAAY,OAAA,EAAS,YAAY,SAAS,CAAA;AAE1C,MAAA,MAAM,YAAA,GAAmD;AAAA,QACvD,OAAA;AAAA,QACA,YAAY,YAAA,CAAa,KAAA;AAAA,QACzB,MAAM,UAAA,IAAc,CAAA;AAAA,QACpB,MAAM,QAAA,IAAY;AAAA,OACpB;AAEA,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,IAC1C;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,sCAAA;AAAA,IACX,OAAO,CAAA,EAAY,GAAA,EAAc,GAAA,KAAkB;AACjD,MAAA,MAAM,EAAE,YAAY,QAAA,EAAU,MAAA,EAAQ,YAAY,SAAA,EAAU,GAC1D,qBAAqB,CAAC,CAAA;AACxB,MAAA,MAAM,UAA0B,EAAC;AACjC,MAAA,MAAM,YAAA,GAAe,MAAM,yBAAA,CAA0B,gBAAA;AAAA,QACnD,UAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAA,MAAM,KAAA,GAAQ,sBAAsB,GAAG,CAAA;AAEvC,MAAA,KAAA,MAAW,IAAA,IAAQ,aAAa,IAAA,EAAM;AACpC,QAAA,MAAM,WAAW,MAAMC,8CAAA;AAAA,UACrB;AAAA,YACE,MAAA;AAAA,YACA,yBAAA;AAAA,YACA,uBAAA;AAAA,YACA;AAAA,WACF;AAAA,UACA,IAAA,CAAK,GAAA;AAAA,UACL,KAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,IAAI,SAAS,YAAA,EAAc;AACzB,UAAA,OAAA,CAAQ,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,QACpC;AAAA,MACF;AAEA,MAAAD,uBAAA,CAAY,OAAA,EAAS,YAAY,SAAS,CAAA;AAE1C,MAAA,MAAM,YAAA,GAAmD;AAAA,QACvD,OAAA;AAAA,QACA,YAAY,YAAA,CAAa,KAAA;AAAA,QACzB,MAAM,UAAA,IAAc,CAAA;AAAA,QACpB,MAAM,QAAA,IAAY;AAAA,OACpB;AAEA,MAAA,OAAO,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA,IAC1C;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,kBAAA;AAAA,IACX,OACE,CAAA,EACA,IAAA,EACA,GAAA,KACG;AACH,MAAA,MAAM,CAAA,GAA4C;AAAA,QAChD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,CAAA,CAAE,MAAA,GAAS,eAAA,CAAgB,CAAA,CAAE,MAAM,CAAA;AACnC,MAAA,MAAM,WAAW,MAAME,4BAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,gBACA5B,MAAA;AAAA,4BACAS,kBAAA;AAAA,4BACAF,kBAAA;AAAA,gCACAM,sBAAA;AAAA,6BACAF;AAAA,SACF;AAAA,QACA;AAAA,UACE,cAAA,EAAgB,EAAE,OAAA,CAAQ,WAAA;AAAA,UAC1B,QAAQ,CAAA,CAAE;AAAA;AACZ,OACF;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,uBAAA;AAAA,IACX,OACE,CAAA,EACA,IAAA,EACA,GAAA,KACG;AACH,MAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,0DAAA;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,WAAW,MAAMkB,oCAAA;AAAA,QACrB,gBAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA7B,MAAA;AAAA,QACA,MAAA;AAAA,QACAE,eAAA;AAAA,QACA,OAAA;AAAA,QACA,gBAAA;AAAA,QACA,EAAE,OAAA,CAAQ,WAAA;AAAA,QACVK;AAAA,OACF;AAEA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,iCAAA;AAAA,IACX,OACE,CAAA,EACA,GAAA,EACA,GAAA,KACG;AACH,MAAA,IAAI,CAAC,sBAAA,EAAwB;AAC3B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,gEAAA;AAAA,SACF;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,sBAAsB,GAAG,CAAA;AAEvC,MAAA,MAAM,QAAA,GAAW,MAAMuB,oDAAA,CAAyB;AAAA,QAC9C,sBAAA;AAAA,QACA,SAAA;AAAA,QACA,KAAA;AAAA,QACA,WAAA,EAAa,EAAE,OAAA,CAAQ,WAAA;AAAA,QACvB,uBAAA;AAAA,QACA,yBAAA;AAAA,0BACAvB,kBAAA;AAAA,0BACAE;AAAA,OACD,CAAA;AAED,MAAA,GAAA,CAAI,OAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IAC5D;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,+BAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAAkD;AAAA,QACtD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,MAC9C;AACA,MAAA,MAAM,WAAW,MAAMgB,sCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,4BACAlB,kBAAA;AAAA,4BACAE,kBAAA;AAAA,6BACAE,mBAAA;AAAA,yBACAT,eAAA;AAAA,UACA,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,SAAA;AAAA,gBACAF;AAAA,SACF;AAAA,QACA,CAAA,CAAE;AAAA,OACJ;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,0BAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAAkD;AAAA,QACtD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,MAC9C;AACA,MAAA,MAAM,WAAW,MAAM+B,kCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,aAAA,EACE,CAAA,CAAE,YAAA,KAAiB,QAAA,GAAWtB,kBAAA,GAAmBF,kBAAA;AAAA,6BACnDI,mBAAA;AAAA,UACA,cAAc,CAAA,CAAE;AAAA,SAClB;AAAA,QACA,CAAA,CAAE,IAAA;AAAA,QACF,CAAA,CAAE,aAAA;AAAA,QACF;AAAA,OACF;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,uCAAA;AAAA,IACX,OAAO,CAAA,EAAY,GAAA,EAAc,GAAA,KAAkB;AACjD,MAAA,MAAM,CAAA,GAAkD;AAAA,QACtD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,4BAA4B,CAAA;AAAA,MAC9C;AACA,MAAA,MAAM,KAAA,GAAQ,sBAAsB,GAAG,CAAA;AACvC,MAAA,MAAM,WAAW,MAAMgB,8CAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,yBAAA;AAAA,UACA,uBAAA;AAAA,UACA;AAAA,SACF;AAAA,QACA,CAAA,CAAE,IAAA;AAAA,QACF;AAAA,OACF;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,0BAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAA8C;AAAA,QAClD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrD;AACA,MAAA,MAAM,WAAW,MAAMK,kCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,GAAA,EAAK9B;AAAA,SACP;AAAA,QACA,CAAA,CAAE;AAAA,OACJ;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,qBAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAA8C;AAAA,QAClD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrD;AACA,MAAA,MAAM,WAAW,MAAM+B,8BAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,eACEC,gCAAA,CAA2B,CAAA,CAAE,IAAI,CAAA,KAAM,WACnCzB,kBAAA,GACAF,kBAAA;AAAA,6BACNI;AAAA,SACF;AAAA,QACA,CAAA,CAAE,IAAA;AAAA,QACF,CAAA,CAAE;AAAA,OACJ;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,GAAA,CAAI,QAAA;AAAA,IACF,UAAA,CAAW,kCAAA;AAAA,IACX,OAAO,CAAA,EAAY,IAAA,EAAe,GAAA,KAAkB;AAClD,MAAA,MAAM,CAAA,GAA8C;AAAA,QAClD,GAAG,EAAE,OAAA,CAAQ;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAA,EAAM,IAAA,EAAK,EAAG;AACnB,QAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,MACrD;AACA,MAAA,MAAM,WAAW,MAAMqB,kCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,GAAA,EAAK;AAAA,SACP;AAAA,QACA,CAAA,CAAE;AAAA,OACJ;AACA,MAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,UAAU,CAAA,CAAE,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA,IACnE;AAAA,GACF;AAEA,EAAA,MAAM,SAASG,cAAA,EAAO;AACtB,EAAA,MAAA,CAAO,GAAA,CAAIC,wBAAA,CAAQ,IAAA,EAAM,CAAA;AAKzB,EAAA,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,EAAK,GAAA,EAAK,IAAA,KAAS;AAC7B,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,OAAA,CAAQ,cAAc,CAAA;AACtC,IAAA,MAAM,SAAS,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GAAI,GAAA,CAAI,CAAC,CAAA,GAAI,GAAA;AAC7C,IAAA,OAAO,GAAA,CAAI,QAAQ,cAAc,CAAA;AACjC,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI;AACF,QAAA,GAAA,CAAI,MAAA,CAAO,SAAA,GAAY,oBAAA,CAAqB,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC5D,SAAS,CAAA,EAAG;AACV,QAAA,IAAA,CAAK,CAAC,CAAA;AACN,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,EAAK;AAAA,EACP,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,OAAO,GAAA,EAAK,IAAA,EAAM,IAAA,KAAS;AACpC,IAAA,IAAI,GAAA,CAAI,SAAS,OAAA,EAAS;AACxB,MAAA,IAAI;AACF,QAAA,MAAMC,oBAAA;AAAA,UACJ,OAAA;AAAA,UACA,GAAA,CAAI,cAAA,CAAe,GAAqB,CAAA,EAAG,WAAA;AAAA,UAC3C,WAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF,SAAS,CAAA,EAAG;AACV,QAAA,IAAA,CAAK,CAAC,CAAA;AACN,QAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAA,EAAK;AAAA,EACP,CAAC,CAAA;AAED,EAAA,MAAA,CAAO,GAAA,CAAI,OAAO,GAAA,EAAK,GAAA,EAAK,IAAA,KAAS;AACnC,IAAA,MAAM,OAAA,GAAU,GAAA;AAChB,IAAA,MAAM,WAAA,GAAc,GAAA,CAAI,cAAA,CAAe,OAAO,CAAA,EAAG,WAAA;AAEjD,IAAA,MAAM,eAAe,MAAM,+BAAA;AAAA,MACzB,WAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAI;AACF,MAAA,MAAM,WAAY,MAAM,GAAA,CAAI,aAAA,CAAc,OAAA,EAAS,KAAK,GAAG,CAAA;AAC3D,MAAA,YAAA,EAAc,OAAA,CAAQ,EAAE,IAAA,EAAM,EAAE,gBAAgB,QAAA,CAAS,UAAA,IAAc,CAAA;AACvE,MAAA,IAAA,EAAK;AAAA,IACP,SAAS,GAAA,EAAU;AACjB,MAAA,YAAA,EAAc,IAAA,CAAK,EAAE,KAAA,EAAO,GAAA,EAAK,MAAM,EAAE,cAAA,EAAgB,GAAA,EAAI,EAAG,CAAA;AAChE,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA,IACV;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,aAAaC,gCAAA,CAAkB,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAC9D,EAAA,MAAA,CAAO,GAAA,CAAI,UAAA,CAAW,KAAA,EAAO,CAAA;AAE7B,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,+BAAA,CACb,WAAA,EACA,GAAA,EACA,OAAA,EAC0C;AAC1C,EAAA,IAAI,YAAA;AACJ,EAAA,QAAQ,WAAA;AAAa,IACnB,KAAK,UAAA,CAAW,IAAA;AACd,MAAA,YAAA,GAAe,MAAMC,6BAAA,CAAiB,OAAA,EAAS,MAAA,EAAQ,GAAG,CAAA;AAC1D,MAAA;AAAA,IACF,KAAK,UAAA,CAAW,kBAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,gBAAA,EAAkB,GAAG,CAAA;AACpE,MAAA;AAAA,IAEF,KAAK,UAAA,CAAW,sBAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,UAAA,EAAY,GAAA,EAAK;AAAA,QAC9D,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,UAAA,GAAa,KAAA;AAAA,QAC3C,MAAA,EAAQ,IAAI,KAAA,EAAO;AAAA,OACpB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,UAAA,CAAW,qBAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,GAAA,EAAK;AAAA,QAC/D,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,UAAA,GAAa,KAAA;AAAA,QAC3C,MAAA,EAAQ,IAAI,KAAA,CAAM;AAAA,OACnB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,WAAW,iCAAA,EAAmC;AACjD,MAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,MAAA,CAAO,gBAAA,EAAkB,QAAA,EAAS;AAC/D,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,GAAA,EAAK;AAAA,QAC/D,SAAA,EAAW,QAAA;AAAA,QACX;AAAA,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAAA,IACA,KAAK,UAAA,CAAW,gBAAA;AAAA,IAChB,KAAK,UAAA,CAAW,qBAAA;AAAA,IAChB,KAAK,UAAA,CAAW,sCAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,aAAA,EAAe,GAAA,EAAK;AAAA,QACjE,SAAA,EAAW,GAAA,CAAI,KAAA,CAAM,MAAA,GAAS,UAAA,GAAa,KAAA;AAAA,QAC3C,MAAA,EAAQ,IAAI,KAAA,CAAM;AAAA,OACnB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,UAAA,CAAW,kBAAA;AAAA,IAChB,KAAK,UAAA,CAAW,uBAAA;AAAA,IAChB,KAAK,UAAA,CAAW,iCAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,cAAA,EAAgB,GAAA,EAAK;AAAA,QAClE,UAAA,EAAY;AAAA,OACb,CAAA;AACD,MAAA;AAAA,IACF,KAAK,UAAA,CAAW,0BAAA;AAAA,IAChB,KAAK,UAAA,CAAW,+BAAA;AAAA,IAChB,KAAK,UAAA,CAAW,uCAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA;AAAA,QACnB,OAAA;AAAA,QACA,oBAAA;AAAA,QACA,GAAA;AAAA,QACA,EAAE,SAAA,EAAW,UAAA,EAAY,IAAA,EAAM,GAAA,CAAI,MAAM,IAAA;AAAK,OAChD;AACA,MAAA;AAAA,IACF,KAAK,UAAA,CAAW,qBAAA;AAAA,IAChB,KAAK,UAAA,CAAW,0BAAA;AAAA,IAChB,KAAK,UAAA,CAAW,kCAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,cAAA,EAAgB,GAAA,EAAK;AAAA,QAClE,UAAA,EAAY,QAAA;AAAA,QACZ,UAAA,EAAY,IAAI,KAAA,CAAM;AAAA,OACvB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,MAAA;AACH,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAA,EAAS,WAAA,EAAa,GAAG,CAAA;AAC/D,MAAA;AAGA;AAEJ,EAAA,OAAO,YAAA;AACT;AAEA,SAAS,eAAe,CAAA,EAA2C;AACjE,EAAA,OAAO,IAAI,MAAA,CAAO,QAAA,CAAS,EAAE,QAAA,EAAS,EAAG,EAAE,CAAA,GAAI,MAAA;AACjD;AAEA,SAAS,gBAAgB,CAAA,EAA6C;AACpE,EAAA,IAAI,CAAC,CAAA,EAAG;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,CAAA,CAAE,UAAS,KAAM,MAAA;AAC1B;AACA,SAAS,qBAAqB,CAAA,EAO5B;AACA,EAAA,MAAM,CAAA,GAA2C;AAAA,IAC/C,GAAG,EAAE,OAAA,CAAQ;AAAA,GACf;AACA,EAAA,MAAM,UAAA,GAAa,EAAE,aAAa,CAAA;AAClC,EAAA,MAAM,CAAA,GAA0C;AAAA,IAC9C,GAAG,EAAE,OAAA,CAAQ;AAAA,GACf;AAEA,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,UAAA,KAAe,MAAA,IAAa,UAAA,KAAe,IAAA,EAAM;AAEnD,IAAA,UAAA,GAAa,cAAA,CAAe,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,kBAAkB,CAAA;AAC1D,IAAA,QAAA,GAAW,cAAA,CAAe,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAE,kBAAkB,CAAA;AAAA,EAC1D,CAAA,MAAO;AAEL,IAAA,UAAA,GAAa,cAAA,CAAe,EAAE,IAAI,CAAA;AAClC,IAAA,QAAA,GAAW,cAAA,CAAe,EAAE,IAAI,CAAA;AAAA,EAClC;AACA,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAQ,CAAA,CAAE,MAAA;AAAA,IACV,YAAY,CAAA,CAAE,UAAA;AAAA,IACd,WAAW,CAAA,CAAE;AAAA,GACf;AACF;AAEA,SAAS,sBAAsB,GAAA,EAA8B;AAC3D,EAAA,MAAM,SAAS,GAAA,CAAI,MAAA,CAAO,eAAe,CAAA,IAAK,IAAI,OAAA,CAAQ,aAAA;AAC1D,EAAA,IAAI,MAAA,EAAQ,UAAA,CAAW,CAAA,OAAA,CAAS,CAAA,EAAG;AACjC,IAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,EAAE,CAAA;AAAA,EACrC;AACA,EAAA,MAAM,IAAIxC,kBAAW,CAAA,8BAAA,CAAgC,CAAA;AACvD;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@red-hat-developer-hub/backstage-plugin-bulk-import-backend",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "8.0.1",
|
|
4
4
|
"main": "./dist/index.cjs.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -50,60 +50,57 @@
|
|
|
50
50
|
"openapi": "./scripts/openapi.sh"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@backstage/backend-defaults": "
|
|
54
|
-
"@backstage/backend-plugin-api": "^1.
|
|
55
|
-
"@backstage/catalog-model": "^1.
|
|
56
|
-
"@backstage/config": "^1.3.
|
|
57
|
-
"@backstage/errors": "^1.
|
|
58
|
-
"@backstage/integration": "^2.0.
|
|
59
|
-
"@backstage/plugin-catalog-node": "^2.
|
|
60
|
-
"@backstage/plugin-permission-common": "^0.9.
|
|
61
|
-
"@backstage/plugin-permission-node": "^0.10.11",
|
|
53
|
+
"@backstage/backend-defaults": "0.17.3",
|
|
54
|
+
"@backstage/backend-plugin-api": "^1.9.2",
|
|
55
|
+
"@backstage/catalog-model": "^1.9.0",
|
|
56
|
+
"@backstage/config": "^1.3.8",
|
|
57
|
+
"@backstage/errors": "^1.3.1",
|
|
58
|
+
"@backstage/integration": "^2.0.3",
|
|
59
|
+
"@backstage/plugin-catalog-node": "^2.2.2",
|
|
60
|
+
"@backstage/plugin-permission-common": "^0.9.9",
|
|
62
61
|
"@gitbeaker/rest": "^43.4.0",
|
|
63
62
|
"@octokit/auth-app": "^7.2.2",
|
|
64
63
|
"@octokit/rest": "^20.0.2",
|
|
65
|
-
"@red-hat-developer-hub/backstage-plugin-bulk-import-common": "^
|
|
66
|
-
"@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^3.
|
|
64
|
+
"@red-hat-developer-hub/backstage-plugin-bulk-import-common": "^8.0.1",
|
|
65
|
+
"@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^3.7.3",
|
|
67
66
|
"ajv-formats": "^3.0.1",
|
|
68
67
|
"eventsource-client": "^1.2.0",
|
|
69
68
|
"express": "^4.17.1",
|
|
70
69
|
"git-url-parse": "^14.0.0",
|
|
71
|
-
"js-yaml": "^4.
|
|
70
|
+
"js-yaml": "^4.3.0",
|
|
72
71
|
"just-kebab-case": "4.2.0",
|
|
73
72
|
"knex": "^3.0.0",
|
|
74
73
|
"luxon": "^3.4.4",
|
|
75
|
-
"node-fetch": "^2.6.7",
|
|
76
74
|
"openapi-backend": "^5.10.6"
|
|
77
75
|
},
|
|
78
76
|
"devDependencies": {
|
|
79
|
-
"@backstage/backend-test-utils": "^1.11.
|
|
80
|
-
"@backstage/catalog-client": "^1.
|
|
81
|
-
"@backstage/cli": "^0.36.
|
|
82
|
-
"@backstage/config": "^1.3.
|
|
83
|
-
"@backstage/plugin-catalog-backend": "^3.
|
|
77
|
+
"@backstage/backend-test-utils": "^1.11.4",
|
|
78
|
+
"@backstage/catalog-client": "^1.16.0",
|
|
79
|
+
"@backstage/cli": "^0.36.3",
|
|
80
|
+
"@backstage/config": "^1.3.8",
|
|
81
|
+
"@backstage/plugin-catalog-backend": "^3.8.0",
|
|
84
82
|
"@backstage/types": "^1.2.2",
|
|
85
|
-
"@openapitools/openapi-generator-cli": "2.
|
|
83
|
+
"@openapitools/openapi-generator-cli": "2.40.1",
|
|
86
84
|
"@spotify/prettier-config": "^15.0.0",
|
|
87
85
|
"@types/express": "4.17.25",
|
|
88
86
|
"@types/git-url-parse": "^9.0.0",
|
|
89
87
|
"@types/knex": "^0.16.1",
|
|
90
|
-
"@types/node-fetch": "^2.5.12",
|
|
91
88
|
"@types/supertest": "2.0.16",
|
|
92
89
|
"js-yaml-cli": "0.6.0",
|
|
93
90
|
"msw": "1.3.5",
|
|
94
91
|
"openapicmd": "2.9.2",
|
|
95
|
-
"prettier": "3.
|
|
92
|
+
"prettier": "3.9.6",
|
|
96
93
|
"supertest": "6.3.4"
|
|
97
94
|
},
|
|
98
95
|
"files": [
|
|
99
96
|
"dist",
|
|
100
97
|
"migrations",
|
|
101
|
-
"config.
|
|
98
|
+
"config.schema.json",
|
|
102
99
|
"dist-dynamic/*.*",
|
|
103
100
|
"dist-dynamic/dist/**",
|
|
104
101
|
"app-config.yaml"
|
|
105
102
|
],
|
|
106
|
-
"configSchema": "config.
|
|
103
|
+
"configSchema": "config.schema.json",
|
|
107
104
|
"repository": {
|
|
108
105
|
"type": "git",
|
|
109
106
|
"url": "https://github.com/redhat-developer/rhdh-plugins",
|
package/config.d.ts
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright Red Hat, Inc.
|
|
3
|
-
*
|
|
4
|
-
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
-
* you may not use this file except in compliance with the License.
|
|
6
|
-
* You may obtain a copy of the License at
|
|
7
|
-
*
|
|
8
|
-
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
-
*
|
|
10
|
-
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
-
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
-
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
-
* See the License for the specific language governing permissions and
|
|
14
|
-
* limitations under the License.
|
|
15
|
-
*/
|
|
16
|
-
|
|
17
|
-
export interface Config {
|
|
18
|
-
bulkImport?: {
|
|
19
|
-
/**
|
|
20
|
-
* The name of the scaffolder template or entity reference to execute for importing a repository.
|
|
21
|
-
* @visibility backend
|
|
22
|
-
*/
|
|
23
|
-
importTemplate?: string;
|
|
24
|
-
/**
|
|
25
|
-
* The orchestrator workflow id to execute for importing a repository.
|
|
26
|
-
* @visibility backend
|
|
27
|
-
*/
|
|
28
|
-
orchestratorWorkflow?: string;
|
|
29
|
-
};
|
|
30
|
-
}
|