@hapic/harbor
Version:
A harbor http api client.
1 lines • 47.7 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","names":["isClient","createClient","BaseClient"],"sources":["../src/constants.ts","../src/utils/connection-string.ts","../src/utils/query-string.ts","../src/utils/resource-id.ts","../src/utils/resource-meta.ts","../src/domains/base.ts","../src/domains/project/module.ts","../src/domains/project-repository/utils.ts","../src/domains/project-repository/module.ts","../src/domains/project-repository-artifact/module.ts","../src/domains/project-repository-artifact-label/module.ts","../src/domains/project-webhook-policy/module.ts","../src/domains/robot/constants.ts","../src/domains/robot/module.ts","../src/domains/robot/utils.ts","../src/module.ts","../src/instance.ts","../src/index.ts"],"sourcesContent":["/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum HeaderName {\n LOCATION = 'location',\n IS_RESOURCE_NAME = 'X-Is-Resource-Name',\n TOTAL_COUNT = 'X-Total-Count',\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { splitConnectionString } from 'hapic';\nimport type { ConnectionOptions } from '../config';\nimport { ConnectionStringParseError } from '../error';\n\nconst FORMAT_HINT = 'Harbor connection string must be in the following format: user:password@host';\n\nexport function parseConnectionString(connectionString: string): ConnectionOptions {\n const { credentials, host } = splitConnectionString(connectionString, { message: FORMAT_HINT });\n\n const authParts = credentials.split(':');\n if (authParts.length !== 2) {\n throw new ConnectionStringParseError(FORMAT_HINT);\n }\n\n return {\n host,\n user: authParts[0],\n password: authParts[1],\n };\n}\n","/*\n * Copyright (c) 2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { isObject } from 'smob';\n\nexport function buildQueryString(\n input?: Record<string, any>,\n withQuestionMark = true,\n) {\n if (typeof input === 'undefined') {\n return '';\n }\n\n const searchParams = new URLSearchParams();\n\n const keys = Object.keys(input);\n for (const key of keys) {\n const value = input[key];\n if (isObject(value)) {\n const childKeys = Object.keys(value);\n if (childKeys.length > 0) {\n const childSearchParams = new URLSearchParams();\n for (const childKey of childKeys) {\n childSearchParams.append(\n childKey,\n `${encodeURIComponent(value[childKey])}`,\n );\n }\n\n searchParams.append(key, childSearchParams.toString());\n }\n } else if (Array.isArray(value)) {\n searchParams.append(key, `${value.join(',')}`);\n } else {\n searchParams.append(key, `${value}`);\n }\n }\n\n const queryString = searchParams.toString();\n if (queryString.length > 0 && withQuestionMark) {\n return `?${queryString}`;\n }\n\n return '';\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Response } from 'hapic';\nimport { HeaderName } from '../constants';\n\nexport function extractResourceIDOfResponse(response: Pick<Response, 'headers'>) {\n if (\n response &&\n response.headers &&\n response.headers.has(HeaderName.LOCATION)\n ) {\n const value = response.headers.get(HeaderName.LOCATION);\n if (value) {\n const id = Number.parseInt(value.substring(value.lastIndexOf('/') + 1), 10);\n if (!Number.isNaN(id)) {\n return id;\n }\n }\n }\n\n return undefined;\n}\n","/*\n * Copyright (c) 2023-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Response } from 'hapic';\nimport { HeaderName } from '../constants';\n\ntype Meta = {\n total?: number\n};\nexport function extractResourceMetaOfResponse(response: Response) : Meta {\n const meta : Meta = {};\n\n if (\n response.headers &&\n response.headers.has(HeaderName.TOTAL_COUNT)\n ) {\n const total = Number.parseInt(response.headers.get(HeaderName.TOTAL_COUNT) || '0', 10);\n if (!Number.isNaN(total)) {\n meta.total = total;\n }\n }\n\n return meta;\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createClient, isClient } from 'hapic';\nimport type { IClient, RequestBaseOptions } from 'hapic';\nimport type { BaseAPIContext } from './type';\n\nexport abstract class BaseAPI {\n protected client!: IClient;\n\n // -----------------------------------------------------------------------------------\n\n protected constructor(context?: BaseAPIContext) {\n context = context || {};\n\n this.setClient(context.client);\n }\n\n // -----------------------------------------------------------------------------------\n\n setClient(input?: IClient | RequestBaseOptions) {\n if (isClient(input)) {\n this.client = input;\n } else {\n this.client = createClient(input);\n }\n }\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { HeaderName } from '../../constants';\nimport {\n buildQueryString,\n extractResourceIDOfResponse,\n extractResourceMetaOfResponse,\n} from '../../utils';\nimport { BaseAPI } from '../base';\nimport type { BaseAPIContext, ResourceCollectionResponse } from '../type';\nimport type {\n Project,\n ProjectCreatePayload,\n ProjectCreateResponse,\n ProjectGetManyOptions,\n ProjectUpdatePayload,\n} from './type';\n\nexport class ProjectAPI extends BaseAPI {\n constructor(context: BaseAPIContext) {\n super(context);\n }\n\n async create(data: ProjectCreatePayload) : Promise<ProjectCreateResponse> {\n const response = await this.client\n .post('projects', data);\n\n return { id: extractResourceIDOfResponse(response) };\n }\n\n async delete(\n id: string | number,\n isProjectName = false,\n ) : Promise<void> {\n const headers: Record<string, any> = {};\n\n if (isProjectName) {\n headers[HeaderName.IS_RESOURCE_NAME] = true;\n }\n\n await this.client\n .delete(`projects/${id}`, { headers });\n }\n\n async update(\n id: number | string,\n data: ProjectUpdatePayload,\n isProjectName = false,\n ) : Promise<void> {\n const headers: Record<string, any> = {};\n\n if (isProjectName) {\n headers[HeaderName.IS_RESOURCE_NAME] = true;\n }\n\n await this.client\n .put(`projects/${id}`, data, { headers });\n }\n\n async getMany(options?: ProjectGetManyOptions) : Promise<ResourceCollectionResponse<Project>> {\n options = options || {};\n const response = await this.client\n .get(`projects${buildQueryString(options.query)}`);\n\n return {\n data: response.data,\n meta: extractResourceMetaOfResponse(response),\n };\n }\n\n async getAll(options?: ProjectGetManyOptions) : Promise<ResourceCollectionResponse<Project>> {\n options = options || {};\n options.query = options.query || {};\n\n if (!options.query.page_size) {\n options.query.page_size = 50;\n }\n\n if (!options.query.page) {\n options.query.page = 1;\n }\n\n const response = await this.getMany(options);\n if (response.data.length === options.query.page_size) {\n options.query.page++;\n\n const next = await this.getAll(options);\n\n response.data.push(...next.data);\n }\n\n return response;\n }\n\n async getOne(\n id: string | number,\n isProjectName = false,\n ): Promise<Project> {\n const headers: Record<string, any> = {};\n\n if (isProjectName) {\n headers[HeaderName.IS_RESOURCE_NAME] = true;\n }\n\n const { data } = await this.client\n .get(`projects/${id}`, { headers });\n\n return data;\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { ProjectRepositoryLongNameRepresentation } from './type';\n\nexport function parseLongProjectRepositoryName(name: string) : ProjectRepositoryLongNameRepresentation {\n const index = name.indexOf('/');\n if (index === -1) {\n throw new Error('The project repository name could not parsed.');\n }\n\n const projectName = name.substring(0, index);\n let repositoryName = name.substring(projectName.length + 1);\n\n let artifactDigest : string | undefined;\n if (repositoryName.includes('@')) {\n const index = repositoryName.indexOf('@');\n artifactDigest = repositoryName.substring(index + 1);\n repositoryName = repositoryName.substring(0, index);\n }\n\n let artifactTag : string | undefined;\n if (repositoryName.includes(':')) {\n const index = repositoryName.indexOf(':');\n artifactTag = repositoryName.substring(index + 1);\n repositoryName = repositoryName.substring(0, index);\n }\n\n return {\n projectName,\n repositoryName,\n ...(artifactDigest ? { artifactDigest } : {}),\n ...(artifactTag ? { artifactTag } : {}),\n };\n}\n\nexport function buildProjectRepositoryLongName(\n representation: ProjectRepositoryLongNameRepresentation,\n) : string {\n const str = `${representation.projectName}/${representation.repositoryName}`;\n\n if (representation.artifactTag) {\n return `${str}:${representation.artifactTag}`;\n }\n if (representation.artifactDigest) {\n return `${str}@${representation.artifactDigest}`;\n }\n\n return str;\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildQueryString, extractResourceMetaOfResponse } from '../../utils';\nimport { BaseAPI } from '../base';\nimport type { BaseAPIContext, ResourceCollectionResponse } from '../type';\nimport type {\n ProjectRepository,\n ProjectRepositoryDeleteContext,\n ProjectRepositoryFindOneContext,\n ProjectRepositoryGetManyContext,\n ProjectRepositoryGetOneContext,\n ProjectRepositoryUpdateContext,\n} from './type';\nimport { parseLongProjectRepositoryName } from './utils';\n\nexport class ProjectRepositoryAPI extends BaseAPI {\n constructor(context: BaseAPIContext) {\n super(context);\n }\n\n async findOne(projectRepositoryName: string): Promise<ProjectRepository | undefined>;\n\n async findOne(context: ProjectRepositoryFindOneContext): Promise<ProjectRepository | undefined>;\n\n async findOne(input: string | ProjectRepositoryFindOneContext): Promise<ProjectRepository | undefined> {\n let context : ProjectRepositoryDeleteContext;\n if (typeof input === 'string') {\n context = parseLongProjectRepositoryName(input);\n } else {\n context = input;\n }\n\n const { data } = await this.getMany({\n projectName: context.projectName,\n query: {\n q: { name: `~${context.repositoryName}` },\n page_size: 1,\n },\n });\n\n return data.shift();\n }\n\n async getOne(projectRepositoryName: string) : Promise<ProjectRepository>;\n\n async getOne(context: ProjectRepositoryGetOneContext) : Promise<ProjectRepository>;\n\n async getOne(input: string | ProjectRepositoryGetOneContext) : Promise<ProjectRepository> {\n let context : ProjectRepositoryGetOneContext;\n if (typeof input === 'string') {\n context = parseLongProjectRepositoryName(input);\n } else {\n context = input;\n }\n\n const { data } : { data: ProjectRepository } = await this.client.get(\n `projects/${context.projectName}/repositories/${context.repositoryName}`,\n );\n\n const parsed = parseLongProjectRepositoryName(data.name);\n\n return {\n ...data,\n name_short: parsed.repositoryName,\n project_name: parsed.projectName,\n };\n }\n\n async getMany(context: ProjectRepositoryGetManyContext): Promise<ResourceCollectionResponse<ProjectRepository>> {\n const result = await this.client\n .get(`projects/${context.projectName}/repositories${buildQueryString(context.query)}`);\n\n return {\n data: result.data\n .map((item: ProjectRepository) => {\n const parsed = parseLongProjectRepositoryName(item.name);\n\n return {\n ...item,\n name_short: parsed.repositoryName,\n project_name: parsed.projectName,\n };\n }),\n meta: extractResourceMetaOfResponse(result),\n };\n }\n\n async getAll(context: ProjectRepositoryGetManyContext) : Promise<ResourceCollectionResponse<ProjectRepository>> {\n context.query = context.query || {};\n\n if (!context.query.page_size) {\n context.query.page_size = 50;\n }\n\n if (!context.query.page) {\n context.query.page = 1;\n }\n\n const response = await this.getMany(context);\n if (response.data.length === context.query.page_size) {\n context.query.page++;\n\n const next = await this.getAll(context);\n\n response.data.push(...next.data);\n }\n\n return response;\n }\n\n async update(context: ProjectRepositoryUpdateContext) : Promise<void> {\n await this.client\n .put(`projects/${context.projectName}/repositories/${context.repositoryName}`, context.data);\n }\n\n async delete(projectRepositoryName: string) : Promise<void>;\n\n async delete(context: ProjectRepositoryDeleteContext) : Promise<void>;\n\n async delete(input: string | ProjectRepositoryDeleteContext) : Promise<void> {\n let context : ProjectRepositoryDeleteContext;\n if (typeof input === 'string') {\n context = parseLongProjectRepositoryName(input);\n } else {\n context = input;\n }\n\n await this.client\n .delete(`projects/${context.projectName}/repositories/${context.repositoryName}`);\n }\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { buildQueryString } from '../../utils';\nimport { BaseAPI } from '../base';\nimport { buildProjectRepositoryLongName } from '../project-repository';\nimport type { BaseAPIContext } from '../type';\nimport type {\n ProjectArtifact,\n ProjectArtifactCopyElement,\n ProjectArtifactDeleteContext,\n ProjectArtifactGetManyContext,\n} from './type';\n\nexport class ProjectRepositoryArtifactAPI extends BaseAPI {\n constructor(context: BaseAPIContext) {\n super(context);\n }\n\n async getMany(context: ProjectArtifactGetManyContext) : Promise<ProjectArtifact[]> {\n const { data } = await this.client\n .get(`projects/${context.projectName}/repositories/${context.repositoryName}/artifacts${buildQueryString(context.query)}`);\n\n return data;\n }\n\n async copy(destination: ProjectArtifactCopyElement, source: string | ProjectArtifactCopyElement) : Promise<void> {\n let from : string;\n if (typeof source === 'string') {\n from = source;\n } else {\n if (!source.artifactTag && !source.artifactDigest) {\n source.artifactTag = 'latest';\n }\n\n from = buildProjectRepositoryLongName(source);\n }\n\n await this.client\n .post(\n `projects/${destination.projectName}/repositories/${destination.repositoryName}/artifacts?` +\n `from=${from}`,\n );\n }\n\n async delete(context: ProjectArtifactDeleteContext) {\n await this.client\n .delete(`projects/${context.projectName}/repositories/${context.repositoryName}/artifacts/${context.tagOrDigest || 'latest'}`);\n }\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BaseAPI } from '../base';\nimport type { BaseAPIContext } from '../type';\nimport type {\n ProjectArtifactLabelCreateContext,\n ProjectArtifactLabelDeleteContext,\n} from './type';\n\nexport class ProjectRepositoryArtifactLabelAPI extends BaseAPI {\n constructor(context: BaseAPIContext) {\n super(context);\n }\n\n async create(options: ProjectArtifactLabelCreateContext) : Promise<void> {\n await this.client\n .post(\n `projects/${options.projectName}/repositories/${options.repositoryName}` +\n `/artifacts/${options.tagOrDigest || 'latest'}/labels`,\n { id: options.labelId },\n );\n }\n\n async delete(options: ProjectArtifactLabelDeleteContext) {\n await this.client\n .delete(`projects/${options.projectName}/repositories/${options.repositoryName}` +\n `/artifacts/${options.tagOrDigest || 'latest'}/labels/${options.labelId}`);\n }\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { merge } from 'smob';\nimport { HeaderName } from '../../constants';\nimport { buildQueryString, extractResourceIDOfResponse, extractResourceMetaOfResponse } from '../../utils';\nimport { BaseAPI } from '../base';\nimport type { BaseAPIContext, ResourceCollectionResponse } from '../type';\nimport type {\n ProjectWebhookEventType,\n ProjectWebhookPolicy,\n ProjectWebhookPolicyCreateContext,\n ProjectWebhookPolicyCreateResponse,\n ProjectWebhookPolicyDeleteByNameContext,\n ProjectWebhookPolicyDeleteContext,\n ProjectWebhookPolicyFindOneContext,\n ProjectWebhookPolicyGetManyContext,\n ProjectWebhookPolicyGetOneContext,\n ProjectWebhookPolicyUpdateContext,\n} from './type';\n\nexport class ProjectWebhookPolicyAPI extends BaseAPI {\n constructor(context: BaseAPIContext) {\n super(context);\n }\n\n async create(context: ProjectWebhookPolicyCreateContext) : Promise<ProjectWebhookPolicyCreateResponse> {\n const headers: Record<string, any> = {};\n\n if (context.isProjectName) {\n headers[HeaderName.IS_RESOURCE_NAME] = true;\n }\n\n const response = await this.client\n .post(\n `projects/${context.projectIdOrName}/webhook/policies`,\n this.extendPayload(context.data),\n { headers },\n );\n\n return { id: extractResourceIDOfResponse(response) };\n }\n\n async getMany(context: ProjectWebhookPolicyGetManyContext) : Promise<ResourceCollectionResponse<ProjectWebhookPolicy>> {\n const headers: Record<string, any> = {};\n\n if (context.isProjectName) {\n headers[HeaderName.IS_RESOURCE_NAME] = true;\n }\n\n const response = await this.client\n .get(\n `projects/${context.projectIdOrName}/webhook/policies${buildQueryString(context.query)}`,\n { headers },\n );\n\n return {\n data: response.data,\n meta: extractResourceMetaOfResponse(response),\n };\n }\n\n async getOne(\n context: ProjectWebhookPolicyGetOneContext,\n ) : Promise<ProjectWebhookPolicy> {\n const headers: Record<string, any> = {};\n\n if (context.isProjectName) {\n headers[HeaderName.IS_RESOURCE_NAME] = true;\n }\n\n const response = await this.client\n .get(\n `projects/${context.projectIdOrName}/webhook/policies/${context.id}`,\n { headers },\n );\n\n return response.data;\n }\n\n async findOne(context: ProjectWebhookPolicyFindOneContext): Promise<ProjectWebhookPolicy | undefined> {\n const response = await this.getMany({\n projectIdOrName: context.projectIdOrName,\n isProjectName: context.isProjectName,\n query: {\n q: { name: context.name },\n page_size: 1,\n },\n });\n\n return response.data.pop();\n }\n\n async update(context: ProjectWebhookPolicyUpdateContext): Promise<void> {\n const headers: Record<string, any> = {};\n\n if (context.isProjectName) {\n headers[HeaderName.IS_RESOURCE_NAME] = true;\n }\n\n await this.client.put(\n `projects/${context.projectIdOrName}/webhook/policies/${context.id}`,\n this.extendPayload({\n ...context.data,\n id: context.id,\n }),\n { headers },\n );\n }\n\n async deleteByName(context: ProjectWebhookPolicyDeleteByNameContext) {\n const webhook = await this.findOne(context);\n if (webhook) {\n await this.delete({\n isProjectName: false,\n projectIdOrName: webhook.project_id as number,\n id: webhook.id,\n });\n }\n }\n\n async delete(context: ProjectWebhookPolicyDeleteContext) : Promise<any> {\n const headers: Record<string, any> = {};\n\n if (context.isProjectName) {\n headers[HeaderName.IS_RESOURCE_NAME] = true;\n }\n\n await this.client\n .delete(`projects/${context.projectIdOrName}/webhook/policies/${context.id}`, { headers });\n }\n\n protected extendPayload(data: Partial<ProjectWebhookPolicy>) : Partial<ProjectWebhookPolicy> {\n data.name = data.name || (Math.random() + 1).toString(36).substring(7);\n\n if (typeof data.enabled === 'undefined') {\n data.enabled = true;\n }\n\n if (typeof data.targets === 'undefined') {\n data.targets = [];\n }\n\n if (typeof data.event_types === 'undefined') {\n data.event_types = ['PUSH_ARTIFACT'];\n } else {\n data.event_types = merge(['PUSH_ARTIFACT'] satisfies ProjectWebhookEventType[], data.event_types);\n }\n\n return data;\n }\n}\n","/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport enum RobotPermissionResource {\n ARTIFACT = 'artifact',\n ARTIFACT_LABEL = 'artifact-label',\n IMMUTABLE_TAG = 'immutable-tag',\n LABEL = 'label',\n LOG = 'log',\n METADATA = 'metadata',\n NOTIFICATION_POLICY = 'notification-policy',\n PREHEAT_POLICY = 'preheat-policy',\n PROJECT = 'project',\n REPOSITORY = 'repository',\n SCAN = 'scan',\n TAG = 'tag',\n}\n\nexport enum RobotPermissionAction {\n CREATE = 'create',\n DELETE = 'delete',\n READ = 'read',\n UPDATE = 'update',\n PULL = 'pull',\n PUSH = 'push',\n LIST = 'list',\n STOP = 'stop',\n}\n","/*\n * Copyright (c) 2022-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { merge } from 'smob';\nimport { buildQueryString, extractResourceMetaOfResponse } from '../../utils';\nimport { BaseAPI } from '../base';\nimport type { BaseAPIContext, ResourceCollectionResponse } from '../type';\nimport type {\n Robot,\n RobotCreatePayload,\n RobotGetManyContext,\n RobotUpdatePayload,\n RobotUpdateSecretResponse,\n} from './type';\n\nexport class RobotAPI extends BaseAPI {\n constructor(context: BaseAPIContext) {\n super(context);\n }\n\n async create(data: RobotCreatePayload) : Promise<Robot> {\n const response = await this.client\n .post('robots', this.extendPayload(data));\n\n return merge(response.data, data);\n }\n\n async getMany(context: RobotGetManyContext) : Promise<ResourceCollectionResponse<Robot>> {\n const response = await this.client.get(`robots${buildQueryString(context.query)}`);\n\n return {\n data: response.data,\n meta: extractResourceMetaOfResponse(response),\n };\n }\n\n async getOne(id: number) : Promise<Robot> {\n const response = await this.client.get(`robots/${id}`);\n\n return response.data;\n }\n\n /**\n * Update harbor project robot account.\n * If no \"secret\" provided, a new secret is generated.\n *\n * @param id\n * @param secret\n */\n async updateSecret(\n id: string | number,\n secret?: string,\n ): Promise<RobotUpdateSecretResponse> {\n const payload: Record<string, any> = { ...(secret ? { secret } : {}) };\n\n const { data }: { data: Robot } = await this.client\n .patch(`robots/${id}`, payload);\n\n if (typeof payload.secret !== 'undefined') {\n data.secret = payload.secret;\n }\n\n return data as RobotUpdateSecretResponse;\n }\n\n async update(\n id: number,\n data: RobotUpdatePayload,\n ): Promise<void> {\n await this.client\n .put(`robots/${id}`, this.extendPayload({ ...data, id }));\n }\n\n async delete(id: Robot['id']): Promise<void> {\n await this.client\n .delete(`robots/${id}`);\n }\n\n extendPayload<T extends Record<string, any>>(data: T) : T {\n return merge((data || {}), {\n description: '',\n duration: -1,\n level: 'system',\n editable: true,\n disable: false,\n permissions: [],\n } satisfies Partial<Robot>) as T;\n }\n}\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { RobotPermissionAction, RobotPermissionResource } from './constants';\nimport type { RobotPermission } from './type';\n\n/**\n * Create robot permission to access all resources.\n *\n * @param namespace (e.g. * or project name)\n */\nexport function buildRobotPermissionForAllResources(\n namespace: string,\n) : RobotPermission {\n return {\n access: [\n { resource: RobotPermissionResource.ARTIFACT, action: RobotPermissionAction.CREATE },\n { resource: RobotPermissionResource.ARTIFACT, action: RobotPermissionAction.DELETE },\n { resource: RobotPermissionResource.ARTIFACT, action: RobotPermissionAction.LIST },\n { resource: RobotPermissionResource.ARTIFACT, action: RobotPermissionAction.READ },\n\n { resource: RobotPermissionResource.ARTIFACT_LABEL, action: RobotPermissionAction.CREATE },\n { resource: RobotPermissionResource.ARTIFACT_LABEL, action: RobotPermissionAction.DELETE },\n\n { resource: RobotPermissionResource.IMMUTABLE_TAG, action: RobotPermissionAction.CREATE },\n { resource: RobotPermissionResource.IMMUTABLE_TAG, action: RobotPermissionAction.DELETE },\n { resource: RobotPermissionResource.IMMUTABLE_TAG, action: RobotPermissionAction.LIST },\n { resource: RobotPermissionResource.IMMUTABLE_TAG, action: RobotPermissionAction.UPDATE },\n\n { resource: RobotPermissionResource.REPOSITORY, action: RobotPermissionAction.LIST },\n { resource: RobotPermissionResource.REPOSITORY, action: RobotPermissionAction.PULL },\n { resource: RobotPermissionResource.REPOSITORY, action: RobotPermissionAction.PUSH },\n { resource: RobotPermissionResource.REPOSITORY, action: RobotPermissionAction.UPDATE },\n { resource: RobotPermissionResource.REPOSITORY, action: RobotPermissionAction.DELETE },\n\n { resource: RobotPermissionResource.TAG, action: RobotPermissionAction.CREATE },\n { resource: RobotPermissionResource.TAG, action: RobotPermissionAction.DELETE },\n { resource: RobotPermissionResource.TAG, action: RobotPermissionAction.LIST },\n\n { resource: RobotPermissionResource.SCAN, action: RobotPermissionAction.READ },\n { resource: RobotPermissionResource.SCAN, action: RobotPermissionAction.STOP },\n { resource: RobotPermissionResource.SCAN, action: RobotPermissionAction.CREATE },\n\n { resource: RobotPermissionResource.LABEL, action: RobotPermissionAction.CREATE },\n { resource: RobotPermissionResource.LABEL, action: RobotPermissionAction.DELETE },\n { resource: RobotPermissionResource.LABEL, action: RobotPermissionAction.LIST },\n { resource: RobotPermissionResource.LABEL, action: RobotPermissionAction.READ },\n { resource: RobotPermissionResource.LABEL, action: RobotPermissionAction.UPDATE },\n\n { resource: RobotPermissionResource.METADATA, action: RobotPermissionAction.CREATE },\n { resource: RobotPermissionResource.METADATA, action: RobotPermissionAction.DELETE },\n { resource: RobotPermissionResource.METADATA, action: RobotPermissionAction.LIST },\n { resource: RobotPermissionResource.METADATA, action: RobotPermissionAction.READ },\n { resource: RobotPermissionResource.METADATA, action: RobotPermissionAction.UPDATE },\n\n { resource: RobotPermissionResource.LOG, action: RobotPermissionAction.LIST },\n\n { resource: RobotPermissionResource.NOTIFICATION_POLICY, action: RobotPermissionAction.CREATE },\n { resource: RobotPermissionResource.NOTIFICATION_POLICY, action: RobotPermissionAction.DELETE },\n { resource: RobotPermissionResource.NOTIFICATION_POLICY, action: RobotPermissionAction.LIST },\n { resource: RobotPermissionResource.NOTIFICATION_POLICY, action: RobotPermissionAction.READ },\n { resource: RobotPermissionResource.NOTIFICATION_POLICY, action: RobotPermissionAction.UPDATE },\n\n { resource: RobotPermissionResource.PREHEAT_POLICY, action: RobotPermissionAction.CREATE },\n { resource: RobotPermissionResource.PREHEAT_POLICY, action: RobotPermissionAction.DELETE },\n { resource: RobotPermissionResource.PREHEAT_POLICY, action: RobotPermissionAction.LIST },\n { resource: RobotPermissionResource.PREHEAT_POLICY, action: RobotPermissionAction.READ },\n { resource: RobotPermissionResource.PREHEAT_POLICY, action: RobotPermissionAction.UPDATE },\n\n { resource: RobotPermissionResource.PROJECT, action: RobotPermissionAction.DELETE },\n { resource: RobotPermissionResource.PROJECT, action: RobotPermissionAction.READ },\n { resource: RobotPermissionResource.PROJECT, action: RobotPermissionAction.UPDATE },\n ],\n kind: 'project',\n namespace,\n };\n}\n","/*\n * Copyright (c) 2021-2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { Client as BaseClient, markInstanceof, resolveConnectionOptions } from 'hapic';\nimport type { ConfigInput } from './config';\nimport {\n ProjectAPI,\n ProjectRepositoryAPI,\n ProjectRepositoryArtifactAPI,\n ProjectRepositoryArtifactLabelAPI,\n ProjectWebhookPolicyAPI,\n RobotAPI,\n} from './domains';\nimport type { SearchResult } from './type';\nimport { parseConnectionString } from './utils';\n\nexport const HARBOR_CLIENT_INSTANCE = Symbol.for('@hapic/harbor/HarborClient');\n\nexport class HarborClient extends BaseClient {\n public readonly project: ProjectAPI;\n\n public readonly projectRepositoryArtifact: ProjectRepositoryArtifactAPI;\n\n public readonly projectRepositoryArtifactLabel : ProjectRepositoryArtifactLabelAPI;\n\n public readonly projectRepository: ProjectRepositoryAPI;\n\n public readonly projectWebhookPolicy: ProjectWebhookPolicyAPI;\n\n public readonly robot : RobotAPI;\n\n // -----------------------------------------------------------------------------------\n\n constructor(input: ConfigInput = {}) {\n super(input.request);\n\n markInstanceof(this, HARBOR_CLIENT_INSTANCE);\n\n this.project = new ProjectAPI({ client: this });\n this.projectRepository = new ProjectRepositoryAPI({ client: this });\n this.projectRepositoryArtifact = new ProjectRepositoryArtifactAPI({ client: this });\n this.projectRepositoryArtifactLabel = new ProjectRepositoryArtifactLabelAPI({ client: this });\n this.projectWebhookPolicy = new ProjectWebhookPolicyAPI({ client: this });\n this.robot = new RobotAPI({ client: this });\n\n this.applyConfig(input);\n }\n\n // -----------------------------------------------------------------------------------\n\n applyConfig(input: ConfigInput = {}) {\n const connectionOptions = resolveConnectionOptions(input, parseConnectionString);\n\n if (connectionOptions) {\n this.setBaseURL(connectionOptions.host);\n\n this.setAuthorizationHeader({\n type: 'Basic',\n username: connectionOptions.user,\n password: connectionOptions.password,\n });\n }\n }\n\n // -----------------------------------------------------------------------------------\n\n async search(q: string): Promise<SearchResult> {\n const { data } = await this\n .get(`search?q=${q}`);\n\n return data;\n }\n}\n","/*\n * Copyright (c) 2022-2023.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createClientRegistry } from 'hapic';\nimport type { ConfigInput } from './config';\nimport { HARBOR_CLIENT_INSTANCE, HarborClient } from './module';\n\nexport const {\n hasClient,\n setClient,\n useClient,\n unsetClient,\n createClient,\n isClient,\n} = createClientRegistry<HarborClient, ConfigInput>({\n create: (input) => new HarborClient(input),\n id: HARBOR_CLIENT_INSTANCE,\n});\n","/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { createClient } from './instance';\n\nexport * from './constants';\nexport * from './client';\nexport * from './config';\nexport * from './instance';\nexport * from './domains';\nexport * from './error';\nexport * from './module';\nexport * from './type';\nexport * from './utils';\n\nconst client = createClient();\nexport default client;\n"],"mappings":"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"}