diff --git a/.eslintrc.yml b/.eslintrc.yml index 7fa00623..f4f00149 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -34,6 +34,7 @@ rules: import/no-default-export: error import/prefer-default-export: off '@typescript-eslint/explicit-function-return-type': off + '@typescript-eslint/explicit-module-boundary-types': off import/no-extraneous-dependencies: - error - devDependencies: @@ -52,6 +53,16 @@ overrides: - '**/*.tsx' rules: camelcase: 'off' + - files: + - '**/test/**/*.ts' + rules: + '@typescript-eslint/no-var-requires': 'off' + global-require: 'off' + jest/no-mocks-import: 'off' + - files: + - '**/__mocks__/**/*.ts' + rules: + import/no-default-export: 'off' settings: import/resolver: diff --git a/README.md b/README.md index 95539c14..db440849 100644 --- a/README.md +++ b/README.md @@ -202,7 +202,7 @@ GitignoreTemplates GitLabCIYMLTemplates Keys License -LicenceTemplates +LicenseTemplates Lint Markdown Namespaces @@ -223,7 +223,6 @@ GroupCustomAttributes GroupIssueBoards GroupMembers GroupMilestones -GroupProjects GroupRunners GroupVariables GroupLabels diff --git a/package.json b/package.json index 6b56d4de..9420435f 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "lint-staged": "^11.0.0", "prettier": "^2.2.1", "ts-jest": "^26.5.3", - "typescript": "^4.2.3" + "typescript": "^4.2.3", + "uuid": "^8.3.2" }, "private": true, "workspaces": [ diff --git a/packages/gitbeaker-browser/src/index.ts b/packages/gitbeaker-browser/src/index.ts index 55674bf2..0e410262 100644 --- a/packages/gitbeaker-browser/src/index.ts +++ b/packages/gitbeaker-browser/src/index.ts @@ -14,7 +14,6 @@ export const { GroupIssueBoards, GroupMembers, GroupMilestones, - GroupProjects, GroupRunners, GroupVariables, GroupLabels, @@ -28,7 +27,7 @@ export const { UserCustomAttributes, UserEmails, UserImpersonationTokens, - UserKeys, + UserSSHKeys, UserGPGKeys, // Projects @@ -43,6 +42,7 @@ export const { Issues, IssuesStatistics, IssueNotes, + IssueNoteAwardEmojis, IssueDiscussions, IssueAwardEmojis, Jobs, @@ -94,7 +94,7 @@ export const { GitLabCIYMLTemplates, Keys, License, - LicenceTemplates, + LicenseTemplates, Lint, Namespaces, NotificationSettings, diff --git a/packages/gitbeaker-core/src/index.ts b/packages/gitbeaker-core/src/index.ts index 86ff60c3..e898b37c 100644 --- a/packages/gitbeaker-core/src/index.ts +++ b/packages/gitbeaker-core/src/index.ts @@ -24,7 +24,6 @@ export const GroupsBundle = bundler({ GroupIssueBoards: APIServices.GroupIssueBoards, GroupMembers: APIServices.GroupMembers, GroupMilestones: APIServices.GroupMilestones, - GroupProjects: APIServices.GroupProjects, GroupRunners: APIServices.GroupRunners, GroupVariables: APIServices.GroupVariables, GroupLabels: APIServices.GroupLabels, @@ -41,7 +40,7 @@ export const UsersBundle = bundler({ UserCustomAttributes: APIServices.UserCustomAttributes, UserEmails: APIServices.UserEmails, UserImpersonationTokens: APIServices.UserImpersonationTokens, - UserKeys: APIServices.UserKeys, + UserSSHKeys: APIServices.UserSSHKeys, UserGPGKeys: APIServices.UserGPGKeys, }); @@ -59,6 +58,7 @@ export const ProjectsBundle = bundler({ IssuesStatistics: APIServices.IssuesStatistics, IssueAwardEmojis: APIServices.IssueAwardEmojis, IssueNotes: APIServices.IssueNotes, + IssueNoteAwardEmojis: APIServices.IssueNoteAwardEmojis, IssueDiscussions: APIServices.IssueDiscussions, Jobs: APIServices.Jobs, Labels: APIServices.Labels, diff --git a/packages/gitbeaker-core/src/infrastructure/RequestHelper.ts b/packages/gitbeaker-core/src/infrastructure/RequestHelper.ts index 4448b631..883b3ce1 100644 --- a/packages/gitbeaker-core/src/infrastructure/RequestHelper.ts +++ b/packages/gitbeaker-core/src/infrastructure/RequestHelper.ts @@ -1,44 +1,40 @@ import { parse as parseLink } from 'li'; import { camelizeKeys } from 'xcase'; import { BaseService } from '@gitbeaker/requester-utils'; -import { appendFormFromObject } from './Utils'; +import { appendFormFromObject, Camelize } from './Utils'; -export type True = true; -export type False = false; - -export interface PaginationInformation { - total: number; - next: number | null; - current: number; - previous: number | null; - perPage: number; - totalPages: number; -} - -// Options -export interface Sudo { - sudo?: string | number; -} -export interface IsForm { +// Request Options +export type IsForm = { isForm?: boolean; -} -export interface ShowExpanded { - showExpanded?: boolean; -} +}; -/* eslint @typescript-eslint/no-explicit-any:0 */ -export type BaseRequestOptions = Sudo & Record; +export type Sudo = { + sudo?: string | number; +}; -export interface PaginatedRequestOptions extends BaseRequestOptions { - pagination?: 'keyset' | 'offset'; +export type ShowExpanded = { + showExpanded?: T; +}; + +export type BaseRequestOptions = Sudo & Record; + +export type BasePaginationRequestOptions< + P extends 'keyset' | 'offset' = 'keyset' | 'offset' +> = BaseRequestOptions & { + pagination?: P; perPage?: number; -} +}; -export interface OffsetPaginatedRequestOptions extends PaginatedRequestOptions { - pagination: 'offset'; +export type OffsetPaginationRequestOptions = { page?: number; maxPages?: number; -} +}; + +export type PaginatedRequestOptions< + P extends 'keyset' | 'offset' = 'keyset' | 'offset' +> = P extends 'keyset' + ? BasePaginationRequestOptions

+ : BasePaginationRequestOptions

& OffsetPaginationRequestOptions; // Response Formats export interface ExpandedResponse> { @@ -48,19 +44,59 @@ export interface ExpandedResponse> { } export interface PaginationResponse[]> { data: T; - paginationInfo: PaginationInformation; + paginationInfo: { + total: number; + next: number | null; + current: number; + previous: number | null; + perPage: number; + totalPages: number; + }; } -/* eslint @typescript-eslint/no-explicit-any:0 */ -async function getHelper>( - service: BaseService, +export type CamelizedRecord = C extends true ? Camelize : T; + +export type ExtendedRecordReturn< + C extends boolean, + E extends boolean, + T extends Record | void +> = T extends void + ? void + : E extends false + ? CamelizedRecord + : ExpandedResponse>; + +type ExtendedArrayReturn< + C extends boolean, + E extends boolean, + T, + P extends 'keyset' | 'offset' +> = E extends false + ? CamelizedRecord[] + : P extends 'keyset' + ? CamelizedRecord[] + : PaginationResponse[]>; + +type ExtendedReturn< + C extends boolean, + E extends boolean, + P extends 'keyset' | 'offset', + T extends Record | Record[] +> = T extends Record + ? ExtendedRecordReturn + : T extends (infer R)[] + ? ExtendedArrayReturn + : never; + +async function getHelper

( + service: BaseService, endpoint: string, { sudo, showExpanded, maxPages, ...query - }: PaginatedRequestOptions | OffsetPaginatedRequestOptions = {}, + }: BasePaginationRequestOptions

& ShowExpanded & { maxPages?: number } = {}, acc: any[] = [], ): Promise { const response = await service.requester.get(endpoint, { query, sudo }); @@ -72,18 +108,18 @@ async function getHelper>( // Handle object responses if (!Array.isArray(body)) { - if (!showExpanded) return body as T; + if (!showExpanded) return body; return { data: body, headers, status, - } as ExpandedResponse; + }; } // Handle array responses - const newAcc = [...acc, ...body] as T[]; - const { next } = parseLink(headers.link); + const newAcc = [...acc, ...body]; + const { next }: { next: string } = parseLink(headers.link); const withinBounds = maxPages ? newAcc.length / (query.perPage || 20) < maxPages : true; // Recurse through pagination results @@ -102,7 +138,7 @@ async function getHelper>( ); } - if (!showExpanded || query.pagination === 'keyset') return newAcc as T[]; + if (!showExpanded || query.pagination === 'keyset') return newAcc; return { data: newAcc, @@ -114,118 +150,94 @@ async function getHelper>( perPage: parseInt(headers['x-per-page'], 10), totalPages: parseInt(headers['x-total-pages'], 10), }, - } as PaginationResponse; + }; } -export async function get>( - service: BaseService, - endpoint: string, - options?: BaseRequestOptions, -): Promise; -export async function get>( - service: BaseService, - endpoint: string, - options?: PaginatedRequestOptions, -): Promise | PaginationResponse>; -export async function get>( - service: BaseService, - endpoint: string, - options?: OffsetPaginatedRequestOptions & { showExpanded: true }, -): Promise | PaginationResponse>; -/* eslint @typescript-eslint/no-explicit-any:0 */ -export async function get>( - service: BaseService, - endpoint: string, - options: PaginatedRequestOptions | OffsetPaginatedRequestOptions = {}, -): Promise { - return getHelper(service, endpoint, options); +export function get< + T extends Record | Record[] = Record +>() { + return async function < + C extends boolean, + P extends 'keyset' | 'offset' = 'offset', + E extends boolean = false + >( + service: BaseService, + endpoint: string, + options?: PaginatedRequestOptions

& ShowExpanded & Record, + ): Promise> { + return getHelper(service, endpoint, options); + }; } -async function post>( - service: BaseService, - endpoint: string, - options?: IsForm & BaseRequestOptions, -): Promise; -async function post>( - service: BaseService, - endpoint: string, - options?: IsForm & BaseRequestOptions & { showExpanded: true }, -): Promise>; +export function post | void = Record>() { + return async function ( + service: BaseService, + endpoint: string, + { isForm, sudo, showExpanded, ...options }: IsForm & BaseRequestOptions & ShowExpanded = {}, + ): Promise> { + const body = isForm ? appendFormFromObject(options) : options; -/* eslint @typescript-eslint/no-explicit-any:0 */ -async function post( - service: BaseService, - endpoint: string, - { isForm, sudo, showExpanded, ...options }: IsForm & ShowExpanded & BaseRequestOptions = {}, -): Promise { - const body = isForm ? appendFormFromObject(options) : options; + const r = await service.requester.post(endpoint, { + body, + sudo, + }); - const r = await service.requester.post(endpoint, { - body, - sudo, - }); - - return showExpanded - ? { - data: r.body, - status: r.status, - headers: r.headers, - } - : r.body; + return showExpanded + ? { + data: r.body, + status: r.status, + headers: r.headers, + } + : r.body; + }; } -async function put>( - service: BaseService, - endpoint: string, - options?: BaseRequestOptions, -): Promise; -async function put>( - service: BaseService, - endpoint: string, - { showExpanded }: BaseRequestOptions & { showExpanded: true }, -): Promise>; +export function put = Record>() { + return async function ( + service: BaseService, + endpoint: string, + { isForm, sudo, showExpanded, ...options }: IsForm & BaseRequestOptions & ShowExpanded = {}, + ): Promise> { + const body = isForm ? appendFormFromObject(options) : options; -/* eslint @typescript-eslint/no-explicit-any:0 */ -async function put( - service: BaseService, - endpoint: string, - { sudo, showExpanded, ...body }: ShowExpanded & BaseRequestOptions = {}, -): Promise { - const r = await service.requester.put(endpoint, { - body, - sudo, - }); + const r = await service.requester.put(endpoint, { + body, + sudo, + }); - return showExpanded ? { data: r.body, status: r.status, headers: r.headers } : r.body; + return showExpanded + ? { + data: r.body, + status: r.status, + headers: r.headers, + } + : r.body; + }; } -async function del>( - service: BaseService, - endpoint: string, - options?: BaseRequestOptions, -): Promise; -async function del>( - service: BaseService, - endpoint: string, - { showExpanded }: BaseRequestOptions & { showExpanded: true }, -): Promise>; +export function del | void = void>() { + return async function ( + service: BaseService, + endpoint: string, + { sudo, showExpanded, ...query }: BaseRequestOptions & ShowExpanded = {}, + ): Promise> { + const r = await service.requester.delete(endpoint, { + query, + sudo, + }); -/* eslint @typescript-eslint/no-explicit-any:0 */ -async function del( - service: BaseService, - endpoint: string, - { sudo, showExpanded, ...query }: ShowExpanded & BaseRequestOptions = {}, -): Promise { - const r = await service.requester.delete(endpoint, { - query, - sudo, - }); - - return showExpanded ? { data: r.body, status: r.status, headers: r.headers } : r.body; + return showExpanded + ? { + data: r.body, + status: r.status, + headers: r.headers, + } + : r.body; + }; } -function stream( - service: BaseService, +function stream( + service: BaseService, endpoint: string, options?: BaseRequestOptions, ): NodeJS.ReadableStream { diff --git a/packages/gitbeaker-core/src/infrastructure/Utils.ts b/packages/gitbeaker-core/src/infrastructure/Utils.ts index e7984f6a..c5ac742f 100644 --- a/packages/gitbeaker-core/src/infrastructure/Utils.ts +++ b/packages/gitbeaker-core/src/infrastructure/Utils.ts @@ -1,5 +1,15 @@ import FormData from 'form-data'; +export type CamelizeString = T extends string + ? string extends T + ? string + : T extends `${infer F}_${infer R}` + ? `${F}${Capitalize>}` + : T + : T; + +export type Camelize = { [K in keyof T as CamelizeString]: T[K] }; + /* eslint @typescript-eslint/no-explicit-any: 0 */ interface Constructor { new (...args: any): any; diff --git a/packages/gitbeaker-core/src/services/ApplicationSettings.ts b/packages/gitbeaker-core/src/services/ApplicationSettings.ts index dde94af7..a6240702 100644 --- a/packages/gitbeaker-core/src/services/ApplicationSettings.ts +++ b/packages/gitbeaker-core/src/services/ApplicationSettings.ts @@ -1,12 +1,76 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, Sudo, BaseRequestOptions } from '../infrastructure'; -export class ApplicationSettings extends BaseService { +export interface SettingsSchema extends Record { + default_projects_limit: number; + signup_enabled: boolean; + id: number; + default_branch_protection: number; + restricted_visibility_levels?: string[]; + password_authentication_enabled_for_web: boolean; + after_sign_out_path?: string; + max_attachment_size: number; + max_import_size: number; + user_oauth_applications: boolean; + updated_at: string; + session_expire_delay: number; + home_page_url?: string; + default_snippet_visibility: string; + outbound_local_requests_whitelist?: string[]; + domain_allowlist?: string[]; + domain_denylist_enabled: boolean; + domain_denylist?: string[]; + created_at: string; + default_ci_config_path?: string; + default_project_visibility: string; + default_group_visibility: string; + gravatar_enabled: boolean; + sign_in_text?: string; + container_expiration_policies_enable_historic_entries: boolean; + container_registry_token_expire_delay: number; + repository_storages_weighted: { + [name: string]: number; + }; + plantuml_enabled: boolean; + plantuml_url?: string; + kroki_enabled: boolean; + kroki_url?: string; + terminal_max_session_time: number; + polling_interval_multiplier: number; + rsa_key_restriction: number; + dsa_key_restriction: number; + ecdsa_key_restriction: number; + ed25519_key_restriction: number; + first_day_of_week: number; + enforce_terms: boolean; + terms: string; + performance_bar_allowed_group_id: number; + user_show_add_ssh_key_message: boolean; + local_markdown_version: number; + allow_local_requests_from_hooks_and_services: boolean; + allow_local_requests_from_web_hooks_and_services: boolean; + allow_local_requests_from_system_hooks: boolean; + asset_proxy_enabled: boolean; + asset_proxy_url: string; + asset_proxy_whitelist?: string[]; + asset_proxy_allowlist?: string[]; + npm_package_requests_forwarding: boolean; + snippet_size_limit: number; + issues_create_limit: number; + raw_blob_request_limit: number; + wiki_page_max_content_bytes: number; + require_admin_approval_after_user_signup: boolean; + personal_access_token_prefix: string; + rate_limiting_response_text?: string; + keep_latest_artifact: boolean; +} + +export class ApplicationSettings extends BaseService { all(options?: Sudo) { - return RequestHelper.get(this, 'application/settings', options); + return RequestHelper.get()(this, 'application/settings', options); } edit(options?: BaseRequestOptions) { - return RequestHelper.put(this, 'application/settings', options); + return RequestHelper.put()(this, 'application/settings', options); } } diff --git a/packages/gitbeaker-core/src/services/Branches.ts b/packages/gitbeaker-core/src/services/Branches.ts index 536d4ab1..b4434497 100644 --- a/packages/gitbeaker-core/src/services/Branches.ts +++ b/packages/gitbeaker-core/src/services/Branches.ts @@ -1,56 +1,53 @@ import { BaseService } from '@gitbeaker/requester-utils'; -import { - BaseRequestOptions, - PaginatedRequestOptions, - RequestHelper, - Sudo, -} from '../infrastructure'; +import { CommitSchema } from './Commits'; +import { PaginatedRequestOptions, RequestHelper, Sudo } from '../infrastructure'; -export class Branches extends BaseService { - all(projectId: string | number, options?: { search?: string } & PaginatedRequestOptions) { +export interface BranchSchema extends Record { + name: string; + merged: boolean; + protected: boolean; + default: boolean; + developers_can_push: boolean; + developers_can_merge: boolean; + can_push: boolean; + web_url: string; + commit: Omit; +} + +export class Branches extends BaseService { + all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/branches`, options); + return RequestHelper.get()( + this, + `projects/${pId}/repository/branches`, + options, + ); } create(projectId: string | number, branchName: string, ref: string, options?: Sudo) { const pId = encodeURIComponent(projectId); const branchKey = this.url.includes('v3') ? 'branchName' : 'branch'; - return RequestHelper.post(this, `projects/${pId}/repository/branches`, { + return RequestHelper.post()(this, `projects/${pId}/repository/branches`, { [branchKey]: branchName, ref, ...options, }); } - protect(projectId: string | number, branchName: string, options?: BaseRequestOptions) { - const pId = encodeURIComponent(projectId); - - return RequestHelper.post(this, `projects/${pId}/protected_branches`, { - name: branchName, - ...options, - }); - } - remove(projectId: string | number, branchName: string, options?: Sudo) { const [pId, bName] = [projectId, branchName].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/repository/branches/${bName}`, options); + return RequestHelper.del()(this, `projects/${pId}/repository/branches/${bName}`, options); } show(projectId: string | number, branchName: string, options?: Sudo) { const [pId, bName] = [projectId, branchName].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/repository/branches/${bName}`, options); - } - - unprotect(projectId: string | number, branchName: string, options?: Sudo) { - const [pId, bName] = [projectId, branchName].map(encodeURIComponent); - - return RequestHelper.put( + return RequestHelper.get()( this, - `projects/${pId}/repository/branches/${bName}/unprotect`, + `projects/${pId}/repository/branches/${bName}`, options, ); } diff --git a/packages/gitbeaker-core/src/services/BroadcastMessages.ts b/packages/gitbeaker-core/src/services/BroadcastMessages.ts index f165ec2f..b114deb4 100644 --- a/packages/gitbeaker-core/src/services/BroadcastMessages.ts +++ b/packages/gitbeaker-core/src/services/BroadcastMessages.ts @@ -4,32 +4,46 @@ import { PaginatedRequestOptions, RequestHelper, Sudo, + Camelize, } from '../infrastructure'; -export class BroadcastMessages extends BaseService { +export interface BroadcastMessageSchema extends Record { + message: string; + starts_at: string; + ends_at: string; + color: string; + font: string; + id: number; + active: boolean; + target_path: string; + broadcast_type: string; + dismissable: boolean; +} + +export class BroadcastMessages extends BaseService { all(options?: PaginatedRequestOptions) { - return RequestHelper.get(this, 'broadcast_messages', options); + return RequestHelper.get()(this, 'broadcast_messages', options); } - create(options?: BaseRequestOptions) { - return RequestHelper.post(this, 'broadcast_messages', options); + create(options?: Camelize> & Sudo) { + return RequestHelper.post()(this, 'broadcast_messages', options); } - edit(broadcastMessageId: number, options?: BaseRequestOptions) { + edit(broadcastMessageId: number, options?: Camelize> & Sudo) { const bId = encodeURIComponent(broadcastMessageId); - return RequestHelper.put(this, `broadcast_messages/${bId}`, options); + return RequestHelper.put()(this, `broadcast_messages/${bId}`, options); } remove(broadcastMessageId: number, options?: Sudo) { const bId = encodeURIComponent(broadcastMessageId); - return RequestHelper.del(this, `broadcast_messages/${bId}`, options); + return RequestHelper.del()(this, `broadcast_messages/${bId}`, options); } show(broadcastMessageId: number, options?: BaseRequestOptions) { const bId = encodeURIComponent(broadcastMessageId); - return RequestHelper.get(this, `broadcast_messages/${bId}`, options); + return RequestHelper.get()(this, `broadcast_messages/${bId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/CommitDiscussions.ts b/packages/gitbeaker-core/src/services/CommitDiscussions.ts index 555ff90c..6a7bffc7 100644 --- a/packages/gitbeaker-core/src/services/CommitDiscussions.ts +++ b/packages/gitbeaker-core/src/services/CommitDiscussions.ts @@ -1,53 +1,63 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceDiscussions } from '../templates'; -import { BaseRequestOptions, PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceDiscussions, DiscussionSchema } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface CommitDiscussions extends ResourceDiscussions { +export interface CommitDiscussions extends ResourceDiscussions { addNote( projectId: string | number, - commitId: string | number, - discussionId: string | number, + commitId: number, + discussionId: number, noteId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; - all(projectId: string | number, commitId: string | number, options?: PaginatedRequestOptions); + all( + projectId: string | number, + commitId: number, + options?: PaginatedRequestOptions, + ): Promise[]>; create( projectId: string | number, - commitId: string | number, + commitId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; editNote( projectId: string | number, - commitId: string | number, - discussionId: string | number, + commitId: number, + discussionId: number, noteId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; removeNote( projectId: string | number, - commitId: string | number, - discussionId: string | number, + commitId: number, + discussionId: number, noteId: number, options?: Sudo, - ); + ): Promise; show( projectId: string | number, - commitId: string | number, - discussionId: string | number, + commitId: number, + discussionId: number, options?: Sudo, - ); + ): Promise>; } -export class CommitDiscussions extends ResourceDiscussions { - constructor(options: BaseServiceOptions) { +export class CommitDiscussions extends ResourceDiscussions { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', 'repository/commits', options); } } diff --git a/packages/gitbeaker-core/src/services/Commits.ts b/packages/gitbeaker-core/src/services/Commits.ts index a818dfe4..70344247 100644 --- a/packages/gitbeaker-core/src/services/Commits.ts +++ b/packages/gitbeaker-core/src/services/Commits.ts @@ -1,4 +1,6 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; +import { MergeRequestSchema } from './MergeRequests'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -6,39 +8,6 @@ import { Sudo, } from '../infrastructure'; -// As of GitLab v12.6.2 -export interface CommitSchemaDefault { - id: string; - short_id: string; - created_at: Date; - parent_ids?: string[]; - title: string; - message: string; - author_name: string; - author_email: string; - authored_date?: Date; - committer_name?: string; - committer_email?: string; - committed_date?: Date; -} - -export interface CommitSchemaCamelized { - id: string; - shortId: string; - createdAt: Date; - parentIds?: string[]; - title: string; - message: string; - authorName: string; - authorEmail: string; - authoredDate?: Date; - committerName?: string; - committerEmail?: string; - committedDate?: Date; -} - -export type CommitSchema = CommitSchemaDefault | CommitSchemaCamelized; - export interface CommitAction { /** The action to perform */ action: 'create' | 'delete' | 'move' | 'update'; @@ -54,18 +23,50 @@ export interface CommitAction { lastCommitId?: string; } -export interface GPGSignature { +// Response structures +export interface CommitSchema extends Record { + id: string; + short_id: string; + created_at: Date; + parent_ids?: string[]; + title: string; + message: string; + author_name: string; + author_email: string; + authored_date?: Date; + committer_name?: string; + committer_email?: string; + committed_date?: Date; + web_url: string; +} + +export interface CommitExtendedSchema extends CommitSchema { + last_pipeline: { + id: number; + ref: string; + sha: string; + status: string; + }; + stats: { + additions: number; + deletions: number; + total: number; + }; + status: string; +} + +export interface GPGSignatureSchema extends Record { signature_type: 'PGP'; verification_status: 'verified' | 'unverified'; gpg_key_id: number; gpg_key_primary_keyid: string; gpg_key_user_name: string; gpg_key_user_email: string; - gpg_key_subkey_id: number | null; + gpg_key_subkey_id?: number; commit_source: string; } -export interface X509Signature { +export interface X509SignatureSchema extends Record { signature_type: 'X509'; verification_status: 'verified' | 'unverified'; x509_certificate: { @@ -85,32 +86,82 @@ export interface X509Signature { commit_source: string; } -export interface MissingSignature { +export interface MissingSignatureSchema extends Record { message: string; } -export type CommitSignature = GPGSignature | X509Signature | MissingSignature; +export type CommitSignatureSchema = + | GPGSignatureSchema + | X509SignatureSchema + | MissingSignatureSchema; -export class Commits extends BaseService { +export interface CommentSchema extends Record { + note: string; + line_type: 'new' | 'old'; + path: string; + line: number; + author: Omit; +} + +export interface CommitDiffSchema extends Record { + diff: string; + new_path: string; + old_path: string; + a_mode?: string; + b_mode: string; + new_file: boolean; + renamed_file: boolean; + deleted_file: boolean; +} + +export interface CommitStatusSchema extends Record { + status: string; + created_at: string; + started_at?: string; + name: string; + allow_failure: boolean; + author: Omit; + description?: string; + sha: string; + target_url: string; + finished_at?: string; + id: number; + ref: string; +} + +export interface CommitReferenceSchema extends Record { + type: 'branch' | 'tag' | 'all'; + name: string; +} + +export class Commits extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/commits`, options); + return RequestHelper.get()(this, `projects/${pId}/repository/commits`, options); } cherryPick(projectId: string | number, sha: string, branch: string, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/repository/commits/${sha}/cherry_pick`, { - branch, - ...options, - }); + return RequestHelper.post()( + this, + `projects/${pId}/repository/commits/${sha}/cherry_pick`, + { + branch, + ...options, + }, + ); } comments(projectId: string | number, sha: string, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/commits/${sha}/comments`, options); + return RequestHelper.get()( + this, + `projects/${pId}/repository/commits/${sha}/comments`, + options, + ); } create( @@ -122,7 +173,7 @@ export class Commits extends BaseService { ) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/repository/commits`, { + return RequestHelper.post()(this, `projects/${pId}/repository/commits`, { branch, commitMessage: message, actions, @@ -138,69 +189,93 @@ export class Commits extends BaseService { ) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/repository/commits/${sha}/comments`, { - note, - ...options, - }); + return RequestHelper.post()( + this, + `projects/${pId}/repository/commits/${sha}/comments`, + { + note, + ...options, + }, + ); } diff(projectId: string | number, sha: string, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/commits/${sha}/diff`, options); + return RequestHelper.get()( + this, + `projects/${pId}/repository/commits/${sha}/diff`, + options, + ); } editStatus(projectId: string | number, sha: string, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/statuses/${sha}`, options); + return RequestHelper.post()( + this, + `projects/${pId}/statuses/${sha}`, + options, + ); } references(projectId: string | number, sha: string, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/commits/${sha}/refs`, options); + return RequestHelper.get()( + this, + `projects/${pId}/repository/commits/${sha}/refs`, + options, + ); } revert(projectId: string | number, sha: string, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/repository/commits/${sha}/revert`, options); + return RequestHelper.post()( + this, + `projects/${pId}/repository/commits/${sha}/revert`, + options, + ); } show(projectId: string | number, sha: string, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/commits/${sha}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/repository/commits/${sha}`, + options, + ); } - status(projectId: string | number, sha: string, options?: BaseRequestOptions) { + statuses(projectId: string | number, sha: string, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/commits/${sha}/statuses`, options); + return RequestHelper.get()( + this, + `projects/${pId}/repository/commits/${sha}/statuses`, + options, + ); } mergeRequests(projectId: string | number, sha: string, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get( + return RequestHelper.get()( this, `projects/${pId}/repository/commits/${sha}/merge_requests`, options, ); } - signature( - projectId: string | number, - sha: string, - options?: BaseRequestOptions, - ): Promise { + signature(projectId: string | number, sha: string, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get( + return RequestHelper.get()( this, `projects/${pId}/repository/commits/${sha}/signature`, options, - ) as Promise; + ); } } diff --git a/packages/gitbeaker-core/src/services/ContainerRegistry.ts b/packages/gitbeaker-core/src/services/ContainerRegistry.ts index 11d7c172..f7482270 100644 --- a/packages/gitbeaker-core/src/services/ContainerRegistry.ts +++ b/packages/gitbeaker-core/src/services/ContainerRegistry.ts @@ -1,29 +1,80 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, PaginatedRequestOptions, Sudo } from '../infrastructure'; -export class ContainerRegistry extends BaseService { - repositories(projectId: string | number, options?: PaginatedRequestOptions) { +export interface TagSchema extends Record { + name: string; + path: string; + location: string; + revision: string; + short_revision: string; + digest: string; + created_at: string; + total_size: number; +} + +export interface RepositorySchema extends Record { + id: number; + name: string; + path: string; + project_id: number; + location: string; + created_at: string; + cleanup_policy_started_at: string; + tags_count?: number; + tags?: Pick[]; +} + +export class ContainerRegistry extends BaseService { + projectRepositories(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/registry/repositories`, options); + return RequestHelper.get[]>()( + this, + `projects/${pId}/registry/repositories`, + options, + ); + } + + groupRepositories(projectId: string | number, options?: PaginatedRequestOptions) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get[]>()( + this, + `groups/${pId}/registry/repositories`, + options, + ); + } + + showRepository(projectId: string | number, repositoryId: number, options?: Sudo) { + const [pId, rId] = [projectId, repositoryId].map(encodeURIComponent); + + return RequestHelper.get()( + this, + `projects/${pId}/registry/repositories/${rId}`, + options, + ); } tags(projectId: string | number, repositoryId: number, options?: PaginatedRequestOptions) { const [pId, rId] = [projectId, repositoryId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/registry/repositories/${rId}/tags`, options); + return RequestHelper.get[]>()( + this, + `projects/${pId}/registry/repositories/${rId}/tags`, + options, + ); } removeRepository(projectId: string | number, repositoryId: number, options?: Sudo) { const [pId, rId] = [projectId, repositoryId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/registry/repositories/${rId}`, options); + return RequestHelper.del()(this, `projects/${pId}/registry/repositories/${rId}`, options); } removeTag(projectId: string | number, repositoryId: number, tagName: string, options?: Sudo) { const [pId, rId, tId] = [projectId, repositoryId, tagName].map(encodeURIComponent); - return RequestHelper.del( + return RequestHelper.del()( this, `projects/${pId}/registry/repositories/${rId}/tags/${tId}`, options, @@ -38,7 +89,7 @@ export class ContainerRegistry extends BaseService { ) { const [pId, rId] = [projectId, repositoryId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/registry/repositories/${rId}/tags`, { + return RequestHelper.del()(this, `projects/${pId}/registry/repositories/${rId}/tags`, { nameRegexDelete, ...options, }); @@ -47,7 +98,7 @@ export class ContainerRegistry extends BaseService { showTag(projectId: string | number, repositoryId: number, tagName: string, options?: Sudo) { const [pId, rId, tId] = [projectId, repositoryId, tagName].map(encodeURIComponent); - return RequestHelper.get( + return RequestHelper.get()( this, `projects/${pId}/registry/repositories/${rId}/tags/${tId}`, options, diff --git a/packages/gitbeaker-core/src/services/DeployKeys.ts b/packages/gitbeaker-core/src/services/DeployKeys.ts index 5ab3ffc7..0326fe73 100644 --- a/packages/gitbeaker-core/src/services/DeployKeys.ts +++ b/packages/gitbeaker-core/src/services/DeployKeys.ts @@ -6,15 +6,23 @@ import { PaginatedRequestOptions, } from '../infrastructure'; -export class DeployKeys extends BaseService { +export interface DeployKey extends Record { + id: number; + title: string; + key: string; + can_push?: boolean; + created_at: string; +} + +export class DeployKeys extends BaseService { add(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/deploy_keys`, options); + return RequestHelper.post()(this, `projects/${pId}/deploy_keys`, options); } all({ projectId, ...options }: { projectId?: string | number } & PaginatedRequestOptions = {}) { - let url; + let url: string; if (projectId) { url = `projects/${encodeURIComponent(projectId)}/deploy_keys`; @@ -22,30 +30,34 @@ export class DeployKeys extends BaseService { url = 'deploy_keys'; } - return RequestHelper.get(this, url, options); + return RequestHelper.get[]>()(this, url, options); } - edit(projectId: string | number, keyId: string, options?: BaseRequestOptions) { + edit(projectId: string | number, keyId: number, options?: BaseRequestOptions) { const [pId, kId] = [projectId, keyId].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/deploy_keys/${kId}`, options); + return RequestHelper.put()(this, `projects/${pId}/deploy_keys/${kId}`, options); } - enable(projectId: string | number, keyId: string, options?: Sudo) { + enable(projectId: string | number, keyId: number, options?: Sudo) { const [pId, kId] = [projectId, keyId].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/deploy_keys/${kId}/enable`, options); + return RequestHelper.post>()( + this, + `projects/${pId}/deploy_keys/${kId}/enable`, + options, + ); } - remove(projectId: string | number, keyId: string, options?: Sudo) { + remove(projectId: string | number, keyId: number, options?: Sudo) { const [pId, kId] = [projectId, keyId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/deploy_keys/${kId}`, options); + return RequestHelper.del()(this, `projects/${pId}/deploy_keys/${kId}`, options); } - show(projectId: string | number, keyId: string, options?: Sudo) { + show(projectId: string | number, keyId: number, options?: Sudo) { const [pId, kId] = [projectId, keyId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/deploy_keys/${kId}`, options); + return RequestHelper.get()(this, `projects/${pId}/deploy_keys/${kId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/Deployments.ts b/packages/gitbeaker-core/src/services/Deployments.ts index dcdd605a..9f34a468 100644 --- a/packages/gitbeaker-core/src/services/Deployments.ts +++ b/packages/gitbeaker-core/src/services/Deployments.ts @@ -1,81 +1,98 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, PaginatedRequestOptions, Sudo } from '../infrastructure'; -import { CommitSchemaDefault, CommitSchemaCamelized } from './Commits'; -import { PipelineSchemaDefault, PipelineSchemaCamelized } from './Pipelines'; -import { UserSchemaDefault, UserSchemaCamelized } from './Users'; -import { RunnerSchemaDefault, RunnerSchemaCamelized } from './Runners'; +import { CommitSchema } from './Commits'; +import { PipelineSchema } from './Pipelines'; +import { UserSchema } from './Users'; +import { RunnerSchema } from './Runners'; +import { EnvironmentSchema } from './Environments'; +import { MergeRequestSchema } from './MergeRequests'; export type DeploymentStatus = 'created' | 'running' | 'success' | 'failed' | 'canceled'; -// Ref: https://docs.gitlab.com/12.6/ee/api/deployments.html#list-project-deployments -export interface DeploymentSchemaDefault { - id: number; - iid: number; - ref: string; - sha: string; - user: UserSchemaDefault; -} - -export interface DeploymentSchemaCamelized { - id: number; - iid: number; - ref: string; - sha: string; - user: UserSchemaCamelized; -} - -export interface DeployableDefault { +export interface DeployableSchema { id: number; ref: string; name: string; - runner?: RunnerSchemaDefault; + runner?: RunnerSchema; stage?: string; started_at?: Date; status?: DeploymentStatus; tag: boolean; - commit?: CommitSchemaDefault; + commit?: CommitSchema; coverage?: string; created_at?: Date; finished_at?: Date; - user?: UserSchemaDefault; - pipeline?: PipelineSchemaDefault; + user?: UserSchema; + pipeline?: PipelineSchema; } -export interface DeployableCamelized { +export type DeploymentSchema = { id: number; + iid: number; ref: string; - name: string; - runner?: RunnerSchemaCamelized; - stage?: string; - startedAt?: Date; - status?: DeploymentStatus; - tag: boolean; - commit?: CommitSchemaCamelized; - coverage?: string; - createdAt?: Date; - finishedAt?: Date; - user?: UserSchemaCamelized; - pipeline?: PipelineSchemaCamelized; -} + sha: string; + user: UserSchema; + created_at: string; + updated_at: string; + status: DeploymentStatus; + deployable: DeployableSchema; + environment: EnvironmentSchema; +}; -export type Deployable = DeployableDefault | DeployableCamelized; - -export class Deployments extends BaseService { +export class Deployments extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/deployments`, options); + return RequestHelper.get()(this, `projects/${pId}/deployments`, options); + } + + create( + projectId: string | number, + environment: string, + sha: string, + ref: string, + tag: string, + status: DeploymentStatus, + options?: Sudo, + ) { + const [pId] = [projectId].map(encodeURIComponent); + + return RequestHelper.post()(this, `projects/${pId}/deployments`, { + environment, + sha, + ref, + tag, + status, + ...options, + }); + } + + edit(projectId: string | number, deploymentId: number, status: DeploymentStatus, options?: Sudo) { + const [pId, dId] = [projectId, deploymentId].map(encodeURIComponent); + + return RequestHelper.put()(this, `projects/${pId}/deployments/${dId}`, { + status, + ...options, + }); } show(projectId: string | number, deploymentId: number, options?: Sudo) { const [pId, dId] = [projectId, deploymentId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/deployments/${dId}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/deployments/${dId}`, + options, + ); } mergeRequests(projectId: string | number, deploymentId: number, options?: Sudo) { const [pId, dId] = [projectId, deploymentId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/deployments/${dId}/merge_requests`, options); + return RequestHelper.get()( + this, + `projects/${pId}/deployments/${dId}/merge_requests`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/DockerfileTemplates.ts b/packages/gitbeaker-core/src/services/DockerfileTemplates.ts new file mode 100644 index 00000000..6795e222 --- /dev/null +++ b/packages/gitbeaker-core/src/services/DockerfileTemplates.ts @@ -0,0 +1,9 @@ +import { BaseServiceOptions } from '@gitbeaker/requester-utils'; +import { ResourceTemplates } from '../templates'; + +export class DockerfileTemplates extends ResourceTemplates { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ + super('dockerfiles', options); + } +} diff --git a/packages/gitbeaker-core/src/services/Environments.ts b/packages/gitbeaker-core/src/services/Environments.ts index 62dd5555..83f06bbc 100644 --- a/packages/gitbeaker-core/src/services/Environments.ts +++ b/packages/gitbeaker-core/src/services/Environments.ts @@ -5,92 +5,73 @@ import { RequestHelper, Sudo, } from '../infrastructure'; -import { - DeploymentSchemaDefault, - DeploymentSchemaCamelized, - DeployableDefault, - DeployableCamelized, -} from './Deployments'; -import { ProjectSchemaDefault, ProjectSchemaCamelized } from './Projects'; +import { DeploymentSchema, DeployableSchema } from './Deployments'; +import { ProjectSchema } from './Projects'; -export interface EnvironmentSchemaDefault { +export interface EnvironmentSchema extends Record { id: number; name: string; slug?: string; external_url?: string; - project?: ProjectSchemaDefault; + project?: ProjectSchema; state?: string; + last_deployment?: DeploymentSchema; + deployable?: DeployableSchema; } -export interface EnvironmentSchemaCamelized { - id: number; - name: string; - slug?: string; - externalUrl?: string; - project?: ProjectSchemaCamelized; - state?: string; -} - -// ref: https://docs.gitlab.com/12.6/ee/api/environments.html#list-environments -export type EnvironmentSchema = EnvironmentSchemaDefault | EnvironmentSchemaCamelized; - -export interface EnvironmentDetailSchemaDefault extends EnvironmentSchemaDefault { - last_deployment?: DeploymentSchemaDefault; - deployable?: DeployableDefault; -} - -export interface EnvironmentDetailSchemaCamelized extends EnvironmentSchemaCamelized { - lastDeployment?: DeploymentSchemaCamelized; - deployable?: DeployableCamelized; -} - -export type EnvironmentDetailSchema = - | EnvironmentDetailSchemaDefault - | EnvironmentDetailSchemaCamelized; - -export class Environments extends BaseService { - all(projectId: string | number, options?: PaginatedRequestOptions): Promise { +export class Environments extends BaseService { + all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/environments`, options) as Promise< - EnvironmentSchema[] - >; + return RequestHelper.get[]>()( + this, + `projects/${pId}/environments`, + options, + ); } - show( - projectId: string | number, - environmentId: number, - options?: Sudo, - ): Promise { + show(projectId: string | number, environmentId: number, options?: Sudo) { const [pId, eId] = [projectId, environmentId].map(encodeURIComponent); - return RequestHelper.get( + return RequestHelper.get()( this, `projects/${pId}/environments/${eId}`, options, - ) as Promise; + ); } create(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/environments`, options); + return RequestHelper.post>()( + this, + `projects/${pId}/environments`, + options, + ); } edit(projectId: string | number, environmentId: number, options?: BaseRequestOptions) { const [pId, eId] = [projectId, environmentId].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/environments/${eId}`, options); + return RequestHelper.put>()( + this, + `projects/${pId}/environments/${eId}`, + options, + ); } remove(projectId: string | number, environmentId: number, options?: Sudo) { const [pId, eId] = [projectId, environmentId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/environments/${eId}`, options); + return RequestHelper.del()(this, `projects/${pId}/environments/${eId}`, options); } stop(projectId: string | number, environmentId: number, options?: Sudo) { const [pId, eId] = [projectId, environmentId].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/environments/${eId}/stop`, options); + return RequestHelper.post>()( + this, + `projects/${pId}/environments/${eId}/stop`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/EpicDiscussions.ts b/packages/gitbeaker-core/src/services/EpicDiscussions.ts index 3d63a0ab..65e17210 100644 --- a/packages/gitbeaker-core/src/services/EpicDiscussions.ts +++ b/packages/gitbeaker-core/src/services/EpicDiscussions.ts @@ -1,53 +1,63 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceDiscussions } from '../templates'; -import { BaseRequestOptions, PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceDiscussions, DiscussionSchema } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface EpicDiscussions extends ResourceDiscussions { +export interface EpicDiscussions extends ResourceDiscussions { addNote( groupId: string | number, - epicId: string | number, - discussionId: string | number, + epicId: number, + discussionId: number, noteId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; - all(groupId: string | number, epicId: string | number, options?: PaginatedRequestOptions); + all( + groupId: string | number, + epicId: number, + options?: PaginatedRequestOptions, + ): Promise[]>; create( groupId: string | number, - epicId: string | number, + epicId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; editNote( groupId: string | number, - epicId: string | number, - discussionId: string | number, + epicId: number, + discussionId: number, noteId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; removeNote( groupId: string | number, - epicId: string | number, - discussionId: string | number, + epicId: number, + discussionId: number, noteId: number, options?: Sudo, - ); + ): Promise; show( groupId: string | number, - epicId: string | number, - discussionId: string | number, + epicId: number, + discussionId: number, options?: Sudo, - ); + ): Promise>; } -export class EpicDiscussions extends ResourceDiscussions { - constructor(options: BaseServiceOptions) { +export class EpicDiscussions extends ResourceDiscussions { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('groups', 'epics', options); } } diff --git a/packages/gitbeaker-core/src/services/EpicIssues.ts b/packages/gitbeaker-core/src/services/EpicIssues.ts index 2aa2e2b5..3e1232d1 100644 --- a/packages/gitbeaker-core/src/services/EpicIssues.ts +++ b/packages/gitbeaker-core/src/services/EpicIssues.ts @@ -1,4 +1,5 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { IssueSchema } from './Issues'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -6,28 +7,50 @@ import { Sudo, } from '../infrastructure'; -export class EpicIssues extends BaseService { - all(groupId: string | number, epicId: number, options?: PaginatedRequestOptions) { - const [gId, eId] = [groupId, epicId].map(encodeURIComponent); +export interface EpicIssueSchema + extends Omit { + epic_issue_id: number; +} - return RequestHelper.get(this, `groups/${gId}/epics/${eId}/issues`, options); +export class EpicIssues extends BaseService { + all(groupId: string | number, epicIId: number, options?: PaginatedRequestOptions) { + const [gId, eId] = [groupId, epicIId].map(encodeURIComponent); + + return RequestHelper.get()( + this, + `groups/${gId}/epics/${eId}/issues`, + options, + ); } - assign(groupId: string | number, epicId: number, issueId: number, options?: Sudo) { - const [gId, eId, iId] = [groupId, epicId, issueId].map(encodeURIComponent); + assign(groupId: string | number, epicIId: number, epicIssueId: number, options?: Sudo) { + const [gId, eId, iId] = [groupId, epicIId, epicIssueId].map(encodeURIComponent); - return RequestHelper.post(this, `groups/${gId}/epics/${eId}/issues/${iId}`, options); + return RequestHelper.post()( + this, + `groups/${gId}/epics/${eId}/issues/${iId}`, + options, + ); } - edit(groupId: string | number, epicId: number, issueId: number, options?: BaseRequestOptions) { - const [gId, eId, iId] = [groupId, epicId, issueId].map(encodeURIComponent); + edit( + groupId: string | number, + epicIId: number, + epicIssueId: number, + options?: BaseRequestOptions, + ) { + const [gId, eId, iId] = [groupId, epicIId, epicIssueId].map(encodeURIComponent); - return RequestHelper.put(this, `groups/${gId}/epics/${eId}/issues/${iId}`, options); + return RequestHelper.put()( + this, + `groups/${gId}/epics/${eId}/issues/${iId}`, + options, + ); } - remove(groupId: string | number, epicId: number, issueId: number, options?: Sudo) { - const [gId, eId, iId] = [groupId, epicId, issueId].map(encodeURIComponent); + remove(groupId: string | number, epicIId: number, epicIssueId: number, options?: Sudo) { + const [gId, eId, iId] = [groupId, epicIId, epicIssueId].map(encodeURIComponent); - return RequestHelper.del(this, `groups/${gId}/epics/${eId}/issues/${iId}`, options); + return RequestHelper.del()(this, `groups/${gId}/epics/${eId}/issues/${iId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/EpicNotes.ts b/packages/gitbeaker-core/src/services/EpicNotes.ts index 11acbd4d..3b9454a7 100644 --- a/packages/gitbeaker-core/src/services/EpicNotes.ts +++ b/packages/gitbeaker-core/src/services/EpicNotes.ts @@ -1,32 +1,52 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceNotes } from '../templates'; -import { PaginatedRequestOptions, BaseRequestOptions, Sudo } from '../infrastructure'; +import { ResourceNotes, NoteSchema } from '../templates'; +import { + PaginatedRequestOptions, + BaseRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface EpicNotes extends ResourceNotes { - all(groupId: string | number, epicId: string | number, options?: PaginatedRequestOptions); +export interface EpicNoteSchema extends NoteSchema { + file_name: string; + expires_at: string; +} + +export interface EpicNotes extends ResourceNotes { + all( + groupId: string | number, + epicId: number, + options?: PaginatedRequestOptions, + ): Promise[]>; create( groupId: string | number, - epicId: string | number, + epicId: number, body: string, options?: BaseRequestOptions, - ); + ): Promise>; edit( groupId: string | number, - epicId: string | number, + epicId: number, noteId: number, body: string, options?: BaseRequestOptions, - ); + ): Promise>; - remove(groupId: string | number, epicId: string | number, noteId: number, options?: Sudo); + remove(groupId: string | number, epicId: number, noteId: number, options?: Sudo): Promise; - show(groupId: string | number, epicId: string | number, noteId: number, options?: Sudo); + show( + groupId: string | number, + epicId: number, + noteId: number, + options?: Sudo, + ): Promise>; } -export class EpicNotes extends ResourceNotes { - constructor(options: BaseServiceOptions) { +export class EpicNotes extends ResourceNotes { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('groups', 'epics', options); } } diff --git a/packages/gitbeaker-core/src/services/Epics.ts b/packages/gitbeaker-core/src/services/Epics.ts index 559ec28e..11d74d5c 100644 --- a/packages/gitbeaker-core/src/services/Epics.ts +++ b/packages/gitbeaker-core/src/services/Epics.ts @@ -1,4 +1,5 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -6,34 +7,72 @@ import { Sudo, } from '../infrastructure'; -export class Epics extends BaseService { +export interface EpicSchema extends Record { + id: number; + iid: number; + group_id: number; + parent_id: number; + title: string; + description: string; + state: string; + confidential: string; + web_url: string; + reference: string; + references: { + short: string; + relative: string; + full: string; + }; + author: Omit; + start_date?: string; + start_date_is_fixed: boolean; + start_date_fixed?: string; + start_date_from_inherited_source?: string; + due_date: string; + due_date_is_fixed: boolean; + due_date_fixed?: string; + due_date_from_inherited_source: string; + created_at: string; + updated_at: string; + closed_at: string; + labels?: string[]; + upvotes: number; + downvotes: number; + _links: { + self: string; + epic_issues: string; + group: string; + }; +} + +export class Epics extends BaseService { all(groupId: string | number, options?: PaginatedRequestOptions) { const gId = encodeURIComponent(groupId); - return RequestHelper.get(this, `groups/${gId}/epics`, options); + return RequestHelper.get()(this, `groups/${gId}/epics`, options); } create(groupId: string | number, title: string, options?: BaseRequestOptions) { const gId = encodeURIComponent(groupId); - return RequestHelper.post(this, `groups/${gId}/epics`, { title, ...options }); + return RequestHelper.post()(this, `groups/${gId}/epics`, { title, ...options }); } edit(groupId: string | number, epicId: number, options?: BaseRequestOptions) { const [gId, eId] = [groupId, epicId].map(encodeURIComponent); - return RequestHelper.put(this, `groups/${gId}/epics/${eId}`, options); + return RequestHelper.put()(this, `groups/${gId}/epics/${eId}`, options); } remove(groupId: string | number, epicId: number, options?: Sudo) { const [gId, eId] = [groupId, epicId].map(encodeURIComponent); - return RequestHelper.del(this, `groups/${gId}/epics/${eId}`, options); + return RequestHelper.del()(this, `groups/${gId}/epics/${eId}`, options); } show(groupId: string | number, epicId: number, options?: Sudo) { const [gId, eId] = [groupId, epicId].map(encodeURIComponent); - return RequestHelper.get(this, `groups/${gId}/epics/${eId}`, options); + return RequestHelper.get()(this, `groups/${gId}/epics/${eId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/Events.ts b/packages/gitbeaker-core/src/services/Events.ts index 3ebca36d..57f265a4 100644 --- a/packages/gitbeaker-core/src/services/Events.ts +++ b/packages/gitbeaker-core/src/services/Events.ts @@ -1,4 +1,5 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; import { RequestHelper, PaginatedRequestOptions } from '../infrastructure'; export interface EventOptions { @@ -15,10 +16,41 @@ export interface EventOptions { | 'destroyed' | 'expired'; targetType?: 'issue' | 'milestone' | 'merge_request' | 'note' | 'project' | 'snippet' | 'user'; + before?: string; + after?: string; + scope?: string; + sort?: 'asc' | 'desc'; } -export class Events extends BaseService { - all(options?: PaginatedRequestOptions & EventOptions) { - return RequestHelper.get(this, 'events', options); +export interface EventSchema extends Record { + id: number; + title?: string; + project_id: number; + action_name: string; + target_id: number; + target_type: string; + author_id: number; + target_title: string; + created_at: string; + author: Omit; + author_username: string; +} + +export class Events extends BaseService { + all({ + projectId, + ...options + }: { projectId?: string | number } & PaginatedRequestOptions & EventOptions = {}) { + let url: string; + + if (projectId) { + const pId = encodeURIComponent(projectId); + + url = `projects/${pId}/events`; + } else { + url = 'events'; + } + + return RequestHelper.get()(this, url, options); } } diff --git a/packages/gitbeaker-core/src/services/FeatureFlags.ts b/packages/gitbeaker-core/src/services/FeatureFlags.ts index 984fbb3a..54abf81d 100644 --- a/packages/gitbeaker-core/src/services/FeatureFlags.ts +++ b/packages/gitbeaker-core/src/services/FeatureFlags.ts @@ -1,14 +1,87 @@ import { BaseService } from '@gitbeaker/requester-utils'; -import { BaseRequestOptions, PaginatedRequestOptions, RequestHelper } from '../infrastructure'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + RequestHelper, + Sudo, +} from '../infrastructure'; -export class FeatureFlags extends BaseService { - all(options?: PaginatedRequestOptions) { - return RequestHelper.get(this, 'features', options); +export interface ScopeSchema { + id: number; + environment_scope: string; +} +export interface StrategySchema { + id: number; + name: string; + parameters: { + user_ids: string; + }; + scopes?: ScopeSchema[]; +} + +export interface FeatureFlagSchema extends Record { + name: string; + description: string; + active: boolean; + version: string; + created_at: string; + updated_at: string; + scopes?: string[]; + strategies?: StrategySchema[]; +} + +export class FeatureFlags extends BaseService { + all( + projectId: string | number, + options: { scopes?: 'enabled' | 'disabled' } & PaginatedRequestOptions = {}, + ) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get()( + this, + `projects/${pId}/features_flags`, + options, + ); } - set(name: string, options?: BaseRequestOptions) { - const encodedName = encodeURIComponent(name); + create( + projectId: string | number, + flagName: string, + version: string, + options?: BaseRequestOptions, + ) { + const [pId, fName, ver] = [projectId, flagName, version].map(encodeURIComponent); - return RequestHelper.post(this, `features/${encodedName}`, options); + return RequestHelper.post()(this, `projects/${pId}/features_flags`, { + version: ver, + name: fName, + ...options, + }); + } + + edit(projectId: string | number, flagName: string, options?: BaseRequestOptions) { + const [pId, fName] = [projectId, flagName].map(encodeURIComponent); + + return RequestHelper.put()( + this, + `projects/${pId}/features_flags/${fName}`, + options, + ); + } + + remove(projectId: string | number, flagName: string, options?: Sudo) { + const [pId, fName] = [projectId, flagName].map(encodeURIComponent); + + return RequestHelper.del()(this, `projects/${pId}/features_flags/${fName}`, options); + } + + show(projectId: string | number, flagName: string, options?: Sudo) { + const [pId, fName] = [projectId, flagName].map(encodeURIComponent); + + return RequestHelper.get()( + this, + `projects/${pId}/features_flags/${fName}`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/FreezePeriods.ts b/packages/gitbeaker-core/src/services/FreezePeriods.ts index 6534cd50..fc379c17 100644 --- a/packages/gitbeaker-core/src/services/FreezePeriods.ts +++ b/packages/gitbeaker-core/src/services/FreezePeriods.ts @@ -1,38 +1,45 @@ import { BaseService } from '@gitbeaker/requester-utils'; -import { BaseRequestOptions, RequestHelper } from '../infrastructure'; +import { BaseRequestOptions, RequestHelper, Camelize } from '../infrastructure'; -export interface CreateFreezePeriodOptions { - cronTimezone?: string; +export interface FreezePeriodSchema extends Record { + id: number; + freeze_start: string; + freeze_end: string; + cron_timezone: string; + created_at: string; + updated_at: string; } -export interface EditFreezePeriodOptions { - cronTimezone?: string; - freezeStart?: string; - freezeEnd?: string; -} - -export class FreezePeriods extends BaseService { +export class FreezePeriods extends BaseService { all(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/freeze_periods`, options); + return RequestHelper.get()( + this, + `projects/${pId}/freeze_periods`, + options, + ); } show(projectId: string | number, freezePeriodId: number, options?: BaseRequestOptions) { const [pId, fId] = [projectId, freezePeriodId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/freeze_periods/${fId}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/freeze_periods/${fId}`, + options, + ); } create( projectId: number | string, freezeStart: string, freezeEnd: string, - options?: CreateFreezePeriodOptions & BaseRequestOptions, + options?: Camelize> & BaseRequestOptions, ) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/freeze_periods`, { + return RequestHelper.post()(this, `projects/${pId}/freeze_periods`, { freezeStart, freezeEnd, ...options, @@ -42,16 +49,21 @@ export class FreezePeriods extends BaseService { edit( projectId: number | string, freezePeriodId: number, - options?: EditFreezePeriodOptions & BaseRequestOptions, + options?: Camelize> & + BaseRequestOptions, ) { const [pId, fId] = [projectId, freezePeriodId].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/freeze_periods/${fId}`, options); + return RequestHelper.put()( + this, + `projects/${pId}/freeze_periods/${fId}`, + options, + ); } delete(projectId: number | string, freezePeriodId: number, options?: BaseRequestOptions) { const [pId, fId] = [projectId, freezePeriodId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/freeze_periods/${fId}`, options); + return RequestHelper.del()(this, `projects/${pId}/freeze_periods/${fId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/GeoNodes.ts b/packages/gitbeaker-core/src/services/GeoNodes.ts index 5c507ef7..45a9f75b 100644 --- a/packages/gitbeaker-core/src/services/GeoNodes.ts +++ b/packages/gitbeaker-core/src/services/GeoNodes.ts @@ -6,46 +6,185 @@ import { Sudo, } from '../infrastructure'; -export class GeoNodes extends BaseService { +export interface GeoNodeSchema extends Record { + id: number; + name: string; + url: string; + internal_url: string; + primary: boolean; + enabled: boolean; + current: boolean; + files_max_capacity: number; + repos_max_capacity: number; + verification_max_capacity: number; + selective_sync_type: string; + selective_sync_shards?: string[]; + selective_sync_namespace_ids?: number[]; + minimum_reverification_interval: number; + container_repositories_max_capacity: number; + sync_object_storage: boolean; + clone_protocol: string; + web_edit_url: string; + web_geo_projects_url: string; + _links: { + self: string; + status: string; + repair: string; + }; +} + +export interface GeoNodeFailureSchema extends Record { + project_id: number; + last_repository_synced_at: string; + last_repository_successful_sync_at: string; + last_wiki_synced_at: string; + last_wiki_successful_sync_at: string; + repository_retry_count?: number; + wiki_retry_count: number; + last_repository_sync_failure?: string; + last_wiki_sync_failure: string; + last_repository_verification_failure: string; + last_wiki_verification_failure: string; + repository_verification_checksum_sha: string; + wiki_verification_checksum_sha: string; + repository_checksum_mismatch: boolean; + wiki_checksum_mismatch: boolean; +} + +export interface GeoNodeStatusSchema extends Record { + geo_node_id: number; + healthy: boolean; + health: string; + health_status: string; + missing_oauth_application: boolean; + attachments_count: number; + attachments_synced_count?: number; + attachments_failed_count?: number; + attachments_synced_missing_on_primary_count: number; + attachments_synced_in_percentage: string; + db_replication_lag_seconds?: number; + lfs_objects_count: number; + lfs_objects_synced_count?: number; + lfs_objects_failed_count?: number; + lfs_objects_synced_missing_on_primary_count: number; + lfs_objects_synced_in_percentage: string; + job_artifacts_count: number; + job_artifacts_synced_count?: number; + job_artifacts_failed_count?: number; + job_artifacts_synced_missing_on_primary_count: number; + job_artifacts_synced_in_percentage: string; + container_repositories_count: number; + container_repositories_synced_count?: number; + container_repositories_failed_count?: number; + container_repositories_synced_in_percentage: string; + design_repositories_count: number; + design_repositories_synced_count?: number; + design_repositories_failed_count?: number; + design_repositories_synced_in_percentage: string; + projects_count: number; + repositories_count: number; + repositories_failed_count?: number; + repositories_synced_count?: number; + repositories_synced_in_percentage: string; + wikis_count: number; + wikis_failed_count?: number; + wikis_synced_count?: number; + wikis_synced_in_percentage: string; + replication_slots_count: number; + replication_slots_used_count: number; + replication_slots_used_in_percentage: string; + replication_slots_max_retained_wal_bytes: number; + repositories_checked_count: number; + repositories_checked_failed_count: number; + repositories_checked_in_percentage: string; + repositories_checksummed_count: number; + repositories_checksum_failed_count: number; + repositories_checksummed_in_percentage: string; + wikis_checksummed_count: number; + wikis_checksum_failed_count: number; + wikis_checksummed_in_percentage: string; + repositories_verified_count: number; + repositories_verification_failed_count: number; + repositories_verified_in_percentage: string; + repositories_checksum_mismatch_count: number; + wikis_verified_count: number; + wikis_verification_failed_count: number; + wikis_verified_in_percentage: string; + wikis_checksum_mismatch_count: number; + repositories_retrying_verification_count: number; + wikis_retrying_verification_count: number; + last_event_id: number; + last_event_timestamp: number; + cursor_last_event_id?: number; + cursor_last_event_timestamp: number; + last_successful_status_check_timestamp: number; + version: string; + revision: string; + package_files_count: number; + package_files_checksummed_count: number; + package_files_checksum_failed_count: number; + package_files_registry_count: number; + package_files_synced_count: number; + package_files_failed_count: number; + snippet_repositories_count: number; + snippet_repositories_checksummed_count: number; + snippet_repositories_checksum_failed_count: number; + snippet_repositories_registry_count: number; + snippet_repositories_synced_count: number; + snippet_repositories_failed_count: number; + group_wiki_repositories_checksummed_count: number; + group_wiki_repositories_checksum_failed_count: number; + group_wiki_repositories_registry_count: number; + group_wiki_repositories_synced_count: number; + group_wiki_repositories_failed_count: number; +} + +export class GeoNodes extends BaseService { all(options?: PaginatedRequestOptions) { - return RequestHelper.get(this, 'geo_nodes', options); + return RequestHelper.get()(this, 'geo_nodes', options); } create(geonodeId: number, options?: BaseRequestOptions) { const gId = encodeURIComponent(geonodeId); - return RequestHelper.post(this, `geo_nodes/${gId}`, options); + return RequestHelper.post()(this, `geo_nodes/${gId}`, options); } edit(geonodeId: number, options?: BaseRequestOptions) { const gId = encodeURIComponent(geonodeId); - return RequestHelper.put(this, `geo_nodes/${gId}`, options); + return RequestHelper.put()(this, `geo_nodes/${gId}`, options); } failures(options?: BaseRequestOptions) { - return RequestHelper.post(this, 'geo_nodes/current/failures', options); + return RequestHelper.get()(this, 'geo_nodes/current/failures', options); } repair(geonodeId: number, options?: Sudo) { const gId = encodeURIComponent(geonodeId); - return RequestHelper.del(this, `geo_nodes/${gId}`, options); + return RequestHelper.post()(this, `geo_nodes/${gId}/repair`, options); + } + + remove(geonodeId: number, options?: Sudo) { + const gId = encodeURIComponent(geonodeId); + + return RequestHelper.del()(this, `geo_nodes/${gId}`, options); } show(geonodeId: number, options?: Sudo) { const gId = encodeURIComponent(geonodeId); - return RequestHelper.get(this, `geo_nodes/${gId}`, options); + return RequestHelper.get()(this, `geo_nodes/${gId}`, options); } status(geonodeId: number, options?: Sudo) { const gId = encodeURIComponent(geonodeId); - return RequestHelper.get(this, `geo_nodes/${gId}/status`, options); + return RequestHelper.get()(this, `geo_nodes/${gId}/status`, options); } statuses(options?: PaginatedRequestOptions) { - return RequestHelper.get(this, 'geo_nodes/statuses', options); + return RequestHelper.get()(this, 'geo_nodes/statuses', options); } } diff --git a/packages/gitbeaker-core/src/services/GitLabCIYMLTemplates.ts b/packages/gitbeaker-core/src/services/GitLabCIYMLTemplates.ts index 3be00568..d93f2b0d 100644 --- a/packages/gitbeaker-core/src/services/GitLabCIYMLTemplates.ts +++ b/packages/gitbeaker-core/src/services/GitLabCIYMLTemplates.ts @@ -1,8 +1,9 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; import { ResourceTemplates } from '../templates'; -export class GitLabCIYMLTemplates extends ResourceTemplates { - constructor(options: BaseServiceOptions) { +export class GitLabCIYMLTemplates extends ResourceTemplates { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('gitlab_ci_ymls', options); } } diff --git a/packages/gitbeaker-core/src/services/GitignoreTemplates.ts b/packages/gitbeaker-core/src/services/GitignoreTemplates.ts index 92769214..e0d852b1 100644 --- a/packages/gitbeaker-core/src/services/GitignoreTemplates.ts +++ b/packages/gitbeaker-core/src/services/GitignoreTemplates.ts @@ -1,8 +1,9 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; import { ResourceTemplates } from '../templates'; -export class GitignoreTemplates extends ResourceTemplates { - constructor(options: BaseServiceOptions) { +export class GitignoreTemplates extends ResourceTemplates { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('gitignores', options); } } diff --git a/packages/gitbeaker-core/src/services/GroupAccessRequests.ts b/packages/gitbeaker-core/src/services/GroupAccessRequests.ts index 6c697bae..d8d8cacb 100644 --- a/packages/gitbeaker-core/src/services/GroupAccessRequests.ts +++ b/packages/gitbeaker-core/src/services/GroupAccessRequests.ts @@ -1,8 +1,24 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceAccessRequests } from '../templates'; +import { ResourceAccessRequests, AccessRequestSchema, AccessLevel } from '../templates'; +import { Sudo, CamelizedRecord } from '../infrastructure'; -export class GroupAccessRequests extends ResourceAccessRequests { - constructor(options: BaseServiceOptions) { +export interface GroupAccessRequests extends ResourceAccessRequests { + all(groupId: string | number): Promise[]>; + + request(groupId: string | number): Promise>; + + approve( + groupId: string | number, + userId: number, + options?: { accessLevel?: AccessLevel } & Sudo, + ): Promise>; + + deny(groupId: string | number, userId: number): Promise; +} + +export class GroupAccessRequests extends ResourceAccessRequests { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('groups', options); } } diff --git a/packages/gitbeaker-core/src/services/GroupBadges.ts b/packages/gitbeaker-core/src/services/GroupBadges.ts index fc8c787d..910d0cdd 100644 --- a/packages/gitbeaker-core/src/services/GroupBadges.ts +++ b/packages/gitbeaker-core/src/services/GroupBadges.ts @@ -1,23 +1,52 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceBadges } from '../templates'; -import { BaseRequestOptions, PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceBadges, BadgeSchema } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface GroupBadges extends ResourceBadges { - add(groupId: string | number, options?: BaseRequestOptions); - - all(groupId: string | number, options?: PaginatedRequestOptions); - - edit(groupId: string | number, badgeId: number, options?: BaseRequestOptions); - - preview(groupId: string | number, linkUrl: string, imageUrl: string, options?: Sudo); - - remove(groupId: string | number, badgeId: number, options?: Sudo); - - show(groupId: string | number, badgeId: number, options?: Sudo); +export interface GroupBadgeSchema extends BadgeSchema { + kind: 'group'; } -export class GroupBadges extends ResourceBadges { - constructor(options: BaseServiceOptions) { +export interface GroupBadges extends ResourceBadges { + add( + groupId: string | number, + options?: BaseRequestOptions, + ): Promise>; + + all( + groupId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; + + edit( + groupId: string | number, + badgeId: number, + options?: BaseRequestOptions, + ): Promise>; + + preview( + groupId: string | number, + linkUrl: string, + imageUrl: string, + options?: Sudo, + ): Promise>>; + + remove(groupId: string | number, badgeId: number, options?: Sudo): Promise; + + show( + groupId: string | number, + badgeId: number, + options?: Sudo, + ): Promise>; +} + +export class GroupBadges extends ResourceBadges { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('groups', options); } } diff --git a/packages/gitbeaker-core/src/services/GroupCustomAttributes.ts b/packages/gitbeaker-core/src/services/GroupCustomAttributes.ts index 3c13f692..9693ddd0 100644 --- a/packages/gitbeaker-core/src/services/GroupCustomAttributes.ts +++ b/packages/gitbeaker-core/src/services/GroupCustomAttributes.ts @@ -1,19 +1,33 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceCustomAttributes } from '../templates'; -import { PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceCustomAttributes, CustomAttributeSchema } from '../templates'; +import { PaginatedRequestOptions, Sudo, CamelizedRecord } from '../infrastructure'; -export interface GroupCustomAttributes extends ResourceCustomAttributes { - all(groupId: string | number, options?: PaginatedRequestOptions); +export interface GroupCustomAttributes + extends ResourceCustomAttributes { + all( + groupId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; - set(groupId: string | number, customAttributeId: number, value: string, options?: Sudo); + set( + groupId: string | number, + customAttributeId: number, + value: string, + options?: Sudo, + ): Promise>; - remove(groupId: string | number, customAttributeId: number, options?: Sudo); + remove(groupId: string | number, customAttributeId: number, options?: Sudo): Promise; - show(groupId: string | number, customAttributeId: number, options?: Sudo); + show( + groupId: string | number, + customAttributeId: number, + options?: Sudo, + ): Promise>; } -export class GroupCustomAttributes extends ResourceCustomAttributes { - constructor(options: BaseServiceOptions) { +export class GroupCustomAttributes extends ResourceCustomAttributes { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('groups', options); } } diff --git a/packages/gitbeaker-core/src/services/GroupDeployTokens.ts b/packages/gitbeaker-core/src/services/GroupDeployTokens.ts index 34c065c1..c3c72f21 100644 --- a/packages/gitbeaker-core/src/services/GroupDeployTokens.ts +++ b/packages/gitbeaker-core/src/services/GroupDeployTokens.ts @@ -1,8 +1,33 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceDeployTokens } from '../templates'; +import { ResourceDeployTokens, DeployTokenScope, DeployTokenSchema } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + CamelizedRecord, + Sudo, +} from '../infrastructure'; -export class GroupDeployTokens extends ResourceDeployTokens { - constructor(options: BaseServiceOptions = {}) { +export interface GroupDeployTokens extends ResourceDeployTokens { + add( + groupId: string | number, + tokenName: string, + tokenScopes: DeployTokenScope[], + options?: BaseRequestOptions, + ): Promise>; + + all({ + groupId, + ...options + }: { groupId?: string | number } & PaginatedRequestOptions): Promise< + CamelizedRecord[] + >; + + remove(groupId: string | number, tokenId: number, options?: Sudo): Promise; +} + +export class GroupDeployTokens extends ResourceDeployTokens { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('groups', options); } } diff --git a/packages/gitbeaker-core/src/services/GroupIssueBoards.ts b/packages/gitbeaker-core/src/services/GroupIssueBoards.ts index 4c1fecb1..380fb613 100644 --- a/packages/gitbeaker-core/src/services/GroupIssueBoards.ts +++ b/packages/gitbeaker-core/src/services/GroupIssueBoards.ts @@ -1,15 +1,41 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceIssueBoards } from '../templates'; -import { BaseRequestOptions, PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { GroupSchema } from './Groups'; +import { ResourceIssueBoards, IssueBoardSchema, IssueBoardListSchema } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface GroupIssueBoards extends ResourceIssueBoards { - all(groupId: string | number, options?: PaginatedRequestOptions); +export interface GroupIssueBoardSchema extends IssueBoardSchema { + group: Pick; +} - create(groupId: string | number, name: string, options?: Sudo); +export interface GroupIssueBoards extends ResourceIssueBoards { + all( + groupId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; - createList(groupId: string | number, boardId: number, labelId: number, options?: Sudo); + create( + groupId: string | number, + name: string, + options?: Sudo, + ): Promise>; - edit(groupId: string | number, boardId: number, options?: BaseRequestOptions); + createList( + groupId: string | number, + boardId: number, + labelId: number | string, + options?: Sudo, + ): Promise>; + + edit( + groupId: string | number, + boardId: number, + options?: BaseRequestOptions, + ): Promise>; editList( groupId: string | number, @@ -17,21 +43,40 @@ export interface GroupIssueBoards extends ResourceIssueBoards { listId: number, position: number, options?: Sudo, - ); + ): Promise>; - lists(groupId: string | number, boardId: number, options?: Sudo); + lists( + groupId: string | number, + boardId: number, + options?: Sudo, + ): Promise[]>; - remove(groupId: string | number, boardId: number, options?: Sudo); + remove(groupId: string | number, boardId: number, options?: Sudo): Promise; - removeList(groupId: string | number, boardId: number, listId: number, options?: Sudo); + removeList( + groupId: string | number, + boardId: number, + listId: number, + options?: Sudo, + ): Promise; - show(groupId: string | number, boardId: number, options?: Sudo); + show( + groupId: string | number, + boardId: number, + options?: Sudo, + ): Promise>; - showList(groupId: string | number, boardId: number, listId: number, options?: Sudo); + showList( + groupId: string | number, + boardId: number, + listId: number, + options?: Sudo, + ): Promise>; } -export class GroupIssueBoards extends ResourceIssueBoards { - constructor(options: BaseServiceOptions = {}) { +export class GroupIssueBoards extends ResourceIssueBoards { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('groups', options); } } diff --git a/packages/gitbeaker-core/src/services/GroupLabels.ts b/packages/gitbeaker-core/src/services/GroupLabels.ts index 78bd9162..1eac609a 100644 --- a/packages/gitbeaker-core/src/services/GroupLabels.ts +++ b/packages/gitbeaker-core/src/services/GroupLabels.ts @@ -1,23 +1,49 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { BaseRequestOptions, PaginatedRequestOptions, Sudo } from '../infrastructure'; -import { ResourceLabels } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + CamelizedRecord, + Sudo, +} from '../infrastructure'; +import { ResourceLabels, LabelSchema } from '../templates'; -export interface GroupLabels extends ResourceLabels { - all(groupId: string | number, options?: PaginatedRequestOptions); +export interface GroupLabels extends ResourceLabels { + all( + groupId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; - create(groupId: string | number, labelName: string, color: string, options?: BaseRequestOptions); + create( + groupId: string | number, + labelName: string, + color: string, + options?: BaseRequestOptions, + ): Promise>; - edit(groupId: string | number, labelName: string, options?: BaseRequestOptions); + edit( + groupId: string | number, + labelId: number | string, + options?: BaseRequestOptions, + ): Promise>; - remove(groupId: string | number, labelName: string, options?: Sudo); + remove(groupId: string | number, labelId: number | string, options?: Sudo): Promise; - subscribe(groupId: string | number, labelId: number, options?: Sudo); + subscribe( + groupId: string | number, + labelId: number | string, + options?: Sudo, + ): Promise>; - unsubscribe(groupId: string | number, labelId: number, options?: Sudo); + unsubscribe( + groupId: string | number, + labelId: number | string, + options?: Sudo, + ): Promise>; } -export class GroupLabels extends ResourceLabels { - constructor(options: BaseServiceOptions = {}) { +export class GroupLabels extends ResourceLabels { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('groups', options); } } diff --git a/packages/gitbeaker-core/src/services/GroupMembers.ts b/packages/gitbeaker-core/src/services/GroupMembers.ts index 9d8c1050..9555dab5 100644 --- a/packages/gitbeaker-core/src/services/GroupMembers.ts +++ b/packages/gitbeaker-core/src/services/GroupMembers.ts @@ -1,8 +1,44 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceMembers } from '../templates'; +import { ResourceMembers, MembersSchema, IncludeInherited, AccessLevel } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + CamelizedRecord, + Sudo, +} from '../infrastructure'; -export class GroupMembers extends ResourceMembers { - constructor(options: BaseServiceOptions = {}) { +export interface GroupMembers extends ResourceMembers { + add( + groupId: string | number, + userId: number, + accessLevel: AccessLevel, + options?: BaseRequestOptions, + ): Promise>; + + all( + groupId: string | number, + options?: IncludeInherited & PaginatedRequestOptions, + ): Promise[]>; + + edit( + groupId: string | number, + userId: number, + accessLevel: AccessLevel, + options?: BaseRequestOptions, + ): Promise>; + + show( + groupId: string | number, + userId: number, + options?: IncludeInherited & Sudo, + ): Promise>; + + remove(groupId: string | number, userId: number, options?: Sudo): Promise; +} + +export class GroupMembers extends ResourceMembers { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('groups', options); } } diff --git a/packages/gitbeaker-core/src/services/GroupMilestones.ts b/packages/gitbeaker-core/src/services/GroupMilestones.ts index fe84dc4e..92634f05 100644 --- a/packages/gitbeaker-core/src/services/GroupMilestones.ts +++ b/packages/gitbeaker-core/src/services/GroupMilestones.ts @@ -1,23 +1,54 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceMilestones } from '../templates'; -import { PaginatedRequestOptions, BaseRequestOptions, Sudo } from '../infrastructure'; +import { ResourceMilestones, MilestoneSchema } from '../templates'; +import { + PaginatedRequestOptions, + BaseRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; +import type { IssueSchema } from './Issues'; +import type { MergeRequestSchema } from './MergeRequests'; -export interface GroupMilestones extends ResourceMilestones { - all(groupId: string | number, options?: PaginatedRequestOptions); +export interface GroupMilestones extends ResourceMilestones { + all( + groupId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; - create(groupId: string | number, title: string, options?: BaseRequestOptions); + create( + groupId: string | number, + title: string, + options?: BaseRequestOptions, + ): Promise>; - edit(groupId: string | number, milestoneId: number, options?: BaseRequestOptions); + edit( + groupId: string | number, + milestoneId: number, + options?: BaseRequestOptions, + ): Promise>; - issues(groupId: string | number, milestoneId: number, options?: Sudo); + issues( + groupId: string | number, + milestoneId: number, + options?: Sudo, + ): Promise[]>; - mergeRequests(groupId: string | number, milestoneId: number, options?: Sudo); + mergeRequests( + groupId: string | number, + milestoneId: number, + options?: Sudo, + ): Promise[]>; - show(groupId: string | number, milestoneId: number, options?: Sudo); + show( + groupId: string | number, + milestoneId: number, + options?: Sudo, + ): Promise>; } -export class GroupMilestones extends ResourceMilestones { - constructor(options: BaseServiceOptions = {}) { +export class GroupMilestones extends ResourceMilestones { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('groups', options); } } diff --git a/packages/gitbeaker-core/src/services/GroupProjects.ts b/packages/gitbeaker-core/src/services/GroupProjects.ts deleted file mode 100644 index 81764df2..00000000 --- a/packages/gitbeaker-core/src/services/GroupProjects.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { BaseService } from '@gitbeaker/requester-utils'; -import { BaseRequestOptions, PaginatedRequestOptions, RequestHelper } from '../infrastructure'; -import { ProjectSchema } from './Projects'; - -export class GroupProjects extends BaseService { - all(groupId: string | number, options?: PaginatedRequestOptions): Promise { - const gId = encodeURIComponent(groupId); - - return RequestHelper.get(this, `groups/${gId}/projects`, options) as Promise; - } - - add(groupId: string | number, projectId: string | number, options?: BaseRequestOptions) { - const [gId, pId] = [groupId, projectId].map(encodeURIComponent); - - return RequestHelper.post(this, `groups/${gId}/projects/${pId}`, options); - } -} diff --git a/packages/gitbeaker-core/src/services/GroupRunners.ts b/packages/gitbeaker-core/src/services/GroupRunners.ts index eb1e1b73..52a52f3c 100644 --- a/packages/gitbeaker-core/src/services/GroupRunners.ts +++ b/packages/gitbeaker-core/src/services/GroupRunners.ts @@ -1,11 +1,11 @@ import { BaseService } from '@gitbeaker/requester-utils'; -import { PaginatedRequestOptions, RequestHelper } from '../infrastructure'; +import { PaginatedRequestOptions, ShowExpanded, RequestHelper } from '../infrastructure'; import { RunnerSchema } from './Runners'; -export class GroupRunners extends BaseService { - all(groupId: string | number, options?: PaginatedRequestOptions): Promise { +export class GroupRunners extends BaseService { + all(groupId: string | number, options?: PaginatedRequestOptions & ShowExpanded) { const gId = encodeURIComponent(groupId); - return RequestHelper.get(this, `groups/${gId}/runners`, options) as Promise; + return RequestHelper.get()(this, `groups/${gId}/runners`, options); } } diff --git a/packages/gitbeaker-core/src/services/GroupVariables.ts b/packages/gitbeaker-core/src/services/GroupVariables.ts index 1f34e4e7..594c117d 100644 --- a/packages/gitbeaker-core/src/services/GroupVariables.ts +++ b/packages/gitbeaker-core/src/services/GroupVariables.ts @@ -1,28 +1,36 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; import { ResourceVariables, ResourceVariableSchema } from '../templates'; -import { PaginatedRequestOptions, BaseRequestOptions } from '../infrastructure'; +import { PaginatedRequestOptions, BaseRequestOptions, CamelizedRecord } from '../infrastructure'; -export interface GroupVariables extends ResourceVariables { +export interface GroupVariables extends ResourceVariables { all( groupId: string | number, options?: PaginatedRequestOptions, - ): Promise; + ): Promise[]>; - create(groupId: string | number, options?: BaseRequestOptions); + create( + groupId: string | number, + options?: BaseRequestOptions, + ): Promise>; - edit(groupId: string | number, keyId: string, options?: BaseRequestOptions); + edit( + groupId: string | number, + key: string, + options?: BaseRequestOptions, + ): Promise>; show( groupId: string | number, - keyId: string, + key: string, options?: PaginatedRequestOptions, - ): Promise; + ): Promise>; - remove(groupId: string | number, keyId: string, options?: PaginatedRequestOptions); + remove(groupId: string | number, key: string, options?: PaginatedRequestOptions): Promise; } -export class GroupVariables extends ResourceVariables { - constructor(options: BaseServiceOptions = {}) { +export class GroupVariables extends ResourceVariables { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('groups', options); } } diff --git a/packages/gitbeaker-core/src/services/Groups.ts b/packages/gitbeaker-core/src/services/Groups.ts index 6abd6137..b4950fbd 100644 --- a/packages/gitbeaker-core/src/services/Groups.ts +++ b/packages/gitbeaker-core/src/services/Groups.ts @@ -2,13 +2,13 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { BaseRequestOptions, PaginatedRequestOptions, + ShowExpanded, RequestHelper, Sudo, - ShowExpanded, } from '../infrastructure'; import { ProjectSchema } from './Projects'; -export interface GroupSchemaDefault { +export interface GroupSchema extends Record { id: number; name: string; path: string; @@ -18,45 +18,65 @@ export interface GroupSchemaDefault { visibility: string; avatar_url: string; web_url: string; + description: string; + share_with_group_lock: boolean; + require_two_factor_authentication: boolean; + two_factor_grace_period: number; + project_creation_level: string; + auto_devops_enabled: boolean; + subgroup_creation_level: string; + emails_disabled: boolean; + mentions_disabled: boolean; + lfs_enabled: boolean; + default_branch_protection: number; + request_access_enabled: boolean; + file_template_project_id: number; + created_at: string; } -export interface GroupSchemaCamelized { +export type GroupDetailSchema = { id: number; name: string; path: string; - fullName: string; - fullPath: string; - parentId: number; + full_name: string; + full_path: string; + parent_id: number; visibility: string; - avatarUrl: string; - webUrl: string; -} - -export type GroupSchema = GroupSchemaDefault | GroupSchemaCamelized; - -export type GroupDetailSchema = GroupSchema & { - projects: ProjectSchema[]; + avatar_url: string; + web_url: string; + description: string; + request_access_enabled: boolean; + file_template_project_id: number; + runners_token: string; + shared_with_groups: { + group_id: number; + group_name: string; + group_full_path: string; + group_access_level: number; + expires_at: string; + }[]; + created_at: string; }; -export class Groups extends BaseService { - all(options?: PaginatedRequestOptions): Promise { - return RequestHelper.get(this, 'groups', options) as Promise; +export class Groups extends BaseService { + all(options?: PaginatedRequestOptions) { + return RequestHelper.get()(this, 'groups', options); } - create(name: string, path: string, options?: BaseRequestOptions & ShowExpanded) { - return RequestHelper.post(this, 'groups', { name, path, ...options }); + create(name: string, path: string, options?: BaseRequestOptions) { + return RequestHelper.post()(this, 'groups', { name, path, ...options }); } createLDAPLink( groupId: string | number, - cn, - groupAccess, + cn: string, + groupAccess: number, provider: string, options?: Sudo & ShowExpanded, ) { const gId = encodeURIComponent(groupId); - return RequestHelper.post(this, `groups/${gId}/ldap_group_links`, { + return RequestHelper.post()(this, `groups/${gId}/ldap_group_links`, { cn, groupAccess, provider, @@ -64,63 +84,71 @@ export class Groups extends BaseService { }); } - edit(groupId: string | number, options?: BaseRequestOptions & ShowExpanded) { + edit(groupId: string | number, options?: BaseRequestOptions) { const gId = encodeURIComponent(groupId); - return RequestHelper.put(this, `groups/${gId}`, options); + return RequestHelper.put()(this, `groups/${gId}`, options); } - projects(groupId: string | number, options?: BaseRequestOptions): Promise { + projects(groupId: string | number, options?: BaseRequestOptions) { const gId = encodeURIComponent(groupId); - return RequestHelper.get(this, `groups/${gId}/projects`, options) as Promise< - ProjectSchema[] - >; + return RequestHelper.get()(this, `groups/${gId}/projects`, options); } remove(groupId: string | number, options?: Sudo & ShowExpanded) { const gId = encodeURIComponent(groupId); - return RequestHelper.del(this, `groups/${gId}`, options); + return RequestHelper.del()(this, `groups/${gId}`, options); } removeLDAPLink( groupId: string | number, - cn, + cn: string, { provider, ...options }: Sudo & ShowExpanded & { provider?: string } = {}, ) { const gId = encodeURIComponent(groupId); const url = provider ? `${provider}/${cn}` : `${cn}`; - return RequestHelper.del(this, `groups/${gId}/ldap_group_links/${url}`, options); + return RequestHelper.del()( + this, + `groups/${gId}/ldap_group_links/${url}`, + options as Record, + ); } search(nameOrPath: string, options?: Sudo) { - return RequestHelper.get(this, 'groups', { + return RequestHelper.get()(this, 'groups', { search: nameOrPath, ...options, }); } - show(groupId: string | number, options?: BaseRequestOptions): Promise { + show(groupId: string | number, options?: BaseRequestOptions) { const gId = encodeURIComponent(groupId); - return RequestHelper.get( - this, - `groups/${gId}`, - options, - ) as Promise; + return RequestHelper.get()(this, `groups/${gId}`, options); } subgroups(groupId: string | number, options?: PaginatedRequestOptions) { const gId = encodeURIComponent(groupId); - return RequestHelper.get(this, `groups/${gId}/subgroups`, options); + return RequestHelper.get()(this, `groups/${gId}/subgroups`, options); } syncLDAP(groupId: string | number, options?: Sudo & ShowExpanded) { const gId = encodeURIComponent(groupId); - return RequestHelper.post(this, `groups/${gId}/ldap_sync`, options); + return RequestHelper.post()(this, `groups/${gId}/ldap_sync`, options); + } + + transferProject( + groupId: string | number, + projectId: string | number, + options?: BaseRequestOptions & ShowExpanded, + ) { + const [gId, pId] = [groupId, projectId].map(encodeURIComponent); + + return RequestHelper.post()(this, `groups/${gId}/projects/${pId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/IssueAwardEmojis.ts b/packages/gitbeaker-core/src/services/IssueAwardEmojis.ts index 45cde7eb..f8752f67 100644 --- a/packages/gitbeaker-core/src/services/IssueAwardEmojis.ts +++ b/packages/gitbeaker-core/src/services/IssueAwardEmojis.ts @@ -1,42 +1,39 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceAwardEmojis } from '../templates'; -import { PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceAwardEmojis, AwardEmojiSchema } from '../templates'; +import { PaginatedRequestOptions, Sudo, CamelizedRecord } from '../infrastructure'; -export interface IssueAwardEmojis extends ResourceAwardEmojis { +export interface IssueAwardEmojis extends ResourceAwardEmojis { all( projectId: string | number, - issueId: string | number, - noteId: number, + issueIId: number, options?: PaginatedRequestOptions, - ); + ): Promise[]>; award( projectId: string | number, - issueId: string | number, - noteId: number, + issueIId: number, name: string, options?: Sudo, - ); + ): Promise>; remove( projectId: string | number, - issueId: string | number, + issueIId: number, awardId: number, - noteId: number, options?: Sudo, - ); + ): Promise; show( projectId: string | number, - issueId: string | number, + issueIId: number, awardId: number, - noteId: number, options?: Sudo, - ); + ): Promise>; } -export class IssueAwardEmojis extends ResourceAwardEmojis { - constructor(options: BaseServiceOptions = {}) { +export class IssueAwardEmojis extends ResourceAwardEmojis { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('issues', options); } } diff --git a/packages/gitbeaker-core/src/services/IssueDiscussions.ts b/packages/gitbeaker-core/src/services/IssueDiscussions.ts index 3a600acb..e61829c0 100644 --- a/packages/gitbeaker-core/src/services/IssueDiscussions.ts +++ b/packages/gitbeaker-core/src/services/IssueDiscussions.ts @@ -1,53 +1,63 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceDiscussions } from '../templates'; -import { BaseRequestOptions, PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceDiscussions, DiscussionSchema } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface IssueDiscussions extends ResourceDiscussions { +export interface IssueDiscussions extends ResourceDiscussions { addNote( projectId: string | number, - issueId: string | number, - discussionId: string | number, + issueIId: number, + discussionId: number, noteId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; - all(projectId: string | number, issueId: string | number, options?: PaginatedRequestOptions); + all( + projectId: string | number, + issueIId: number, + options?: PaginatedRequestOptions, + ): Promise[]>; create( projectId: string | number, - issueId: string | number, + issueIId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; editNote( projectId: string | number, - issueId: string | number, - discussionId: string | number, + issueIId: number, + discussionId: number, noteId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; removeNote( projectId: string | number, - issueId: string | number, - discussionId: string | number, + issueIId: number, + discussionId: number, noteId: number, options?: Sudo, - ); + ): Promise; show( projectId: string | number, - issueId: string | number, - discussionId: string | number, + issueIId: number, + discussionId: number, options?: Sudo, - ); + ): Promise>; } -export class IssueDiscussions extends ResourceDiscussions { - constructor(options: BaseServiceOptions = {}) { +export class IssueDiscussions extends ResourceDiscussions { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', 'issues', options); } } diff --git a/packages/gitbeaker-core/src/services/IssueNoteAwardEmojis.ts b/packages/gitbeaker-core/src/services/IssueNoteAwardEmojis.ts new file mode 100644 index 00000000..eeaf3a36 --- /dev/null +++ b/packages/gitbeaker-core/src/services/IssueNoteAwardEmojis.ts @@ -0,0 +1,44 @@ +import { BaseServiceOptions } from '@gitbeaker/requester-utils'; +import { ResourceNoteAwardEmojis, AwardEmojiSchema } from '../templates'; +import { PaginatedRequestOptions, CamelizedRecord, Sudo } from '../infrastructure'; + +export interface IssueNoteAwardEmojis + extends ResourceNoteAwardEmojis { + all( + projectId: string | number, + issueIId: number, + noteId: number, + options?: PaginatedRequestOptions, + ): Promise[]>; + + award( + projectId: string | number, + issueIId: number, + noteId: number, + name: string, + options?: Sudo, + ): Promise>; + + remove( + projectId: string | number, + issueIId: number, + noteId: number, + awardId: number, + options?: Sudo, + ): Promise; + + show( + projectId: string | number, + issueIId: number, + noteId: number, + awardId: number, + options?: Sudo, + ): Promise>; +} + +export class IssueNoteAwardEmojis extends ResourceNoteAwardEmojis { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ + super('issues', options); + } +} diff --git a/packages/gitbeaker-core/src/services/IssueNotes.ts b/packages/gitbeaker-core/src/services/IssueNotes.ts index 942ed060..1123ed78 100644 --- a/packages/gitbeaker-core/src/services/IssueNotes.ts +++ b/packages/gitbeaker-core/src/services/IssueNotes.ts @@ -1,32 +1,61 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceNotes } from '../templates'; -import { PaginatedRequestOptions, BaseRequestOptions, Sudo } from '../infrastructure'; +import { ResourceNotes, NoteSchema } from '../templates'; +import { + PaginatedRequestOptions, + BaseRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface IssueNotes extends ResourceNotes { - all(projectId: string | number, issueId: string | number, options?: PaginatedRequestOptions); +export interface IssueNoteSchema extends NoteSchema { + attachment?: string; + system: boolean; + noteable_id: number; + noteable_type: string; + noteable_iid: number; + resolvable: boolean; +} + +export interface IssueNotes extends ResourceNotes { + all( + projectId: string | number, + issueIId: number, + options?: PaginatedRequestOptions, + ): Promise[]>; create( projectId: string | number, - issueId: string | number, + issueIId: number, body: string, options?: BaseRequestOptions, - ); + ): Promise>; edit( projectId: string | number, - issueId: string | number, + issueIId: number, noteId: number, body: string, options?: BaseRequestOptions, - ); + ): Promise>; - remove(projectId: string | number, issueId: string | number, noteId: number, options?: Sudo); + remove( + projectId: string | number, + issueIId: number, + noteId: number, + options?: Sudo, + ): Promise; - show(projectId: string | number, issueId: string | number, noteId: number, options?: Sudo); + show( + projectId: string | number, + issueIId: number, + noteId: number, + options?: Sudo, + ): Promise>; } -export class IssueNotes extends ResourceNotes { - constructor(options: BaseServiceOptions = {}) { +export class IssueNotes extends ResourceNotes { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', 'issues', options); } } diff --git a/packages/gitbeaker-core/src/services/Issues.ts b/packages/gitbeaker-core/src/services/Issues.ts index ede5ab95..8805c8df 100644 --- a/packages/gitbeaker-core/src/services/Issues.ts +++ b/packages/gitbeaker-core/src/services/Issues.ts @@ -1,4 +1,7 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; +import { MergeRequestSchema } from './MergeRequests'; +import { MilestoneSchema } from '../templates'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -6,29 +9,98 @@ import { Sudo, } from '../infrastructure'; -type ProjectOrGroup = { projectId?: string | number } | { groupId?: string | number }; +type ProjectOrGroup = { projectId?: string | number; groupId?: string | number }; -export class Issues extends BaseService { +export interface TimeStatsSchema extends Record { + human_time_estimate?: string; + human_total_time_spent?: string; + time_estimate?: number; + total_time_spent?: number; +} + +export interface IssueSchema extends Record { + state: string; + description: string; + weight?: number; + health_status?: string; + author: Omit; + milestone: MilestoneSchema; + project_id: number; + assignees?: Omit[]; + updated_at: string; + closed_at?: string; + closed_by?: string; + id: number; + title: string; + created_at: string; + moved_to_id?: string; + iid: number; + labels?: string[]; + upvotes: number; + downvotes: number; + merge_requests_count: number; + user_notes_count: number; + due_date: string; + web_url: string; + references: { + short: string; + relative: string; + full: string; + }; + time_stats: TimeStatsSchema; + has_tasks: boolean; + task_status: string; + confidential: boolean; + discussion_locked: boolean; + _links: { + self: string; + notes: string; + award_emoji: string; + project: string; + }; + task_completion_status: { + count: number; + completed_count: number; + }; + subscribed: boolean; + epic?: { + id: number; + iid: number; + title: string; + url: string; + group_id: number; + }; +} + +export class Issues extends BaseService { addSpentTime(projectId: string | number, issueIid: number, duration: string, options?: Sudo) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/issues/${iId}/add_spent_time`, { - duration, - ...options, - }); + return RequestHelper.post()( + this, + `projects/${pId}/issues/${iId}/add_spent_time`, + { + duration, + ...options, + }, + ); } addTimeEstimate(projectId: string | number, issueIid: number, duration: string, options?: Sudo) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/issues/${iId}/time_estimate`, { - duration, - ...options, - }); + return RequestHelper.post()( + this, + `projects/${pId}/issues/${iId}/time_estimate`, + { + duration, + ...options, + }, + ); } all({ projectId, groupId, ...options }: ProjectOrGroup & PaginatedRequestOptions = {}) { - let url; + let url: string; if (projectId) { url = `projects/${encodeURIComponent(projectId)}/issues`; @@ -38,62 +110,77 @@ export class Issues extends BaseService { url = 'issues'; } - return RequestHelper.get(this, url, options); + return RequestHelper.get[]>()(this, url, options); } create(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/issues`, options); + return RequestHelper.post()(this, `projects/${pId}/issues`, options); } closedBy(projectId: string | number, issueIid: number, options?: BaseRequestOptions) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/issues/${iId}/closed_by`, options); + return RequestHelper.get()( + this, + `projects/${pId}/issues/${iId}/closed_by`, + options, + ); } edit(projectId: string | number, issueIid: number, options?: BaseRequestOptions) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/issues/${iId}`, options); + return RequestHelper.put()(this, `projects/${pId}/issues/${iId}`, options); } + // TODO move link( projectId: string | number, - issueIid: number, + issueIId: number, targetProjectId: string | number, - targetIssueIid: number, + targetIssueIId: number, options?: BaseRequestOptions, ) { - const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - const [targetpId, targetIid] = [targetProjectId, targetIssueIid].map(encodeURIComponent); + const [pId, iIId] = [projectId, issueIId].map(encodeURIComponent); + const [targetPId, targetIId] = [targetProjectId, targetIssueIId].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/issues/${iId}/links`, { - targetProjectId: targetpId, - targetIssueIid: targetIid, + return RequestHelper.post()(this, `projects/${pId}/issues/${iIId}/links`, { + targetProjectId: targetPId, + targetIssueIid: targetIId, ...options, }); } + // TODO move links(projectId: string | number, issueIid: number) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/issues/${iId}/links`); + return RequestHelper.get()(this, `projects/${pId}/issues/${iId}/links`); } participants(projectId: string | number, issueIid: number, options?: Sudo) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/issues/${iId}/participants`, options); + return RequestHelper.get>()( + this, + `projects/${pId}/issues/${iId}/participants`, + options, + ); } relatedMergeRequests(projectId: string | number, issueIid: number, options?: BaseRequestOptions) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/issues/${iId}/related_merge_requests`, options); + return RequestHelper.get()( + this, + `projects/${pId}/issues/${iId}/related_merge_requests`, + options, + ); } + // TODO move removeLink( projectId: string | number, issueIid: number, @@ -102,7 +189,7 @@ export class Issues extends BaseService { ) { const [pId, iId, iLinkId] = [projectId, issueIid, issueLinkId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/issues/${iId}/links/${iLinkId}`, { + return RequestHelper.del()(this, `projects/${pId}/issues/${iId}/links/${iLinkId}`, { ...options, }); } @@ -110,42 +197,62 @@ export class Issues extends BaseService { remove(projectId: string | number, issueIid: number, options?: Sudo) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/issues/${iId}`, options); + return RequestHelper.del()(this, `projects/${pId}/issues/${iId}`, options); } resetSpentTime(projectId: string | number, issueIid: number, options?: BaseRequestOptions) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/issues/${iId}/reset_spent_time`, options); + return RequestHelper.post()( + this, + `projects/${pId}/issues/${iId}/reset_spent_time`, + options, + ); } resetTimeEstimate(projectId: string | number, issueIid: number, options?: Sudo) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/issues/${iId}/reset_time_estimate`, options); + return RequestHelper.post()( + this, + `projects/${pId}/issues/${iId}/reset_time_estimate`, + options, + ); } show(projectId: string | number, issueIid: number, options?: Sudo) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/issues/${iId}`, options); + return RequestHelper.get()(this, `projects/${pId}/issues/${iId}`, options); } subscribe(projectId: string | number, issueIid: number, options?: Sudo) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/issues/${iId}/subscribe`, options); + return RequestHelper.post()( + this, + `projects/${pId}/issues/${iId}/subscribe`, + options, + ); } timeStats(projectId: string | number, issueIid: number, options?: Sudo) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/issues/${iId}/time_stats`, options); + return RequestHelper.get()( + this, + `projects/${pId}/issues/${iId}/time_stats`, + options, + ); } unsubscribe(projectId: string | number, issueIid: number, options?: Sudo) { const [pId, iId] = [projectId, issueIid].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/issues/${iId}/unsubscribe`, options); + return RequestHelper.post()( + this, + `projects/${pId}/issues/${iId}/unsubscribe`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/IssuesStatistics.ts b/packages/gitbeaker-core/src/services/IssuesStatistics.ts index b488ee1e..baa23d9c 100644 --- a/packages/gitbeaker-core/src/services/IssuesStatistics.ts +++ b/packages/gitbeaker-core/src/services/IssuesStatistics.ts @@ -1,11 +1,21 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, BaseRequestOptions } from '../infrastructure'; -type ProjectOrGroup = { projectId?: string | number } | { groupId?: string | number }; +type ProjectOrGroup = { projectId?: string | number; groupId?: string | number }; -export class IssuesStatistics extends BaseService { +export interface StatisticsSchema extends Record { + statistics: { + counts: { + all: number; + closed: number; + opened: number; + }; + }; +} + +export class IssuesStatistics extends BaseService { all({ projectId, groupId, ...options }: ProjectOrGroup & BaseRequestOptions = {}) { - let url; + let url: string; if (projectId) { url = `projects/${encodeURIComponent(projectId)}/issues_statistics`; @@ -15,6 +25,6 @@ export class IssuesStatistics extends BaseService { url = 'issues_statistics'; } - return RequestHelper.get(this, url, options); + return RequestHelper.get()(this, url, options); } } diff --git a/packages/gitbeaker-core/src/services/Jobs.ts b/packages/gitbeaker-core/src/services/Jobs.ts index 4ff442c0..43f51e16 100644 --- a/packages/gitbeaker-core/src/services/Jobs.ts +++ b/packages/gitbeaker-core/src/services/Jobs.ts @@ -5,10 +5,10 @@ import { RequestHelper, Sudo, } from '../infrastructure'; -import { CommitSchemaDefault, CommitSchemaCamelized } from './Commits'; -import { RunnerSchemaDefault, RunnerSchemaCamelized } from './Runners'; -import { UserSchemaDefault, UserSchemaCamelized } from './Users'; -import { PipelineBase } from './Pipelines'; +import { CommitSchema } from './Commits'; +import { RunnerSchema } from './Runners'; +import { UserSchema } from './Users'; +import { PipelineSchema } from './Pipelines'; export type JobScope = | 'created' @@ -20,24 +20,14 @@ export type JobScope = | 'skipped' | 'manual'; -export interface ArtifactSchemaDefault { +export interface ArtifactSchema extends Record { file_type: string; size: number; filename: string; file_format?: string; } -export interface ArtifactSchemaCamelized { - fileType: string; - size: number; - filename: string; - fileFormat?: string; -} - -// As of GitLab v12.6.2 -export type ArtifactSchema = ArtifactSchemaDefault | ArtifactSchemaCamelized; - -export interface JobSchemaDefault { +export interface JobSchema extends Record { id: number; status: string; stage: string; @@ -50,53 +40,30 @@ export interface JobSchemaDefault { started_at?: Date; finished_at?: Date; duration?: number; - user: UserSchemaDefault; - commit: CommitSchemaDefault; - pipeline: PipelineBase; + user: UserSchema; + commit: CommitSchema; + pipeline: PipelineSchema; web_url: string; - artifacts: ArtifactSchemaDefault[]; - runner: RunnerSchemaDefault; + artifacts: ArtifactSchema[]; + runner: RunnerSchema; artifacts_expire_at?: Date; + tag_list?: string[]; } -export interface JobSchemaCamelized { - id: number; - status: string; - stage: string; - name: string; - ref: string; - tag: boolean; - coverage?: string; - allowFailure: boolean; - createdAt: Date; - startedAt?: Date; - finishedAt?: Date; - duration?: number; - user: UserSchemaCamelized; - commit: CommitSchemaCamelized; - pipeline: PipelineBase; - webUrl: string; - artifacts: ArtifactSchemaCamelized[]; - runner: RunnerSchemaCamelized; - artifactsExpireAt?: Date; -} - -// As of GitLab v12.6.2 -export type JobSchema = JobSchemaDefault | JobSchemaCamelized; - -export class Jobs extends BaseService { +export class Jobs extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/jobs`, options); + return RequestHelper.get()(this, `projects/${pId}/jobs`, options); } cancel(projectId: string | number, jobId: number, options?: Sudo) { const [pId, jId] = [projectId, jobId].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/jobs/${jId}/cancel`, options); + return RequestHelper.post()(this, `projects/${pId}/jobs/${jId}/cancel`, options); } + // TODO move downloadSingleArtifactFile( projectId: string | number, jobId: number, @@ -104,15 +71,22 @@ export class Jobs extends BaseService { { stream = false, ...options }: { stream?: boolean } & BaseRequestOptions = {}, ) { const [pId, jId] = [projectId, jobId].map(encodeURIComponent); - const method = stream ? 'stream' : 'get'; - return RequestHelper[method]( + if (stream) { + return RequestHelper.stream( + this, + `projects/${pId}/jobs/${jId}/artifacts/${artifactPath}`, + options, + ); + } + return RequestHelper.get()( this, `projects/${pId}/jobs/${jId}/artifacts/${artifactPath}`, options, ); } + // TODO move downloadSingleArtifactFileFromRef( projectId: string | number, ref: string, @@ -121,15 +95,22 @@ export class Jobs extends BaseService { { stream = false, ...options }: { stream?: boolean } & BaseRequestOptions = {}, ) { const [pId, rId, name] = [projectId, ref, jobName].map(encodeURIComponent); - const method = stream ? 'stream' : 'get'; - return RequestHelper[method]( + if (stream) { + return RequestHelper.stream( + this, + `projects/${pId}/jobs/artifacts/${rId}/raw/${artifactPath}?job=${name}`, + options, + ); + } + return RequestHelper.get()( this, `projects/${pId}/jobs/artifacts/${rId}/raw/${artifactPath}?job=${name}`, options, ); } + // TODO move downloadLatestArtifactFile( projectId: string | number, ref: string, @@ -137,9 +118,15 @@ export class Jobs extends BaseService { { stream = false, ...options }: { stream?: boolean } & BaseRequestOptions = {}, ) { const [pId, rId, name] = [projectId, ref, jobName].map(encodeURIComponent); - const method = stream ? 'stream' : 'get'; - return RequestHelper[method]( + if (stream) { + return RequestHelper.stream( + this, + `projects/${pId}/jobs/artifacts/${rId}/download?job=${name}`, + options, + ); + } + return RequestHelper.get()( this, `projects/${pId}/jobs/artifacts/${rId}/download?job=${name}`, options, @@ -149,43 +136,45 @@ export class Jobs extends BaseService { downloadTraceFile(projectId: string | number, jobId: number, options?: Sudo) { const [pId, jId] = [projectId, jobId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/jobs/${jId}/trace`, options); + return RequestHelper.get()(this, `projects/${pId}/jobs/${jId}/trace`, options); } erase(projectId: string | number, jobId: number, options?: Sudo) { const [pId, jId] = [projectId, jobId].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/jobs/${jId}/erase`, options); + return RequestHelper.post()(this, `projects/${pId}/jobs/${jId}/erase`, options); } + // TODO move eraseArtifacts(projectId: string | number, jobId: number, options?: Sudo) { const [pId, jId] = [projectId, jobId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/jobs/${jId}/artifacts`, options); + return RequestHelper.del()(this, `projects/${pId}/jobs/${jId}/artifacts`, options); } + // TODO move keepArtifacts(projectId: string | number, jobId: number, options?: Sudo) { const [pId, jId] = [projectId, jobId].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/jobs/${jId}/artifacts/keep`, options); + return RequestHelper.post()(this, `projects/${pId}/jobs/${jId}/artifacts/keep`, options); } play(projectId: string | number, jobId: number, options?: Sudo) { const [pId, jId] = [projectId, jobId].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/jobs/${jId}/play`, options); + return RequestHelper.post()(this, `projects/${pId}/jobs/${jId}/play`, options); } retry(projectId: string | number, jobId: number, options?: Sudo) { const [pId, jId] = [projectId, jobId].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/jobs/${jId}/retry`, options); + return RequestHelper.post()(this, `projects/${pId}/jobs/${jId}/retry`, options); } show(projectId: string | number, jobId: number, options?: Sudo) { const [pId, jId] = [projectId, jobId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/jobs/${jId}`, options); + return RequestHelper.get()(this, `projects/${pId}/jobs/${jId}`, options); } showPipelineJobs( @@ -195,6 +184,6 @@ export class Jobs extends BaseService { ) { const [pId, ppId] = [projectId, pipelineId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/pipelines/${ppId}/jobs`, options); + return RequestHelper.get()(this, `projects/${pId}/pipelines/${ppId}/jobs`, options); } } diff --git a/packages/gitbeaker-core/src/services/Keys.ts b/packages/gitbeaker-core/src/services/Keys.ts index 1d29736d..7d6a36cb 100644 --- a/packages/gitbeaker-core/src/services/Keys.ts +++ b/packages/gitbeaker-core/src/services/Keys.ts @@ -1,10 +1,20 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserExtendedSchema } from './Users'; import { RequestHelper, Sudo } from '../infrastructure'; -export class Keys extends BaseService { +export interface KeySchema extends Record { + id: number; + title: string; + key: string; + created_at: string; + expires_at: string; + user: UserExtendedSchema; +} + +export class Keys extends BaseService { show(keyId: string, options?: Sudo) { const kId = encodeURIComponent(keyId); - return RequestHelper.get(this, `keys/${kId}`, options); + return RequestHelper.get()(this, `keys/${kId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/Labels.ts b/packages/gitbeaker-core/src/services/Labels.ts index 0f7601cb..0ce8d3ca 100644 --- a/packages/gitbeaker-core/src/services/Labels.ts +++ b/packages/gitbeaker-core/src/services/Labels.ts @@ -1,28 +1,49 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { BaseRequestOptions, PaginatedRequestOptions, Sudo } from '../infrastructure'; -import { ResourceLabels } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + CamelizedRecord, + Sudo, +} from '../infrastructure'; +import { ResourceLabels, LabelSchema } from '../templates'; -export interface Labels extends ResourceLabels { - all(projectId: string | number, options?: PaginatedRequestOptions); +export interface Labels extends ResourceLabels { + all( + projectId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; create( projectId: string | number, labelName: string, color: string, options?: BaseRequestOptions, - ); + ): Promise>; - edit(projectId: string | number, labelName: string, options?: BaseRequestOptions); + edit( + projectId: string | number, + labelId: number | string, + options?: BaseRequestOptions, + ): Promise>; - remove(projectId: string | number, labelName: string, options?: Sudo); + remove(projectId: string | number, labelId: number | string, options?: Sudo): Promise; - subscribe(projectId: string | number, labelId: number, options?: Sudo); + subscribe( + projectId: string | number, + labelId: number | string, + options?: Sudo, + ): Promise>; - unsubscribe(projectId: string | number, labelId: number, options?: Sudo); + unsubscribe( + projectId: string | number, + labelId: number | string, + options?: Sudo, + ): Promise>; } -export class Labels extends ResourceLabels { - constructor(options: BaseServiceOptions = {}) { +export class Labels extends ResourceLabels { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', options); } } diff --git a/packages/gitbeaker-core/src/services/LicenceTemplates.ts b/packages/gitbeaker-core/src/services/LicenceTemplates.ts deleted file mode 100644 index 9c95d00a..00000000 --- a/packages/gitbeaker-core/src/services/LicenceTemplates.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceTemplates } from '../templates'; - -export class LicenceTemplates extends ResourceTemplates { - constructor(options: BaseServiceOptions = {}) { - super('licences', options); - } -} diff --git a/packages/gitbeaker-core/src/services/License.ts b/packages/gitbeaker-core/src/services/License.ts index c8d71573..fc4aa27f 100644 --- a/packages/gitbeaker-core/src/services/License.ts +++ b/packages/gitbeaker-core/src/services/License.ts @@ -1,22 +1,43 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, Sudo } from '../infrastructure'; -export class License extends BaseService { +export interface LicenseSchema extends Record { + id: number; + plan: string; + created_at: string; + starts_at: string; + expires_at: string; + historical_max: number; + maximum_user_count: number; + expired: boolean; + overage: number; + user_limit: number; + active_users: number; + licensee: { + Name: string; + }; + add_ons: { + GitLab_FileLocks: number; + GitLab_Auditor_User: number; + }; +} + +export class License extends BaseService { add(license: string, options?: Sudo) { - return RequestHelper.post(this, 'license', { license, ...options }); + return RequestHelper.post()(this, 'license', { license, ...options }); } all(options?: Sudo) { - return RequestHelper.get(this, 'licenses', options); + return RequestHelper.get()(this, 'licenses', options); } show(options?: Sudo) { - return RequestHelper.get(this, 'license', options); + return RequestHelper.get()(this, 'license', options); } remove(licenceId: number, options?: Sudo) { const lId = encodeURIComponent(licenceId); - return RequestHelper.del(this, `license/${lId}`, options); + return RequestHelper.del()(this, `license/${lId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/LicenseTemplates.ts b/packages/gitbeaker-core/src/services/LicenseTemplates.ts new file mode 100644 index 00000000..04c07151 --- /dev/null +++ b/packages/gitbeaker-core/src/services/LicenseTemplates.ts @@ -0,0 +1,29 @@ +import { BaseServiceOptions } from '@gitbeaker/requester-utils'; +import { ResourceTemplates } from '../templates'; +import { PaginatedRequestOptions, Sudo, CamelizedRecord } from '../infrastructure'; + +export interface LicenseTemplateSchema extends Record { + key: string; + name: string; + nickname?: string; + featured: boolean; + html_url: string; + source_url: string; + description: string; + conditions?: string[]; + permissions?: string[]; + limitations?: string[]; + content: string; +} + +export interface LicenseTemplates extends ResourceTemplates { + all(options?: PaginatedRequestOptions): Promise[]>; + show(key: string | number, options?: Sudo): Promise>; +} + +export class LicenseTemplates extends ResourceTemplates { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ + super('Licenses', options); + } +} diff --git a/packages/gitbeaker-core/src/services/Lint.ts b/packages/gitbeaker-core/src/services/Lint.ts index 6c07cea0..7118b0c7 100644 --- a/packages/gitbeaker-core/src/services/Lint.ts +++ b/packages/gitbeaker-core/src/services/Lint.ts @@ -1,8 +1,14 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, Sudo } from '../infrastructure'; -export class Lint extends BaseService { +export interface LintSchema extends Record { + status: string; + errors?: string[]; + warnings?: string[]; +} + +export class Lint extends BaseService { lint(content: string, options?: Sudo) { - return RequestHelper.post(this, 'ci/lint', { content, ...options }); + return RequestHelper.post()(this, 'ci/lint', { content, ...options }); } } diff --git a/packages/gitbeaker-core/src/services/Markdown.ts b/packages/gitbeaker-core/src/services/Markdown.ts index 7a0cc770..33144394 100644 --- a/packages/gitbeaker-core/src/services/Markdown.ts +++ b/packages/gitbeaker-core/src/services/Markdown.ts @@ -1,8 +1,12 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, Sudo } from '../infrastructure'; -export class Markdown extends BaseService { +export interface MarkdownSchema extends Record { + html: string; +} + +export class Markdown extends BaseService { render(text: string, options?: { gfm?: string; project?: string | number } & Sudo) { - return RequestHelper.post(this, 'markdown', { text, ...options }); + return RequestHelper.post()(this, 'markdown', { text, ...options }); } } diff --git a/packages/gitbeaker-core/src/services/MergeRequestApprovals.ts b/packages/gitbeaker-core/src/services/MergeRequestApprovals.ts index 51a142bb..1036a887 100644 --- a/packages/gitbeaker-core/src/services/MergeRequestApprovals.ts +++ b/packages/gitbeaker-core/src/services/MergeRequestApprovals.ts @@ -1,13 +1,25 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { BaseRequestOptions, RequestHelper, Sudo } from '../infrastructure'; +// TODO: This one is has changed quite a bit, requires a deeper look +// https://docs.gitlab.com/ee/api/merge_request_approvals.html#project-level-mr-approvals + +export interface MergeRequestApprovalSchema extends Record { + approvals_before_merge: number; + reset_approvals_on_push: boolean; + disable_overriding_approvers_per_merge_request: boolean; + merge_requests_author_approval: boolean; + merge_requests_disable_committers_approval: boolean; + require_password_to_approve: boolean; +} + export type ApprovalRulesRequestOptions = { userIds?: number[]; groupIds?: number[]; protectedBranchIds?: number[]; }; -export class MergeRequestApprovals extends BaseService { +export class MergeRequestApprovals extends BaseService { addApprovalRule( projectId: string | number, name: string, @@ -19,7 +31,7 @@ export class MergeRequestApprovals extends BaseService { ) { const pId = encodeURIComponent(projectId); - let url; + let url: string; if (mergerequestIid) { const mIid = encodeURIComponent(mergerequestIid); @@ -28,7 +40,7 @@ export class MergeRequestApprovals extends BaseService { url = `projects/${pId}/approval_rules`; } - return RequestHelper.post(this, url, { name, approvalsRequired, ...options }); + return RequestHelper.post()(this, url, { name, approvalsRequired, ...options }); } approvalRules( @@ -37,7 +49,7 @@ export class MergeRequestApprovals extends BaseService { ) { const pId = encodeURIComponent(projectId); - let url; + let url: string; if (mergerequestIid) { const mIid = encodeURIComponent(mergerequestIid); @@ -45,7 +57,7 @@ export class MergeRequestApprovals extends BaseService { } else { url = `projects/${pId}/approval_rules`; } - return RequestHelper.get(this, url, options); + return RequestHelper.get()(this, url, options); } approvals( @@ -54,7 +66,7 @@ export class MergeRequestApprovals extends BaseService { ) { const pId = encodeURIComponent(projectId); - let url; + let url: string; if (mergerequestIid) { const mIid = encodeURIComponent(mergerequestIid); @@ -63,7 +75,7 @@ export class MergeRequestApprovals extends BaseService { url = `projects/${pId}/approvals`; } - return RequestHelper.get(this, url, options); + return RequestHelper.get()(this, url, options); } approvalState( @@ -73,7 +85,7 @@ export class MergeRequestApprovals extends BaseService { ) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.get( + return RequestHelper.get()( this, `projects/${pId}/merge_requests/${mIid}/approval_state`, options, @@ -87,7 +99,7 @@ export class MergeRequestApprovals extends BaseService { ) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/merge_requests/${mIid}/approve`, options); + return RequestHelper.post()(this, `projects/${pId}/merge_requests/${mIid}/approve`, options); } approvers( @@ -98,7 +110,7 @@ export class MergeRequestApprovals extends BaseService { ) { const pId = encodeURIComponent(projectId); - let url; + let url: string; if (mergerequestIid) { const mIid = encodeURIComponent(mergerequestIid); @@ -107,7 +119,7 @@ export class MergeRequestApprovals extends BaseService { url = `projects/${pId}/approvers`; } - return RequestHelper.put(this, url, { approverIds, approverGroupIds, ...options }); + return RequestHelper.put()(this, url, { approverIds, approverGroupIds, ...options }); } editApprovalRule( @@ -122,7 +134,7 @@ export class MergeRequestApprovals extends BaseService { ) { const [pId, aId] = [projectId, approvalRuleId].map(encodeURIComponent); - let url; + let url: string; if (mergerequestIid) { const mIid = encodeURIComponent(mergerequestIid); @@ -131,7 +143,7 @@ export class MergeRequestApprovals extends BaseService { url = `projects/${pId}/approval_rules/${aId}`; } - return RequestHelper.put(this, url, { name, approvalsRequired, ...options }); + return RequestHelper.put()(this, url, { name, approvalsRequired, ...options }); } editApprovals( @@ -140,7 +152,7 @@ export class MergeRequestApprovals extends BaseService { ) { const pId = encodeURIComponent(projectId); - let url; + let url: string; if (mergerequestIid) { const mIid = encodeURIComponent(mergerequestIid); @@ -149,7 +161,7 @@ export class MergeRequestApprovals extends BaseService { url = `projects/${pId}/approvals`; } - return RequestHelper.post(this, url, options); + return RequestHelper.post()(this, url, options); } removeApprovalRule( @@ -159,7 +171,7 @@ export class MergeRequestApprovals extends BaseService { ) { const [pId, aId] = [projectId, approvalRuleId].map(encodeURIComponent); - let url; + let url: string; if (mergerequestIid) { const mIid = encodeURIComponent(mergerequestIid); @@ -168,12 +180,12 @@ export class MergeRequestApprovals extends BaseService { url = `projects/${pId}/approval_rules/${aId}`; } - return RequestHelper.del(this, url, options); + return RequestHelper.del()(this, url, options); } unapprove(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/merge_requests/${mIid}/unapprove`, options); + return RequestHelper.post()(this, `projects/${pId}/merge_requests/${mIid}/unapprove`, options); } } diff --git a/packages/gitbeaker-core/src/services/MergeRequestAwardEmojis.ts b/packages/gitbeaker-core/src/services/MergeRequestAwardEmojis.ts index b40d7dbe..ce3c3b5e 100644 --- a/packages/gitbeaker-core/src/services/MergeRequestAwardEmojis.ts +++ b/packages/gitbeaker-core/src/services/MergeRequestAwardEmojis.ts @@ -1,42 +1,39 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceAwardEmojis } from '../templates'; -import { PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceAwardEmojis, AwardEmojiSchema } from '../templates'; +import { PaginatedRequestOptions, Sudo, CamelizedRecord } from '../infrastructure'; -export interface MergeRequestAwardEmojis extends ResourceAwardEmojis { +export interface MergeRequestAwardEmojis extends ResourceAwardEmojis { all( projectId: string | number, - mergerequestId: string | number, - noteId: number, + mergerequestIId: number, options?: PaginatedRequestOptions, - ); + ): Promise[]>; award( projectId: string | number, - mergerequestId: string | number, - noteId: number, + mergerequestIId: number, name: string, options?: Sudo, - ); + ): Promise>; remove( projectId: string | number, - mergerequestId: string | number, + mergerequestIId: number, awardId: number, - noteId: number, options?: Sudo, - ); + ): Promise; show( projectId: string | number, - mergerequestId: string | number, + mergerequestIId: number, awardId: number, - noteId: number, options?: Sudo, - ); + ): Promise>; } -export class MergeRequestAwardEmojis extends ResourceAwardEmojis { - constructor(options: BaseServiceOptions = {}) { +export class MergeRequestAwardEmojis extends ResourceAwardEmojis { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('merge_requests', options); } } diff --git a/packages/gitbeaker-core/src/services/MergeRequestDiscussions.ts b/packages/gitbeaker-core/src/services/MergeRequestDiscussions.ts index c3dd42be..16c22fb8 100644 --- a/packages/gitbeaker-core/src/services/MergeRequestDiscussions.ts +++ b/packages/gitbeaker-core/src/services/MergeRequestDiscussions.ts @@ -1,57 +1,63 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceDiscussions } from '../templates'; -import { BaseRequestOptions, PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceDiscussions, DiscussionSchema } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface MergeRequestDiscussions extends ResourceDiscussions { +export interface MergeRequestDiscussions extends ResourceDiscussions { addNote( projectId: string | number, mergerequestId: string | number, - discussionId: string | number, + discussionId: number, noteId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; all( projectId: string | number, - mergerequestId: string | number, + issueId: string | number, options?: PaginatedRequestOptions, - ); + ): Promise[]>; create( projectId: string | number, mergerequestId: string | number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; editNote( projectId: string | number, mergerequestId: string | number, - discussionId: string | number, + discussionId: number, noteId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; removeNote( projectId: string | number, - mergerequestId: string | number, - discussionId: string | number, + issueId: string | number, + discussionId: number, noteId: number, options?: Sudo, - ); + ): Promise; show( projectId: string | number, mergerequestId: string | number, - discussionId: string | number, + discussionId: number, options?: Sudo, - ); + ): Promise>; } -export class MergeRequestDiscussions extends ResourceDiscussions { - constructor(options: BaseServiceOptions = {}) { +export class MergeRequestDiscussions extends ResourceDiscussions { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', 'merge_requests', options); } } diff --git a/packages/gitbeaker-core/src/services/MergeRequestNotes.ts b/packages/gitbeaker-core/src/services/MergeRequestNotes.ts index c2766275..5d4eae56 100644 --- a/packages/gitbeaker-core/src/services/MergeRequestNotes.ts +++ b/packages/gitbeaker-core/src/services/MergeRequestNotes.ts @@ -1,46 +1,61 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceNotes } from '../templates'; -import { PaginatedRequestOptions, BaseRequestOptions, Sudo } from '../infrastructure'; +import { ResourceNotes, NoteSchema } from '../templates'; +import { + PaginatedRequestOptions, + BaseRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface MergeRequestNotes extends ResourceNotes { +export interface MergeRequestNoteSchema extends NoteSchema { + attachment?: string; + system: boolean; + noteable_id: number; + noteable_type: string; + noteable_iid: number; + resolvable: boolean; +} + +export interface MergeRequestNotes extends ResourceNotes { all( projectId: string | number, - mergerequestIid: string | number, + mergerequestId: string | number, options?: PaginatedRequestOptions, - ); + ): Promise[]>; create( projectId: string | number, - mergerequestIid: string | number, + mergerequestId: string | number, body: string, options?: BaseRequestOptions, - ); + ): Promise>; edit( projectId: string | number, - mergerequestIid: string | number, + mergerequestId: string | number, noteId: number, body: string, options?: BaseRequestOptions, - ); + ): Promise>; remove( projectId: string | number, - mergerequestIid: string | number, + mergerequestId: string | number, noteId: number, options?: Sudo, - ); + ): Promise; show( projectId: string | number, - mergerequestIid: string | number, + mergerequestIdepicId: string | number, noteId: number, options?: Sudo, - ); + ): Promise>; } -export class MergeRequestNotes extends ResourceNotes { - constructor(options: BaseServiceOptions = {}) { +export class MergeRequestNotes extends ResourceNotes { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', 'merge_requests', options); } } diff --git a/packages/gitbeaker-core/src/services/MergeRequests.ts b/packages/gitbeaker-core/src/services/MergeRequests.ts index 37331b8d..58015d35 100644 --- a/packages/gitbeaker-core/src/services/MergeRequests.ts +++ b/packages/gitbeaker-core/src/services/MergeRequests.ts @@ -1,4 +1,8 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; +import { IssueSchema } from './Issues'; +import { CommitSchema, CommitDiffSchema } from './Commits'; +import { MilestoneSchema } from '../templates'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -72,7 +76,96 @@ export interface AllMergeRequestsOptions { wip?: string; } -export class MergeRequests extends BaseService { +// Response Schemas +export interface ReferenceSchema { + short: string; + relative: string; + full: string; +} + +export interface TaskCompletionStatusSchema { + count: number; + completed_count: number; +} + +export interface PipelineSchema extends Record { + id: number; + sha: string; + ref: string; + status: string; +} + +export interface TimeStatsSchema extends Record { + time_estimate: number; + total_time_spent: number; + human_time_estimate: string; + human_total_time_spent: string; +} + +export interface RebaseSchema extends Record { + rebase_in_progress?: boolean; + merge_error?: string; +} + +export interface DiffSchema extends Record { + id: number; + head_commit_sha: string; + base_commit_sha: string; + start_commit_sha: string; + created_at: string; + merge_request_id: number; + state: string; + real_size: string; + commits?: CommitSchema[]; + diffs?: CommitDiffSchema[]; +} + +export interface MergeRequestSchema extends Record { + id: number; + iid: number; + project_id: number; + title: string; + description: string; + state: string; + merged_by: Omit; + merged_at: string; + closed_by?: string; + closed_at?: string; + created_at: string; + updated_at: string; + target_branch: string; + source_branch: string; + upvotes: number; + downvotes: number; + author: Omit; + assignee: Omit; + assignees?: Omit[]; + reviewers?: Omit[]; + source_project_id: number; + target_project_id: number; + labels?: string[]; + work_in_progress: boolean; + milestone: MilestoneSchema; + merge_when_pipeline_succeeds: boolean; + merge_status: string; + sha: string; + merge_commit_sha?: string; + squash_commit_sha?: string; + user_notes_count: number; + discussion_locked?: string; + should_remove_source_branch: boolean; + force_remove_source_branch: boolean; + web_url: string; + references: ReferenceSchema; + time_stats: TimeStatsSchema; + squash: boolean; + task_completion_status: TaskCompletionStatusSchema; + has_conflicts: boolean; + blocking_discussions_resolved: boolean; + changes?: CommitDiffSchema[]; +} + +export class MergeRequests extends BaseService { accept( projectId: string | number, mergerequestIid: number, @@ -80,7 +173,11 @@ export class MergeRequests extends BaseService { ) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/merge_requests/${mIid}/merge`, options); + return RequestHelper.put()( + this, + `projects/${pId}/merge_requests/${mIid}/merge`, + options, + ); } addSpentTime( @@ -91,10 +188,14 @@ export class MergeRequests extends BaseService { ) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/merge_requests/${mIid}/add_spent_time`, { - duration, - ...options, - }); + return RequestHelper.post()( + this, + `projects/${pId}/merge_requests/${mIid}/add_spent_time`, + { + duration, + ...options, + }, + ); } addTimeEstimate( @@ -105,20 +206,23 @@ export class MergeRequests extends BaseService { ) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/merge_requests/${mIid}/time_estimate`, { - duration, - ...options, - }); + return RequestHelper.post()( + this, + `projects/${pId}/merge_requests/${mIid}/time_estimate`, + { + duration, + ...options, + }, + ); } all({ projectId, groupId, ...options - }: ({ projectId?: string | number } | { groupId?: string | number }) & - AllMergeRequestsOptions & + }: { projectId?: string | number; groupId?: string | number } & AllMergeRequestsOptions & PaginatedRequestOptions = {}) { - let url; + let url: string; if (projectId) { url = `projects/${encodeURIComponent(projectId)}/merge_requests`; @@ -128,13 +232,13 @@ export class MergeRequests extends BaseService { url = 'merge_requests'; } - return RequestHelper.get(this, url, options); + return RequestHelper.get()(this, url, options); } cancelOnPipelineSucess(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.put( + return RequestHelper.put()( this, `projects/${pId}/merge_requests/${mIid}/cancel_merge_when_pipeline_succeeds`, options, @@ -144,19 +248,31 @@ export class MergeRequests extends BaseService { changes(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/merge_requests/${mIid}/changes`, options); + return RequestHelper.get()( + this, + `projects/${pId}/merge_requests/${mIid}/changes`, + options, + ); } closesIssues(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/merge_requests/${mIid}/closes_issues`, options); + return RequestHelper.get()( + this, + `projects/${pId}/merge_requests/${mIid}/closes_issues`, + options, + ); } commits(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/merge_requests/${mIid}/commits`, options); + return RequestHelper.get()( + this, + `projects/${pId}/merge_requests/${mIid}/commits`, + options, + ); } create( @@ -168,8 +284,7 @@ export class MergeRequests extends BaseService { ) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/merge_requests`, { - id: pId, + return RequestHelper.post()(this, `projects/${pId}/merge_requests`, { sourceBranch, targetBranch, title, @@ -184,37 +299,53 @@ export class MergeRequests extends BaseService { ) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/merge_requests/${mIid}`, options); + return RequestHelper.put()( + this, + `projects/${pId}/merge_requests/${mIid}`, + options, + ); } participants(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/merge_requests/${mIid}/participants`, options); + return RequestHelper.get[]>()( + this, + `projects/${pId}/merge_requests/${mIid}/participants`, + options, + ); } pipelines(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/merge_requests/${mIid}/pipelines`, options); + return RequestHelper.get()( + this, + `projects/${pId}/merge_requests/${mIid}/pipelines`, + options, + ); } rebase(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/merge_requests/${mIid}/rebase`, options); + return RequestHelper.put()( + this, + `projects/${pId}/merge_requests/${mIid}/rebase`, + options, + ); } remove(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/merge_requests/${mIid}`, options); + return RequestHelper.del()(this, `projects/${pId}/merge_requests/${mIid}`, options); } resetSpentTime(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.post( + return RequestHelper.post()( this, `projects/${pId}/merge_requests/${mIid}/reset_spent_time`, options, @@ -224,7 +355,7 @@ export class MergeRequests extends BaseService { resetTimeEstimate(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.post( + return RequestHelper.post()( this, `projects/${pId}/merge_requests/${mIid}/reset_time_estimate`, options, @@ -238,25 +369,37 @@ export class MergeRequests extends BaseService { ) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/merge_requests/${mIid}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/merge_requests/${mIid}`, + options, + ); } subscribe(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/merge_requests/${mIid}/subscribe`, options); + return RequestHelper.post()( + this, + `projects/${pId}/merge_requests/${mIid}/subscribe`, + options, + ); } timeStats(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/merge_requests/${mIid}/time_stats`, options); + return RequestHelper.get()( + this, + `projects/${pId}/merge_requests/${mIid}/time_stats`, + options, + ); } version(projectId: string | number, mergerequestIid: number, versionId: number, options?: Sudo) { const [pId, mIid, vId] = [projectId, mergerequestIid, versionId].map(encodeURIComponent); - return RequestHelper.get( + return RequestHelper.get()( this, `projects/${pId}/merge_requests/${mIid}/versions/${vId}`, options, @@ -266,12 +409,20 @@ export class MergeRequests extends BaseService { versions(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/merge_requests/${mIid}/versions`, options); + return RequestHelper.get()( + this, + `projects/${pId}/merge_requests/${mIid}/versions`, + options, + ); } unsubscribe(projectId: string | number, mergerequestIid: number, options?: Sudo) { const [pId, mIid] = [projectId, mergerequestIid].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/merge_requests/${mIid}/unsubscribe`, options); + return RequestHelper.post()( + this, + `projects/${pId}/merge_requests/${mIid}/unsubscribe`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/Namespaces.ts b/packages/gitbeaker-core/src/services/Namespaces.ts index 64940f08..23bbf24f 100644 --- a/packages/gitbeaker-core/src/services/Namespaces.ts +++ b/packages/gitbeaker-core/src/services/Namespaces.ts @@ -1,14 +1,30 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, PaginatedRequestOptions, Sudo } from '../infrastructure'; -export class Namespaces extends BaseService { +export interface NamespaceSchema extends Record { + id: number; + name: string; + path: string; + kind: string; + full_path: string; + parent_id?: number; + avatar_url: string; + web_url: string; + billable_members_count: number; + plan: string; + trial_ends_on?: string; + trial: boolean; +} + +// TODO: Add missing functions +export class Namespaces extends BaseService { all(options?: PaginatedRequestOptions) { - return RequestHelper.get(this, 'namespaces', options); + return RequestHelper.get()(this, 'namespaces', options); } show(namespaceId: string | number, options?: { search?: string } & Sudo) { const nId = encodeURIComponent(namespaceId); - return RequestHelper.get(this, `namespaces/${nId}`, options); + return RequestHelper.get()(this, `namespaces/${nId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/NotificationSettings.ts b/packages/gitbeaker-core/src/services/NotificationSettings.ts index d3b94955..35eee818 100644 --- a/packages/gitbeaker-core/src/services/NotificationSettings.ts +++ b/packages/gitbeaker-core/src/services/NotificationSettings.ts @@ -1,7 +1,9 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { BaseRequestOptions, PaginatedRequestOptions, RequestHelper } from '../infrastructure'; -type NotificationSettingLevel = +// TODO: Add missing functions + +export type NotificationSettingLevel = | 'disabled' | 'participating' | 'watch' @@ -9,6 +11,11 @@ type NotificationSettingLevel = | 'mention' | 'custom'; +export interface NotificationSettingSchema extends Record { + level: NotificationSettingLevel; + notification_email: string; +} + type ProjectOrGroup = { projectId?: string | number } | { groupId?: string | number }; function url({ projectId, groupId }) { @@ -23,9 +30,13 @@ function url({ projectId, groupId }) { return `${uri}notification_settings`; } -export class NotificationSettings extends BaseService { +export class NotificationSettings extends BaseService { all({ projectId, groupId, ...options }: ProjectOrGroup & PaginatedRequestOptions = {}) { - return RequestHelper.get(this, url({ groupId, projectId }), options); + return RequestHelper.get()( + this, + url({ groupId, projectId }), + options, + ); } edit({ @@ -33,6 +44,10 @@ export class NotificationSettings extends BaseService { groupId, ...options }: { level?: NotificationSettingLevel } & ProjectOrGroup & BaseRequestOptions = {}) { - return RequestHelper.put(this, url({ groupId, projectId }), options); + return RequestHelper.put()( + this, + url({ groupId, projectId }), + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/Packages.ts b/packages/gitbeaker-core/src/services/Packages.ts index 5ba411f0..0aaf0c0d 100644 --- a/packages/gitbeaker-core/src/services/Packages.ts +++ b/packages/gitbeaker-core/src/services/Packages.ts @@ -1,28 +1,54 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { PipelineSchema } from './Pipelines'; import { PaginatedRequestOptions, RequestHelper, Sudo } from '../infrastructure'; -export class Packages extends BaseService { +// TODO: Add group support + +export interface PackageSchema extends Record { + id: number; + name: string; + version: string; + package_type: string; + created_at: string; +} + +export interface PackageFileSchema extends Record { + id: number; + package_id: number; + created_at: string; + file_name: string; + size: number; + file_md5: string; + file_sha1: string; + pipelines?: PipelineSchema[]; +} + +export class Packages extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/packages`, options); + return RequestHelper.get()(this, `projects/${pId}/packages`, options); } remove(projectId: string | number, packageId: number, options?: Sudo) { const [pId, pkId] = [projectId, packageId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/packages/${pkId}`, options); + return RequestHelper.del()(this, `projects/${pId}/packages/${pkId}`, options); } show(projectId: string | number, packageId: number, options?: Sudo) { const [pId, pkId] = [projectId, packageId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/packages/${pkId}`, options); + return RequestHelper.get()(this, `projects/${pId}/packages/${pkId}`, options); } showFiles(projectId: string | number, packageId: number, options?: Sudo) { const [pId, pkId] = [projectId, packageId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/packages/${pkId}/package_files`, options); + return RequestHelper.get()( + this, + `projects/${pId}/packages/${pkId}/package_files`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/PagesDomains.ts b/packages/gitbeaker-core/src/services/PagesDomains.ts index 9e271765..b737a5b5 100644 --- a/packages/gitbeaker-core/src/services/PagesDomains.ts +++ b/packages/gitbeaker-core/src/services/PagesDomains.ts @@ -6,34 +6,58 @@ import { Sudo, } from '../infrastructure'; -export class PagesDomains extends BaseService { +export interface PagesDomainSchema extends Record { + domain: string; + url: string; + project_id: number; + auto_ssl_enabled: boolean; + certificate: { + expired: boolean; + expiration: string; + }; +} + +// TODO: Add missing functions + +export class PagesDomains extends BaseService { all({ projectId, ...options }: { projectId?: string | number } & PaginatedRequestOptions = {}) { const url = projectId ? `projects/${encodeURIComponent(projectId)}/` : ''; - return RequestHelper.get(this, `${url}pages/domains`, options); + return RequestHelper.get()(this, `${url}pages/domains`, options); } create(projectId: string | number, domain: string, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/pages/domains`, { domain, ...options }); + return RequestHelper.post()(this, `projects/${pId}/pages/domains`, { + domain, + ...options, + }); } edit(projectId: string | number, domain: string, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.put(this, `projects/${pId}/pages/domains/${domain}`, options); + return RequestHelper.put()( + this, + `projects/${pId}/pages/domains/${domain}`, + options, + ); } show(projectId: string | number, domain: string, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/pages/domains/${domain}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/pages/domains/${domain}`, + options, + ); } remove(projectId: string | number, domain: string, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.del(this, `projects/${pId}/pages/domains/${domain}`, options); + return RequestHelper.del()(this, `projects/${pId}/pages/domains/${domain}`, options); } } diff --git a/packages/gitbeaker-core/src/services/PipelineScheduleVariables.ts b/packages/gitbeaker-core/src/services/PipelineScheduleVariables.ts index e5bbac8a..14f55e74 100644 --- a/packages/gitbeaker-core/src/services/PipelineScheduleVariables.ts +++ b/packages/gitbeaker-core/src/services/PipelineScheduleVariables.ts @@ -1,17 +1,22 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { PipelineVariableSchema } from './Pipelines'; import { BaseRequestOptions, PaginatedRequestOptions, RequestHelper } from '../infrastructure'; -export class PipelineScheduleVariables extends BaseService { +export class PipelineScheduleVariables extends BaseService { all(projectId: string | number, pipelineScheduleId: number, options?: PaginatedRequestOptions) { const [pId, psId] = [projectId, pipelineScheduleId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/pipeline_schedules/${psId}/variables`, options); + return RequestHelper.get()( + this, + `projects/${pId}/pipeline_schedules/${psId}/variables`, + options, + ); } create(projectId: string | number, pipelineScheduleId: number, options?: BaseRequestOptions) { const [pId, psId] = [projectId, pipelineScheduleId].map(encodeURIComponent); - return RequestHelper.post( + return RequestHelper.post()( this, `projects/${pId}/pipeline_schedules/${psId}/variables`, options, @@ -26,7 +31,7 @@ export class PipelineScheduleVariables extends BaseService { ) { const [pId, psId, kId] = [projectId, pipelineScheduleId, keyId].map(encodeURIComponent); - return RequestHelper.put( + return RequestHelper.put()( this, `projects/${pId}/pipeline_schedules/${psId}/variables/${kId}`, options, @@ -41,7 +46,7 @@ export class PipelineScheduleVariables extends BaseService { ) { const [pId, psId, kId] = [projectId, pipelineScheduleId, keyId].map(encodeURIComponent); - return RequestHelper.get( + return RequestHelper.get()( this, `projects/${pId}/pipeline_schedules/${psId}/variables/${kId}`, options, @@ -56,7 +61,7 @@ export class PipelineScheduleVariables extends BaseService { ) { const [pId, psId, kId] = [projectId, pipelineScheduleId, keyId].map(encodeURIComponent); - return RequestHelper.del( + return RequestHelper.del()( this, `projects/${pId}/pipeline_schedules/${psId}/variables/${kId}`, options, diff --git a/packages/gitbeaker-core/src/services/PipelineSchedules.ts b/packages/gitbeaker-core/src/services/PipelineSchedules.ts index e838f4f6..869fe8f1 100644 --- a/packages/gitbeaker-core/src/services/PipelineSchedules.ts +++ b/packages/gitbeaker-core/src/services/PipelineSchedules.ts @@ -1,4 +1,6 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; +import { PipelineSchema, PipelineVariableSchema } from './Pipelines'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -6,11 +8,32 @@ import { Sudo, } from '../infrastructure'; -export class PipelineSchedules extends BaseService { +export interface PipelineScheduleSchema extends Record { + id: number; + description: string; + ref: string; + cron: string; + cron_timezone: string; + next_run_at: string; + active: boolean; + created_at: string; + updated_at: string; + owner: Pick; +} + +export interface PipelineScheduleExtendedSchema extends PipelineScheduleSchema { + last_pipeline: Pick; +} + +export class PipelineSchedules extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/pipeline_schedules`, options); + return RequestHelper.get()( + this, + `projects/${pId}/pipeline_schedules`, + options, + ); } create( @@ -22,36 +45,52 @@ export class PipelineSchedules extends BaseService { ) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/pipeline_schedules`, { - description, - ref, - cron, - ...options, - }); + return RequestHelper.post()( + this, + `projects/${pId}/pipeline_schedules`, + { + description, + ref, + cron, + ...options, + }, + ); } edit(projectId: string | number, scheduleId: number, options?: BaseRequestOptions) { const [pId, sId] = [projectId, scheduleId].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/pipeline_schedules/${sId}`, options); + return RequestHelper.put()( + this, + `projects/${pId}/pipeline_schedules/${sId}`, + options, + ); } remove(projectId: string | number, scheduleId: number, options?: Sudo) { const [pId, sId] = [projectId, scheduleId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/pipeline_schedules/${sId}`, options); + return RequestHelper.del()( + this, + `projects/${pId}/pipeline_schedules/${sId}`, + options, + ); } show(projectId: string | number, scheduleId: number, options?: Sudo) { const [pId, sId] = [projectId, scheduleId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/pipeline_schedules/${sId}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/pipeline_schedules/${sId}`, + options, + ); } takeOwnership(projectId: string | number, scheduleId: number, options?: Sudo) { const [pId, sId] = [projectId, scheduleId].map(encodeURIComponent); - return RequestHelper.post( + return RequestHelper.post()( this, `projects/${pId}/pipeline_schedules/${sId}/take_ownership`, options, diff --git a/packages/gitbeaker-core/src/services/Pipelines.ts b/packages/gitbeaker-core/src/services/Pipelines.ts index 2d902386..8d476563 100644 --- a/packages/gitbeaker-core/src/services/Pipelines.ts +++ b/packages/gitbeaker-core/src/services/Pipelines.ts @@ -1,4 +1,5 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -19,68 +20,97 @@ export type PipelineStatus = | 'manual' | 'scheduled'; -export interface PipelineBase { +export interface PipelineSchema extends Record { id: number; - sha: string; - ref: string; status: PipelineStatus; -} - -export interface PipelineSchemaDefault extends PipelineBase { - created_at: Date; - updated_at: Date; + ref: string; + sha: string; web_url: string; + created_at: string; + updated_at: string; + user: Pick; } -export interface PipelineSchemaCamelized extends PipelineBase { - createdAt: Date; - updatedAt: Date; - webUrl: string; +export interface PipelineExtendedSchema extends PipelineSchema { + project_id: number; + before_sha: string; + tag: boolean; + yaml_errors?: string; + user: Pick; + started_at?: string; + finished_at: string; + committed_at?: string; + duration?: string; + coverage?: string; } -// As of GitLab v12.6.2 -export type PipelineSchema = PipelineSchemaDefault | PipelineSchemaCamelized; +export interface PipelineVariableSchema extends Record { + key: string; + variable_type?: string; + value: string; +} -export class Pipelines extends BaseService { +// TODO: Add missing function + +export class Pipelines extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/pipelines`, options); + return RequestHelper.get()(this, `projects/${pId}/pipelines`, options); } create(projectId: string | number, ref: string, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/pipeline`, { ref, ...options }); + return RequestHelper.post()(this, `projects/${pId}/pipeline`, { + ref, + ...options, + }); } delete(projectId: string | number, pipelineId: number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.del(this, `projects/${pId}/pipelines/${pipelineId}`, options); + return RequestHelper.del()(this, `projects/${pId}/pipelines/${pipelineId}`, options); } show(projectId: string | number, pipelineId: number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/pipelines/${pipelineId}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/pipelines/${pipelineId}`, + options, + ); } retry(projectId: string | number, pipelineId: number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/pipelines/${pipelineId}/retry`, options); + return RequestHelper.post()( + this, + `projects/${pId}/pipelines/${pipelineId}/retry`, + options, + ); } cancel(projectId: string | number, pipelineId: number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/pipelines/${pipelineId}/cancel`, options); + return RequestHelper.post()( + this, + `projects/${pId}/pipelines/${pipelineId}/cancel`, + options, + ); } allVariables(projectId: string | number, pipelineId: number, options?: PaginatedRequestOptions) { const [pId, pipeId] = [projectId, pipelineId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/pipelines/${pipeId}/variables`, options); + return RequestHelper.get()( + this, + `projects/${pId}/pipelines/${pipeId}/variables`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/ProjectAccessRequests.ts b/packages/gitbeaker-core/src/services/ProjectAccessRequests.ts index 26c6a21d..c34ad136 100644 --- a/packages/gitbeaker-core/src/services/ProjectAccessRequests.ts +++ b/packages/gitbeaker-core/src/services/ProjectAccessRequests.ts @@ -1,8 +1,24 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceAccessRequests } from '../templates'; +import { ResourceAccessRequests, AccessRequestSchema, AccessLevel } from '../templates'; +import { Sudo, CamelizedRecord } from '../infrastructure'; -export class ProjectAccessRequests extends ResourceAccessRequests { - constructor(options: BaseServiceOptions = {}) { +export interface GroupAccessRequests extends ResourceAccessRequests { + all(projectId: string | number): Promise[]>; + + request(projectId: string | number): Promise>; + + approve( + projectId: string | number, + userId: number, + options?: { accessLevel?: AccessLevel } & Sudo, + ): Promise>; + + deny(projectId: string | number, userId: number): Promise; +} + +export class ProjectAccessRequests extends ResourceAccessRequests { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectBadges.ts b/packages/gitbeaker-core/src/services/ProjectBadges.ts index dacc9759..5f403775 100644 --- a/packages/gitbeaker-core/src/services/ProjectBadges.ts +++ b/packages/gitbeaker-core/src/services/ProjectBadges.ts @@ -1,23 +1,52 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceBadges } from '../templates'; -import { BaseRequestOptions, PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceBadges, BadgeSchema } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface ProjectBadges extends ResourceBadges { - add(projectId: string | number, options?: BaseRequestOptions); - - all(projectId: string | number, options?: PaginatedRequestOptions); - - edit(projectId: string | number, badgeId: number, options?: BaseRequestOptions); - - preview(projectId: string | number, linkUrl: string, imageUrl: string, options?: Sudo); - - remove(projectId: string | number, badgeId: number, options?: Sudo); - - show(projectId: string | number, badgeId: number, options?: Sudo); +export interface ProjectBadgeSchema extends BadgeSchema { + kind: 'project'; } -export class ProjectBadges extends ResourceBadges { - constructor(options: BaseServiceOptions = {}) { - super('projects', options); +export interface ProjectBadges extends ResourceBadges { + add( + productId: string | number, + options?: BaseRequestOptions, + ): Promise>; + + all( + productId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; + + edit( + productId: string | number, + badgeId: number, + options?: BaseRequestOptions, + ): Promise>; + + preview( + productId: string | number, + linkUrl: string, + imageUrl: string, + options?: Sudo, + ): Promise>>; + + remove(productId: string | number, badgeId: number, options?: Sudo): Promise; + + show( + productId: string | number, + badgeId: number, + options?: Sudo, + ): Promise>; +} + +export class ProjectBadges extends ResourceBadges { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ + super('groups', options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectCustomAttributes.ts b/packages/gitbeaker-core/src/services/ProjectCustomAttributes.ts index e57791b3..47046617 100644 --- a/packages/gitbeaker-core/src/services/ProjectCustomAttributes.ts +++ b/packages/gitbeaker-core/src/services/ProjectCustomAttributes.ts @@ -1,19 +1,33 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceCustomAttributes } from '../templates'; -import { PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceCustomAttributes, CustomAttributeSchema } from '../templates'; +import { PaginatedRequestOptions, CamelizedRecord, Sudo } from '../infrastructure'; -export interface ProjectCustomAttributes extends ResourceCustomAttributes { - all(projectId: string | number, options?: PaginatedRequestOptions); +export interface ProjectCustomAttributes + extends ResourceCustomAttributes { + all( + projectId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; - set(projectId: string | number, customAttributeId: number, value: string, options?: Sudo); + set( + projectId: string | number, + customAttributeId: number, + value: string, + options?: Sudo, + ): Promise>; - remove(projectId: string | number, customAttributeId: number, options?: Sudo); + remove(projectId: string | number, customAttributeId: number, options?: Sudo): Promise; - show(projectId: string | number, customAttributeId: number, options?: Sudo); + show( + projectId: string | number, + customAttributeId: number, + options?: Sudo, + ): Promise>; } -export class ProjectCustomAttributes extends ResourceCustomAttributes { - constructor(options: BaseServiceOptions = {}) { +export class ProjectCustomAttributes extends ResourceCustomAttributes { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectDeployTokens.ts b/packages/gitbeaker-core/src/services/ProjectDeployTokens.ts index 7aa1697d..08682dc6 100644 --- a/packages/gitbeaker-core/src/services/ProjectDeployTokens.ts +++ b/packages/gitbeaker-core/src/services/ProjectDeployTokens.ts @@ -1,8 +1,33 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceDeployTokens } from '../templates'; +import { ResourceDeployTokens, DeployTokenScope, DeployTokenSchema } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + CamelizedRecord, + Sudo, +} from '../infrastructure'; -export class ProjectDeployTokens extends ResourceDeployTokens { - constructor(options: BaseServiceOptions = {}) { +export interface ProjectDeployTokens extends ResourceDeployTokens { + add( + projectId: string | number, + tokenName: string, + tokenScopes: DeployTokenScope[], + options?: BaseRequestOptions, + ): Promise>; + + all({ + projectId, + ...options + }: { projectId?: string | number } & PaginatedRequestOptions): Promise< + CamelizedRecord[] + >; + + remove(projectId: string | number, tokenId: number, options?: Sudo): Promise; +} + +export class ProjectDeployTokens extends ResourceDeployTokens { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectHooks.ts b/packages/gitbeaker-core/src/services/ProjectHooks.ts index 37c1e858..6c7a9468 100644 --- a/packages/gitbeaker-core/src/services/ProjectHooks.ts +++ b/packages/gitbeaker-core/src/services/ProjectHooks.ts @@ -6,34 +6,61 @@ import { Sudo, } from '../infrastructure'; -export class ProjectHooks extends BaseService { +export interface ProjectHookSchema extends Record { + id: number; + url: string; + project_id: number; + push_events: boolean; + push_events_branch_filter: string; + issues_events: boolean; + confidential_issues_events: boolean; + merge_requests_events: boolean; + tag_push_events: boolean; + note_events: boolean; + confidential_note_events: boolean; + job_events: boolean; + pipeline_events: boolean; + wiki_page_events: boolean; + deployment_events: boolean; + releases_events: boolean; + enable_ssl_verification: boolean; + created_at: string; +} + +export class ProjectHooks extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/hooks`, options); + return RequestHelper.get()(this, `projects/${pId}/hooks`, options); } show(projectId: string | number, hookId: number, options?: Sudo) { const [pId, hId] = [projectId, hookId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/hooks/${hId}`, options); + return RequestHelper.get()(this, `projects/${pId}/hooks/${hId}`, options); } add(projectId: string | number, url: string, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/hooks`, { url, ...options }); + return RequestHelper.post()(this, `projects/${pId}/hooks`, { + url, + ...options, + }); } edit(projectId: string | number, hookId: number, url: string, options?: BaseRequestOptions) { const [pId, hId] = [projectId, hookId].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/hooks/${hId}`, { url, ...options }); + return RequestHelper.put()(this, `projects/${pId}/hooks/${hId}`, { + url, + ...options, + }); } remove(projectId: string | number, hookId: number, options?: Sudo) { const [pId, hId] = [projectId, hookId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/hooks/${hId}`, options); + return RequestHelper.del()(this, `projects/${pId}/hooks/${hId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectImportExport.ts b/packages/gitbeaker-core/src/services/ProjectImportExport.ts index c3fab20e..a24d0568 100644 --- a/packages/gitbeaker-core/src/services/ProjectImportExport.ts +++ b/packages/gitbeaker-core/src/services/ProjectImportExport.ts @@ -1,6 +1,43 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, Sudo, BaseRequestOptions } from '../infrastructure'; +export interface ExportStatusSchema extends Record { + id: number; + description: string; + name: string; + name_with_namespace: string; + path: string; + path_with_namespace: string; + created_at: string; + export_status: string; + _links: { + api_url: string; + web_url: string; + }; +} + +export interface FailedRelationSchema { + id: number; + created_at: string; + exception_class: string; + exception_message: string; + source: string; + relation_name: string; +} + +export interface ImportStatusSchema extends Record { + id: number; + description: string; + name: string; + name_with_namespace: string; + path: string; + path_with_namespace: string; + created_at: string; + import_status: string; + correlation_id: string; + failed_relations?: FailedRelationSchema[]; +} + export interface UploadMetadata { filename?: string; contentType?: string; @@ -11,17 +48,17 @@ export const defaultMetadata = { contentType: 'application/octet-stream', }; -export class ProjectImportExport extends BaseService { +export class ProjectImportExport extends BaseService { download(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/export/download`, options); + return RequestHelper.get()(this, `projects/${pId}/export/download`, options); } exportStatus(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/export`, options); + return RequestHelper.get()(this, `projects/${pId}/export`, options); } import( @@ -29,7 +66,7 @@ export class ProjectImportExport extends BaseService { path: string, { metadata, ...options }: { metadata?: UploadMetadata } & BaseRequestOptions = {}, ) { - return RequestHelper.post(this, 'projects/import', { + return RequestHelper.post()(this, 'projects/import', { isForm: true, ...options, file: [content, { ...defaultMetadata, ...metadata }], @@ -40,12 +77,12 @@ export class ProjectImportExport extends BaseService { importStatus(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/import`, options); + return RequestHelper.get()(this, `projects/${pId}/import`, options); } schedule(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/export`, options); + return RequestHelper.post<{ message: string }>()(this, `projects/${pId}/export`, options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectIssueBoards.ts b/packages/gitbeaker-core/src/services/ProjectIssueBoards.ts index 932c8fe5..59fab075 100644 --- a/packages/gitbeaker-core/src/services/ProjectIssueBoards.ts +++ b/packages/gitbeaker-core/src/services/ProjectIssueBoards.ts @@ -1,37 +1,91 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceIssueBoards } from '../templates'; -import { BaseRequestOptions, PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ProjectSchema } from './Projects'; +import { ResourceIssueBoards, IssueBoardSchema, IssueBoardListSchema } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface ProjectIssueBoards extends ResourceIssueBoards { - all(projectId: string | number, options?: PaginatedRequestOptions); +export interface ProjectIssueBoardSchema extends IssueBoardSchema { + project: Pick< + ProjectSchema, + | 'id' + | 'name' + | 'name_with_namespace' + | 'path' + | 'path_with_namespace' + | 'http_url_to_repo' + | 'web_url' + >; +} - create(projectId: string | number, name: string, options?: Sudo); +export interface ProjectIssueBoards extends ResourceIssueBoards { + all( + groupId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; - createList(projectId: string | number, boardId: number, labelId: number, options?: Sudo); + create( + groupId: string | number, + name: string, + options?: Sudo, + ): Promise>; - edit(projectId: string | number, boardId: number, options?: BaseRequestOptions); + createList( + groupId: string | number, + boardId: number, + labelId: number | string, + options?: Sudo, + ): Promise>; + + edit( + groupId: string | number, + boardId: number, + options?: BaseRequestOptions, + ): Promise>; editList( - projectId: string | number, + groupId: string | number, boardId: number, listId: number, position: number, options?: Sudo, - ); + ): Promise>; - lists(projectId: string | number, boardId: number, options?: Sudo); + lists( + groupId: string | number, + boardId: number, + options?: Sudo, + ): Promise[]>; - remove(projectId: string | number, boardId: number, options?: Sudo); + remove(groupId: string | number, boardId: number, options?: Sudo): Promise; - removeList(projectId: string | number, boardId: number, listId: number, options?: Sudo); + removeList( + groupId: string | number, + boardId: number, + listId: number, + options?: Sudo, + ): Promise; - show(projectId: string | number, boardId: number, options?: Sudo); + show( + groupId: string | number, + boardId: number, + options?: Sudo, + ): Promise>; - showList(projectId: string | number, boardId: number, listId: number, options?: Sudo); + showList( + groupId: string | number, + boardId: number, + listId: number, + options?: Sudo, + ): Promise>; } -export class ProjectIssueBoards extends ResourceIssueBoards { - constructor(options: BaseServiceOptions = {}) { +export class ProjectIssueBoards extends ResourceIssueBoards { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectMembers.ts b/packages/gitbeaker-core/src/services/ProjectMembers.ts index 9b5ed0ff..4749a497 100644 --- a/packages/gitbeaker-core/src/services/ProjectMembers.ts +++ b/packages/gitbeaker-core/src/services/ProjectMembers.ts @@ -1,8 +1,44 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceMembers } from '../templates'; +import { ResourceMembers, MembersSchema, IncludeInherited, AccessLevel } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + CamelizedRecord, + Sudo, +} from '../infrastructure'; -export class ProjectMembers extends ResourceMembers { - constructor(options: BaseServiceOptions = {}) { +export interface GroupMembers extends ResourceMembers { + add( + projectId: string | number, + userId: number, + accessLevel: AccessLevel, + options?: BaseRequestOptions, + ): Promise>; + + all( + projectId: string | number, + options?: IncludeInherited & PaginatedRequestOptions, + ): Promise[]>; + + edit( + projectId: string | number, + userId: number, + accessLevel: AccessLevel, + options?: BaseRequestOptions, + ): Promise>; + + show( + projectId: string | number, + userId: number, + options?: IncludeInherited & Sudo, + ): Promise>; + + remove(projectId: string | number, userId: number, options?: Sudo): Promise; +} + +export class ProjectMembers extends ResourceMembers { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectMilestones.ts b/packages/gitbeaker-core/src/services/ProjectMilestones.ts index b6da5d31..5a80b2f3 100644 --- a/packages/gitbeaker-core/src/services/ProjectMilestones.ts +++ b/packages/gitbeaker-core/src/services/ProjectMilestones.ts @@ -1,23 +1,54 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceMilestones } from '../templates'; -import { PaginatedRequestOptions, BaseRequestOptions, Sudo } from '../infrastructure'; +import type { IssueSchema } from './Issues'; +import type { MergeRequestSchema } from './MergeRequests'; +import { ResourceMilestones, MilestoneSchema } from '../templates'; +import { + PaginatedRequestOptions, + BaseRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface ProjectMilestones extends ResourceMilestones { - all(projectId: string | number, options?: PaginatedRequestOptions); +export interface ProjectMilestones extends ResourceMilestones { + all( + projectId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; - create(projectId: string | number, title: string, options?: BaseRequestOptions); + create( + projectId: string | number, + title: string, + options?: BaseRequestOptions, + ): Promise>; - edit(projectId: string | number, milestoneId: number, options?: BaseRequestOptions); + edit( + projectId: string | number, + milestoneId: number, + options?: BaseRequestOptions, + ): Promise>; - issues(projectId: string | number, milestoneId: number, options?: Sudo); + issues( + projectId: string | number, + milestoneId: number, + options?: Sudo, + ): Promise[]>; - mergeRequests(projectId: string | number, milestoneId: number, options?: Sudo); + mergeRequests( + projectId: string | number, + milestoneId: number, + options?: Sudo, + ): Promise[]>; - show(projectId: string | number, milestoneId: number, options?: Sudo); + show( + projectId: string | number, + milestoneId: number, + options?: Sudo, + ): Promise>; } -export class ProjectMilestones extends ResourceMilestones { - constructor(options: BaseServiceOptions = {}) { +export class ProjectMilestones extends ResourceMilestones { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectSnippetAwardEmojis.ts b/packages/gitbeaker-core/src/services/ProjectSnippetAwardEmojis.ts index f8b555e2..18983b40 100644 --- a/packages/gitbeaker-core/src/services/ProjectSnippetAwardEmojis.ts +++ b/packages/gitbeaker-core/src/services/ProjectSnippetAwardEmojis.ts @@ -1,42 +1,40 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceAwardEmojis } from '../templates'; -import { PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceAwardEmojis, AwardEmojiSchema } from '../templates'; +import { PaginatedRequestOptions, Sudo, CamelizedRecord } from '../infrastructure'; -export interface ProjectSnippetAwardEmojis extends ResourceAwardEmojis { +export interface ProjectSnippetAwardEmojis + extends ResourceAwardEmojis { all( projectId: string | number, - issueId: string | number, - noteId: number, + snippetIId: number, options?: PaginatedRequestOptions, - ); + ): Promise[]>; award( projectId: string | number, - issueId: string | number, - noteId: number, + snippetIId: number, name: string, options?: Sudo, - ); + ): Promise>; remove( projectId: string | number, - issueId: string | number, + snippetIId: number, awardId: number, - noteId: number, options?: Sudo, - ); + ): Promise; show( projectId: string | number, - issueId: string | number, + snippetIId: number, awardId: number, - noteId: number, options?: Sudo, - ); + ): Promise>; } -export class ProjectSnippetAwardEmojis extends ResourceAwardEmojis { - constructor(options: BaseServiceOptions = {}) { - super('issues', options); +export class ProjectSnippetAwardEmojis extends ResourceAwardEmojis { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ + super('snippets', options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectSnippetDiscussions.ts b/packages/gitbeaker-core/src/services/ProjectSnippetDiscussions.ts index 89a3d6d3..894b78b5 100644 --- a/packages/gitbeaker-core/src/services/ProjectSnippetDiscussions.ts +++ b/packages/gitbeaker-core/src/services/ProjectSnippetDiscussions.ts @@ -1,39 +1,49 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceDiscussions } from '../templates'; -import { BaseRequestOptions, PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceDiscussions, DiscussionSchema } from '../templates'; +import { + BaseRequestOptions, + PaginatedRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface ProjectSnippetDiscussions extends ResourceDiscussions { +export interface ProjectSnippetDiscussions + extends ResourceDiscussions { addNote( projectId: string | number, snippetId: string | number, - discussionId: string | number, + discussionId: number, noteId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; - all(projectId: string | number, snippetId: string | number, options?: PaginatedRequestOptions); + all( + projectId: string | number, + issueId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; create( projectId: string | number, snippetId: string | number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; editNote( projectId: string | number, snippetId: string | number, - discussionId: string | number, + discussionId: number, noteId: number, content: string, options?: BaseRequestOptions, - ); + ): Promise>; removeNote( projectId: string | number, snippetId: string | number, - discussionId: string | number, + discussionId: number, noteId: number, options?: Sudo, ); @@ -41,13 +51,14 @@ export interface ProjectSnippetDiscussions extends ResourceDiscussions { show( projectId: string | number, snippetId: string | number, - discussionId: string | number, + discussionId: number, options?: Sudo, - ); + ): Promise>; } -export class ProjectSnippetDiscussions extends ResourceDiscussions { - constructor(options: BaseServiceOptions = {}) { +export class ProjectSnippetDiscussions extends ResourceDiscussions { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', 'snippets', options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectSnippetNotes.ts b/packages/gitbeaker-core/src/services/ProjectSnippetNotes.ts index 65e52a49..f1061053 100644 --- a/packages/gitbeaker-core/src/services/ProjectSnippetNotes.ts +++ b/packages/gitbeaker-core/src/services/ProjectSnippetNotes.ts @@ -1,16 +1,30 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceNotes } from '../templates'; -import { PaginatedRequestOptions, BaseRequestOptions, Sudo } from '../infrastructure'; +import { ResourceNotes, NoteSchema } from '../templates'; +import { + PaginatedRequestOptions, + BaseRequestOptions, + Sudo, + CamelizedRecord, +} from '../infrastructure'; -export interface ProjectSnippetNotes extends ResourceNotes { - all(projectId: string | number, snippetId: string | number, options?: PaginatedRequestOptions); +export interface SnippetNoteSchema extends NoteSchema { + file_name: string; + expires_at: string; +} + +export interface ProjectSnippetNotes extends ResourceNotes { + all( + projectId: string | number, + snippetId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; create( projectId: string | number, snippetId: string | number, body: string, options?: BaseRequestOptions, - ); + ): Promise>; edit( projectId: string | number, @@ -18,15 +32,21 @@ export interface ProjectSnippetNotes extends ResourceNotes { noteId: number, body: string, options?: BaseRequestOptions, - ); + ): Promise>; remove(projectId: string | number, snippetId: string | number, noteId: number, options?: Sudo); - show(projectId: string | number, snippetId: string | number, noteId: number, options?: Sudo); + show( + projectId: string | number, + snippetId: string | number, + noteId: number, + options?: Sudo, + ): Promise>; } -export class ProjectSnippetNotes extends ResourceNotes { - constructor(options: BaseServiceOptions = {}) { +export class ProjectSnippetNotes extends ResourceNotes { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', 'snippets', options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectSnippets.ts b/packages/gitbeaker-core/src/services/ProjectSnippets.ts index dad3e189..7ccfa261 100644 --- a/packages/gitbeaker-core/src/services/ProjectSnippets.ts +++ b/packages/gitbeaker-core/src/services/ProjectSnippets.ts @@ -5,20 +5,33 @@ import { RequestHelper, Sudo, } from '../infrastructure'; - import { SnippetVisibility } from './Snippets'; +import { UserSchema } from './Users'; -export class ProjectSnippets extends BaseService { +export interface ProjectSnippetSchema extends Record { + id: number; + title: string; + file_name: string; + description: string; + author: Pick; + updated_at: string; + created_at: string; + project_id: number; + web_url: string; + raw_url: string; +} + +export class ProjectSnippets extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/snippets`, options); + return RequestHelper.get()(this, `projects/${pId}/snippets`, options); } content(projectId: string | number, snippetId: number, options?: Sudo) { const [pId, sId] = [projectId, snippetId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/snippets/${sId}/raw`, options); + return RequestHelper.get()(this, `projects/${pId}/snippets/${sId}/raw`, options); } create( @@ -31,7 +44,7 @@ export class ProjectSnippets extends BaseService { ) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/snippets`, { + return RequestHelper.post()(this, `projects/${pId}/snippets`, { title, fileName, code, @@ -43,24 +56,36 @@ export class ProjectSnippets extends BaseService { edit(projectId: string | number, snippetId: number, options?: BaseRequestOptions) { const [pId, sId] = [projectId, snippetId].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/snippets/${sId}`, options); + return RequestHelper.put()( + this, + `projects/${pId}/snippets/${sId}`, + options, + ); } remove(projectId: string | number, snippetId: number, options?: Sudo) { const [pId, sId] = [projectId, snippetId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/snippets/${sId}`, options); + return RequestHelper.del()(this, `projects/${pId}/snippets/${sId}`, options); } show(projectId: string | number, snippetId: number, options?: Sudo) { const [pId, sId] = [projectId, snippetId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/snippets/${sId}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/snippets/${sId}`, + options, + ); } userAgentDetails(projectId: string | number, snippetId: number, options?: Sudo) { const [pId, sId] = [projectId, snippetId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/snippets/${sId}/user_agent_detail`, options); + return RequestHelper.get<{ + user_agent: string; + ip_address: string; + akismet_submitted: boolean; + }>()(this, `projects/${pId}/snippets/${sId}/user_agent_detail`, options); } } diff --git a/packages/gitbeaker-core/src/services/ProjectVariables.ts b/packages/gitbeaker-core/src/services/ProjectVariables.ts index f5534701..b41e4806 100644 --- a/packages/gitbeaker-core/src/services/ProjectVariables.ts +++ b/packages/gitbeaker-core/src/services/ProjectVariables.ts @@ -1,28 +1,40 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; import { ResourceVariables, ResourceVariableSchema } from '../templates'; -import { PaginatedRequestOptions, BaseRequestOptions } from '../infrastructure'; +import { BaseRequestOptions, PaginatedRequestOptions, CamelizedRecord } from '../infrastructure'; -export interface ProjectVariables extends ResourceVariables { +export interface ProjectVariables extends ResourceVariables { all( projectId: string | number, options?: PaginatedRequestOptions, - ): Promise; + ): Promise[]>; - create(projectId: string | number, options?: BaseRequestOptions); + create( + projectId: string | number, + options?: BaseRequestOptions, + ): Promise>; - edit(projectId: string | number, keyId: string, options?: BaseRequestOptions); + edit( + projectId: string | number, + keyId: string, + options?: BaseRequestOptions, + ): Promise>; show( projectId: string | number, keyId: string, options?: PaginatedRequestOptions, - ): Promise; + ): Promise>; - remove(projectId: string | number, keyId: string, options?: PaginatedRequestOptions); + remove( + projectId: string | number, + keyId: string, + options?: PaginatedRequestOptions, + ): Promise; } -export class ProjectVariables extends ResourceVariables { - constructor(options: BaseServiceOptions = {}) { +export class ProjectVariables extends ResourceVariables { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('projects', options); } } diff --git a/packages/gitbeaker-core/src/services/Projects.ts b/packages/gitbeaker-core/src/services/Projects.ts index 2487eb70..cd0fff33 100644 --- a/packages/gitbeaker-core/src/services/Projects.ts +++ b/packages/gitbeaker-core/src/services/Projects.ts @@ -1,64 +1,160 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; +import { LicenseTemplateSchema } from './LicenseTemplates'; +import { UploadMetadata, defaultMetadata } from './ProjectImportExport'; import { BaseRequestOptions, PaginatedRequestOptions, RequestHelper, Sudo, } from '../infrastructure'; -import { EventOptions } from './Events'; -import { UploadMetadata, defaultMetadata } from './ProjectImportExport'; +import { AccessLevel } from '../templates'; -export interface NamespaceInfoSchemaDefault { +// TODO add missing functions +export interface ProjectSchema extends Record { + id: number; + description?: string; + default_branch: string; + ssh_url_to_repo: string; + http_url_to_repo: string; + web_url: string; + readme_url: string; + tag_list?: string[]; + name: string; + name_with_namespace: string; + path: string; + path_with_namespace: string; + created_at: string; + last_activity_at: string; + forks_count: number; + avatar_url: string; + star_count: number; +} + +export interface NamespaceInfoSchema extends Record { id: number; name: string; path: string; kind: string; full_path: string; + avatar_url: string; + web_url: string; } -export interface NamespaceInfoSchemaCamelize { - id: number; - name: string; - path: string; - kind: string; - fullPath: string; +export interface AccessSchema { + access_level: AccessLevel; + notification_level: number; } -export interface ProjectSchemaDefault { - id: number; - name: string; - name_with_namespace: string; - path: string; - path_with_namespace: string; - namespace: NamespaceInfoSchemaDefault; - ssh_url_to_repo: string; - http_url_to_repo: string; +export interface SharedWithGroupSchema { + group_id: number; + group_name: string; + group_full_path: string; + group_access_level: number; +} + +export interface ProjectExtendedSchema extends ProjectSchema { + visibility: string; + owner: Pick; + issues_enabled: boolean; + open_issues_count: number; + merge_requests_enabled: boolean; + jobs_enabled: boolean; + wiki_enabled: boolean; + snippets_enabled: boolean; + can_create_merge_request_in: boolean; + resolve_outdated_diff_discussions: boolean; + container_registry_enabled: boolean; + container_expiration_policy: { + cadence: string; + enabled: boolean; + keep_n?: number; + older_than?: string; + name_regex_delete?: string; + name_regex_keep?: string; + next_run_at: string; + }; + creator_id: number; + namespace: NamespaceInfoSchema; + import_status: string; + import_error?: string; + permissions: { + project_access: AccessSchema; + group_access: AccessSchema; + }; archived: boolean; + license_url: string; + license: Pick; + shared_runners_enabled: boolean; + runners_token: string; + ci_default_git_depth: number; + ci_forward_deployment_enabled: boolean; + public_jobs: boolean; + shared_with_groups?: SharedWithGroupSchema[]; + repository_storage: string; + only_allow_merge_if_pipeline_succeeds: boolean; + allow_merge_on_skipped_pipeline: boolean; + restrict_user_defined_variables: boolean; + only_allow_merge_if_all_discussions_are_resolved: boolean; + remove_source_branch_after_merge: boolean; + printing_merge_requests_link_enabled: boolean; + request_access_enabled: boolean; + merge_method: string; + auto_devops_enabled: boolean; + auto_devops_deploy_strategy: string; + approvals_before_merge: number; + mirror: boolean; + mirror_user_id: number; + mirror_trigger_builds: boolean; + only_mirror_protected_branches: boolean; + mirror_overwrites_diverged_branches: boolean; + external_authorization_classification_label?: string; + packages_enabled: boolean; + service_desk_enabled: boolean; + service_desk_address?: string; + autoclose_referenced_issues: boolean; + suggestion_commit_message?: string; + marked_for_deletion_at: string; + marked_for_deletion_on: string; + compliance_frameworks?: string[]; + statistics: { + commit_count: number; + storage_size: number; + repository_size: number; + wiki_size: number; + lfs_objects_size: number; + job_artifacts_size: number; + packages_size: number; + snippets_size: number; + }; + container_registry_image_prefix: string; + _links: { + self: string; + issues: string; + merge_requests: string; + repo_branches: string; + labels: string; + events: string; + members: string; + }; } -export interface ProjectSchemaCamelized { - id: number; - name: string; - nameWithNamespace: string; - path: string; - pathWithNamespace: string; - namespace: NamespaceInfoSchemaCamelize; - sshUrlToRepo: string; - httpUrlToRepo: string; - archived: boolean; +export interface ProjectFileUploadSchema extends Record { + alt: string; + url: string; + full_path: string; + markdown: string; } -export type ProjectSchema = ProjectSchemaDefault | ProjectSchemaCamelized; - -export class Projects extends BaseService { +export class Projects extends BaseService { all(options?: PaginatedRequestOptions) { - return RequestHelper.get(this, 'projects', options) as Promise; + return RequestHelper.get()(this, 'projects', options); } archive(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/archive`, options); + return RequestHelper.post()(this, `projects/${pId}/archive`, options); } create({ @@ -67,19 +163,13 @@ export class Projects extends BaseService { }: ({ name: string } | { path: string }) & { userId?: number } & BaseRequestOptions) { const url = userId ? `projects/user/${encodeURIComponent(userId)}` : 'projects'; - return RequestHelper.post(this, url, options); + return RequestHelper.post()(this, url, options); } edit(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.put(this, `projects/${pId}`, options); - } - - events(projectId: string | number, options?: BaseRequestOptions & EventOptions) { - const pId = encodeURIComponent(projectId); - - return RequestHelper.get(this, `projects/${pId}/events`, options); + return RequestHelper.put()(this, `projects/${pId}`, options); } fork( @@ -91,43 +181,48 @@ export class Projects extends BaseService { if (forkedFromId) url += `/${encodeURIComponent(forkedFromId)}`; - return RequestHelper.post(this, url, options); + return RequestHelper.post()(this, url, options); } forks(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/forks`, options); + return RequestHelper.get()(this, `projects/${pId}/forks`, options); } languages(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/languages`, options); + return RequestHelper.get<{ [name: string]: number }>()( + this, + `projects/${pId}/languages`, + options, + ); } mirrorPull(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/mirror/pull`, options); + return RequestHelper.post()(this, `projects/${pId}/mirror/pull`, options); } remove(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.del(this, `projects/${pId}`, options); + return RequestHelper.del()(this, `projects/${pId}`, options); } removeFork(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.del(this, `projects/${pId}/fork`, options); + return RequestHelper.del()(this, `projects/${pId}/fork`, options); } search(projectName: string, options?: BaseRequestOptions) { - return RequestHelper.get(this, 'projects', { search: projectName, ...options }) as Promise< - ProjectSchema[] - >; + return RequestHelper.get()(this, 'projects', { + search: projectName, + ...options, + }); } share( @@ -138,58 +233,58 @@ export class Projects extends BaseService { ) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/share`, { groupId, groupAccess, ...options }); + return RequestHelper.post()(this, `projects/${pId}/share`, { + groupId, + groupAccess, + ...options, + }); } show(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}`, options); + return RequestHelper.get()(this, `projects/${pId}`, options); } star(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/star`, options); - } - - statuses(projectId: string | number, sha: string, state: string, options?: BaseRequestOptions) { - const pId = encodeURIComponent(projectId); - - return RequestHelper.post(this, `projects/${pId}/statuses/${sha}`, { state, ...options }); + return RequestHelper.post()(this, `projects/${pId}/star`, options); } transfer(projectId: string | number, namespaceId: string | number) { const pId = encodeURIComponent(projectId); - return RequestHelper.put(this, `projects/${pId}/transfer`, { namespace: namespaceId }); + return RequestHelper.put()(this, `projects/${pId}/transfer`, { + namespace: namespaceId, + }); } unarchive(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/unarchive`, options); + return RequestHelper.post()(this, `projects/${pId}/unarchive`, options); } unshare(projectId: string | number, groupId: string | number, options?: Sudo) { const [pId, gId] = [projectId, groupId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/share/${gId}`, options); + return RequestHelper.del()(this, `projects/${pId}/share/${gId}`, options); } unstar(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/unstar`, options); + return RequestHelper.post()(this, `projects/${pId}/unstar`, options); } upload( - projectId, - content, + projectId: string | number, + content: string, { metadata, ...options }: { metadata?: UploadMetadata } & BaseRequestOptions = {}, ) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/uploads`, { + return RequestHelper.post()(this, `projects/${pId}/uploads`, { isForm: true, file: [content, { ...defaultMetadata, ...metadata }], ...options, diff --git a/packages/gitbeaker-core/src/services/ProtectedBranches.ts b/packages/gitbeaker-core/src/services/ProtectedBranches.ts index 7358bd44..2dacb2c6 100644 --- a/packages/gitbeaker-core/src/services/ProtectedBranches.ts +++ b/packages/gitbeaker-core/src/services/ProtectedBranches.ts @@ -6,17 +6,37 @@ import { Sudo, } from '../infrastructure'; -export class ProtectedBranches extends BaseService { - all(projectId: string | number, options?: PaginatedRequestOptions) { +export interface ProtectedBranchAccessLevelSchema { + access_level: 0 | 30 | 40 | 60; + access_level_description: string; + user_id?: number; + group_id?: number; +} + +export interface ProtectedBranchSchema extends Record { + id: number; + name: string; + push_access_levels?: ProtectedBranchAccessLevelSchema[]; + merge_access_levels?: ProtectedBranchAccessLevelSchema[]; + allow_force_push: boolean; + code_owner_approval_required: boolean; +} + +export class ProtectedBranches extends BaseService { + all(projectId: string | number, options: { search?: string } & PaginatedRequestOptions = {}) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/protected_branches`, options); + return RequestHelper.get()( + this, + `projects/${pId}/protected_branches`, + options, + ); } protect(projectId: string | number, branchName: string, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/protected_branches`, { + return RequestHelper.post()(this, `projects/${pId}/protected_branches`, { name: branchName, ...options, }); @@ -25,12 +45,16 @@ export class ProtectedBranches extends BaseService { show(projectId: string | number, branchName: string, options?: Sudo) { const [pId, bName] = [projectId, branchName].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/protected_branches/${bName}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/protected_branches/${bName}`, + options, + ); } unprotect(projectId: string | number, branchName: string, options?: Sudo) { const [pId, bName] = [projectId, branchName].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/protected_branches/${bName}`, options); + return RequestHelper.del()(this, `projects/${pId}/protected_branches/${bName}`, options); } } diff --git a/packages/gitbeaker-core/src/services/ProtectedTags.ts b/packages/gitbeaker-core/src/services/ProtectedTags.ts index a672a7dc..3b1232fb 100644 --- a/packages/gitbeaker-core/src/services/ProtectedTags.ts +++ b/packages/gitbeaker-core/src/services/ProtectedTags.ts @@ -6,17 +6,31 @@ import { Sudo, } from '../infrastructure'; -export class ProtectedTags extends BaseService { +export interface ProtectedTagAccessLevelSchema { + access_level: 0 | 30 | 40 | 60; + access_level_description: string; +} + +export interface ProtectedTagSchema extends Record { + name: string; + create_access_levels?: ProtectedTagAccessLevelSchema[]; +} + +export class ProtectedTags extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/protected_tags`, options); + return RequestHelper.get()( + this, + `projects/${pId}/protected_tags`, + options, + ); } protect(projectId: string | number, tagName: string, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/protected_tags`, { + return RequestHelper.post()(this, `projects/${pId}/protected_tags`, { name: tagName, ...options, }); @@ -25,12 +39,16 @@ export class ProtectedTags extends BaseService { show(projectId: string | number, tagName: string, options?: Sudo) { const [pId, tName] = [projectId, tagName].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/protected_tags/${tName}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/protected_tags/${tName}`, + options, + ); } unprotect(projectId: string | number, tagName: string, options?: Sudo) { const [pId, tName] = [projectId, tagName].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/protected_tags/${tName}`, options); + return RequestHelper.del()(this, `projects/${pId}/protected_tags/${tName}`, options); } } diff --git a/packages/gitbeaker-core/src/services/PushRules.ts b/packages/gitbeaker-core/src/services/PushRules.ts index c39fe63f..f7e06032 100644 --- a/packages/gitbeaker-core/src/services/PushRules.ts +++ b/packages/gitbeaker-core/src/services/PushRules.ts @@ -1,28 +1,45 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, BaseRequestOptions, Sudo } from '../infrastructure'; -export class PushRules extends BaseService { +export interface PushRulesSchema extends Record { + id: number; + project_id: number; + commit_message_regex: string; + commit_message_negative_regex: string; + branch_name_regex: string; + deny_delete_tag: boolean; + created_at: string; + member_check: boolean; + prevent_secrets: boolean; + author_email_regex: string; + file_name_regex: string; + max_file_size: number; + commit_committer_check?: boolean; + reject_unsigned_commits?: boolean; +} + +export class PushRules extends BaseService { create(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/push_rule`, options); + return RequestHelper.post()(this, `projects/${pId}/push_rule`, options); } edit(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.put(this, `projects/${pId}/push_rule`, options); + return RequestHelper.put()(this, `projects/${pId}/push_rule`, options); } remove(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.del(this, `projects/${pId}/push_rule`, options); + return RequestHelper.del()(this, `projects/${pId}/push_rule`, options); } show(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/push_rule`, options); + return RequestHelper.get()(this, `projects/${pId}/push_rule`, options); } } diff --git a/packages/gitbeaker-core/src/services/ReleaseLinks.ts b/packages/gitbeaker-core/src/services/ReleaseLinks.ts index f00d377c..77e9d494 100644 --- a/packages/gitbeaker-core/src/services/ReleaseLinks.ts +++ b/packages/gitbeaker-core/src/services/ReleaseLinks.ts @@ -1,43 +1,77 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, PaginatedRequestOptions, Sudo } from '../infrastructure'; -export class ReleaseLinks extends BaseService { +export interface ReleaseLinkSchema extends Record { + id: number; + name: string; + url: string; + external: boolean; + link_type: string; +} + +export class ReleaseLinks extends BaseService { all(projectId: string | number, tagName: string, options?: PaginatedRequestOptions) { const [pId, tId] = [projectId, tagName].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/releases/${tId}/assets/links`, options); + return RequestHelper.get()( + this, + `projects/${pId}/releases/${tId}/assets/links`, + options, + ); } - create(projectId: string | number, tagName: string, name: string, url: string, options?: Sudo) { + create( + projectId: string | number, + tagName: string, + name: string, + url: string, + options?: Sudo & { filePath?: string; linkType?: string }, + ) { const [pId, tId] = [projectId, tagName].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/releases/${tId}/assets/links`, { - name, - url, - ...options, - }); + return RequestHelper.post()( + this, + `projects/${pId}/releases/${tId}/assets/links`, + { + name, + url, + ...options, + }, + ); } edit( projectId: string | number, tagName: string, linkId: number, - options?: Sudo & ({ name: string } | { url: string }), + options?: Sudo & { name?: string; url?: string; filePath?: string; linkType?: string }, ) { const [pId, tId, lId] = [projectId, tagName, linkId].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/releases/${tId}/assets/links/${lId}`, options); + return RequestHelper.put()( + this, + `projects/${pId}/releases/${tId}/assets/links/${lId}`, + options, + ); } remove(projectId: string | number, tagName: string, linkId: number, options?: Sudo) { const [pId, tId, lId] = [projectId, tagName, linkId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/releases/${tId}/assets/links/${lId}`, options); + return RequestHelper.del()( + this, + `projects/${pId}/releases/${tId}/assets/links/${lId}`, + options, + ); } show(projectId: string | number, tagName: string, linkId: number, options?: Sudo) { const [pId, tId, lId] = [projectId, tagName, linkId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/releases/${tId}/assets/links/${lId}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/releases/${tId}/assets/links/${lId}`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/Releases.ts b/packages/gitbeaker-core/src/services/Releases.ts index 282fe568..97be289c 100644 --- a/packages/gitbeaker-core/src/services/Releases.ts +++ b/packages/gitbeaker-core/src/services/Releases.ts @@ -1,4 +1,7 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; +import { CommitSchema } from './Commits'; +import { MilestoneSchema } from '../templates'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -6,34 +9,75 @@ import { Sudo, } from '../infrastructure'; -export class Releases extends BaseService { +export interface EvidenceSchema { + sha: string; + filepath: string; + collected_at: string; +} + +export interface SourceSchema { + format: string; + url: string; +} + +export interface LinkSchema { + id: number; + name: string; + url: string; + external: boolean; + link_type: string; +} + +export interface ReleaseSchema extends Record { + tag_name: string; + description: string; + name: string; + description_html: string; + created_at: string; + released_at: string; + user: Pick; + commit: CommitSchema; + milestones?: MilestoneSchema[]; + commit_path: string; + tag_path: string; + assets: { + count: number; + sources?: SourceSchema[]; + links?: LinkSchema[]; + evidence_file_path: string; + }; + evidences?: EvidenceSchema[]; +} + +// TODO: Add missing functions +export class Releases extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/releases`, options); + return RequestHelper.get()(this, `projects/${pId}/releases`, options); } create(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/releases`, options); + return RequestHelper.post()(this, `projects/${pId}/releases`, options); } edit(projectId: string | number, tagName: string, options?: BaseRequestOptions) { const [pId, tId] = [projectId, tagName].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/releases/${tId}`, options); + return RequestHelper.put()(this, `projects/${pId}/releases/${tId}`, options); } remove(projectId: string | number, tagName: string, options?: Sudo) { const [pId, tId] = [projectId, tagName].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/releases/${tId}`, options); + return RequestHelper.del()(this, `projects/${pId}/releases/${tId}`, options); } show(projectId: string | number, tagName: string, options?: Sudo) { const [pId, tId] = [projectId, tagName].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/releases/${tId}`, options); + return RequestHelper.get()(this, `projects/${pId}/releases/${tId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/Repositories.ts b/packages/gitbeaker-core/src/services/Repositories.ts index 3670ed47..67dae685 100644 --- a/packages/gitbeaker-core/src/services/Repositories.ts +++ b/packages/gitbeaker-core/src/services/Repositories.ts @@ -1,29 +1,71 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { CommitSchema, CommitDiffSchema } from './Commits'; import { RequestHelper, Sudo, BaseRequestOptions } from '../infrastructure'; type ArchiveType = 'tar.gz' | 'tar.bz2' | 'tbz' | 'tbz2' | 'tb2' | 'bz2' | 'tar' | 'zip'; -export class Repositories extends BaseService { +export interface RepositoryCompareSchema extends Record { + commit: Pick< + CommitSchema, + 'id' | 'short_id' | 'title' | 'author_name' | 'author_email' | 'created_at' + >; + commits?: Pick< + CommitSchema, + 'id' | 'short_id' | 'title' | 'author_name' | 'author_email' | 'created_at' + >[]; + diffs?: CommitDiffSchema[]; + compare_timeout: boolean; + compare_same_ref: boolean; +} + +export interface RepositoryContributorSchema extends Record { + name: string; + email: string; + commits: number; + additions: number; + deletions: number; +} + +export interface RepositoryTreeSchema extends Record { + id: string; + name: string; + type: string; + path: string; + mode: string; +} + +export class Repositories extends BaseService { compare(projectId: string | number, from: string, to: string, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/compare`, { - from, - to, - ...options, - }); + return RequestHelper.get()( + this, + `projects/${pId}/repository/compare`, + { + from, + to, + ...options, + }, + ); } contributors(projectId: string | number, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/contributors`, options); + return RequestHelper.get()( + this, + `projects/${pId}/repository/contributors`, + options, + ); } mergeBase(projectId: string | number, refs: string[], options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/merge_base`, { refs, ...options }); + return RequestHelper.get()(this, `projects/${pId}/repository/merge_base`, { + refs, + ...options, + }); } showArchive( @@ -32,24 +74,40 @@ export class Repositories extends BaseService { ) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/archive.${fileType}`, options); + return (RequestHelper.get()( + this, + `projects/${pId}/repository/archive.${fileType}`, + options as Record, + ) as unknown) as Promise; } showBlob(projectId: string | number, sha: string, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/blobs/${sha}`, options); + return (RequestHelper.get()( + this, + `projects/${pId}/repository/blobs/${sha}`, + options, + ) as unknown) as Promise; } showBlobRaw(projectId: string | number, sha: string, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/blobs/${sha}/raw`, options); + return (RequestHelper.get()( + this, + `projects/${pId}/repository/blobs/${sha}/raw`, + options, + ) as unknown) as Promise; } tree(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/tree`, options); + return RequestHelper.get()( + this, + `projects/${pId}/repository/tree`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/RepositoryFiles.ts b/packages/gitbeaker-core/src/services/RepositoryFiles.ts index 85ddfd79..6a7c60f2 100644 --- a/packages/gitbeaker-core/src/services/RepositoryFiles.ts +++ b/packages/gitbeaker-core/src/services/RepositoryFiles.ts @@ -1,7 +1,8 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { CommitSchema } from './Commits'; import { RequestHelper, BaseRequestOptions, Sudo } from '../infrastructure'; -export interface RepositoryFileSchemaDefault { +export interface RepositoryFileExtendedSchema extends Record { file_name: string; file_path: string; size: number; @@ -14,22 +15,17 @@ export interface RepositoryFileSchemaDefault { last_commit_id: string; } -export interface RepositoryFileSchemaCamelized { - fileName: string; - filePath: string; - size: number; - encoding: string; - content: string; - contentSha256: string; - ref: string; - blobId: string; - commitId: string; - lastCommitId: string; +export interface RepositoryFileBlameSchema extends Record { + commit: CommitSchema; + lines?: string[]; } -export type RepositoryFileSchema = RepositoryFileSchemaDefault | RepositoryFileSchemaCamelized; +export interface RepositoryFileSchema extends Record { + file_path: string; + branch: string; +} -export class RepositoryFiles extends BaseService { +export class RepositoryFiles extends BaseService { create( projectId: string | number, filePath: string, @@ -40,12 +36,16 @@ export class RepositoryFiles extends BaseService { ) { const [pId, path] = [projectId, filePath].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/repository/files/${path}`, { - branch, - content, - commitMessage, - ...options, - }); + return RequestHelper.post()( + this, + `projects/${pId}/repository/files/${path}`, + { + branch, + content, + commitMessage, + ...options, + }, + ); } edit( @@ -58,12 +58,16 @@ export class RepositoryFiles extends BaseService { ) { const [pId, path] = [projectId, filePath].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/repository/files/${path}`, { - branch, - content, - commitMessage, - ...options, - }); + return RequestHelper.put()( + this, + `projects/${pId}/repository/files/${path}`, + { + branch, + content, + commitMessage, + ...options, + }, + ); } remove( @@ -75,39 +79,42 @@ export class RepositoryFiles extends BaseService { ) { const [pId, path] = [projectId, filePath].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/repository/files/${path}`, { + return RequestHelper.del()(this, `projects/${pId}/repository/files/${path}`, { branch, commitMessage, ...options, }); } - show( - projectId: string | number, - filePath: string, - ref: string, - options?: Sudo, - ): Promise { + show(projectId: string | number, filePath: string, ref: string, options?: Sudo) { const [pId, path] = [projectId, filePath].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/repository/files/${path}`, { - ref, - ...options, - }) as Promise; + return RequestHelper.get()( + this, + `projects/${pId}/repository/files/${path}`, + { + ref, + ...options, + }, + ); } showBlame(projectId: string | number, filePath: string, options?: Sudo) { const [pId, path] = [projectId, filePath].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/repository/files/${path}/blame`, options); + return RequestHelper.get()( + this, + `projects/${pId}/repository/files/${path}/blame`, + options, + ); } showRaw(projectId: string | number, filePath: string, ref: string, options?: Sudo) { const [pId, path] = [projectId, filePath].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/repository/files/${path}/raw`, { + return (RequestHelper.get()(this, `projects/${pId}/repository/files/${path}/raw`, { ref, ...options, - }); + }) as unknown) as Promise; } } diff --git a/packages/gitbeaker-core/src/services/Runners.ts b/packages/gitbeaker-core/src/services/Runners.ts index 05389a31..163e8228 100644 --- a/packages/gitbeaker-core/src/services/Runners.ts +++ b/packages/gitbeaker-core/src/services/Runners.ts @@ -1,4 +1,6 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { ProjectSchema } from './Projects'; +import { JobSchema } from './Jobs'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -6,7 +8,7 @@ import { Sudo, } from '../infrastructure'; -export interface RunnerSchemaDefault { +export interface RunnerSchema extends Record { id: number; description: string; ip_address: string; @@ -14,67 +16,72 @@ export interface RunnerSchemaDefault { is_shared: boolean; name: string; online: boolean; - status: string; + status: 'running' | 'success' | 'failed' | 'canceled'; } -export interface RunnerSchemaCamelized { - id: number; +export interface RunnerExtendedSchema extends RunnerSchema { + architecture?: string; description: string; - ipAddress: string; - active: boolean; - isShared: boolean; - name: string; - online: boolean; - status: string; + contacted_at: string; + platform?: string; + projects?: Pick< + ProjectSchema, + 'id' | 'name' | 'name_with_namespace' | 'path' | 'path_with_namespace' + >; + revision?: string; + tag_list?: string[]; + version?: string; + access_level: string; + maximum_timeout?: number; } -// As of GitLab v12.6.2 -export type RunnerSchema = RunnerSchemaDefault | RunnerSchemaCamelized; - -export class Runners extends BaseService { +export class Runners extends BaseService { all({ projectId, ...options }: { projectId?: string | number } & PaginatedRequestOptions = {}) { const url = projectId ? `projects/${encodeURIComponent(projectId)}/runners` : 'runners/all'; - return RequestHelper.get(this, url, options); + return RequestHelper.get()(this, url, options); } allOwned(options?: BaseRequestOptions) { - return RequestHelper.get(this, 'runners', options); + return RequestHelper.get()(this, 'runners', options); } edit(runnerId: number, options?: BaseRequestOptions) { const rId = encodeURIComponent(runnerId); - return RequestHelper.put(this, `runners/${rId}`, options); + return RequestHelper.put()(this, `runners/${rId}`, options); } enable(projectId: string | number, runnerId: number, options?: Sudo) { const [pId, rId] = [projectId, runnerId].map(encodeURIComponent); - return RequestHelper.post(this, `projects/${pId}/runners`, { runnerId: rId, ...options }); + return RequestHelper.post()(this, `projects/${pId}/runners`, { + runnerId: rId, + ...options, + }); } disable(projectId: string | number, runnerId: number, options?: Sudo) { const [pId, rId] = [projectId, runnerId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/runners/${rId}`, options); + return RequestHelper.del()(this, `projects/${pId}/runners/${rId}`, options); } jobs(runnerId: number, options?: Sudo) { const rId = encodeURIComponent(runnerId); - return RequestHelper.get(this, `runners/${rId}/jobs`, options); + return RequestHelper.get()(this, `runners/${rId}/jobs`, options); } remove(runnerId: number, options?: Sudo) { const rId = encodeURIComponent(runnerId); - return RequestHelper.del(this, `runners/${rId}`, options); + return RequestHelper.del()(this, `runners/${rId}`, options); } show(runnerId: number, options?: Sudo) { const rId = encodeURIComponent(runnerId); - return RequestHelper.get(this, `runners/${rId}`, options); + return RequestHelper.get()(this, `runners/${rId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/Search.ts b/packages/gitbeaker-core/src/services/Search.ts index 8ab7cc9f..d5b9beda 100644 --- a/packages/gitbeaker-core/src/services/Search.ts +++ b/packages/gitbeaker-core/src/services/Search.ts @@ -1,7 +1,26 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, BaseRequestOptions } from '../infrastructure'; -export class Search extends BaseService { +export interface SearchResultSchema extends Record { + id: number; + description: string; + name: string; + name_with_namespace: string; + path: string; + path_with_namespace: string; + created_at: string; + default_branch: string; + tag_list?: string[]; + ssh_url_to_repo: string; + http_url_to_repo: string; + web_url: string; + avatar_url?: string; + star_count: number; + forks_count: number; + last_activity_at: string; +} + +export class Search extends BaseService { all( scope: string, search: string, @@ -19,6 +38,10 @@ export class Search extends BaseService { url += `groups/${encodeURIComponent(groupId)}/`; } - return RequestHelper.get(this, `${url}search`, { scope, search, ...options }); + return RequestHelper.get()(this, `${url}search`, { + scope, + search, + ...options, + }); } } diff --git a/packages/gitbeaker-core/src/services/Services.ts b/packages/gitbeaker-core/src/services/Services.ts index 04e4042c..b20e3d07 100644 --- a/packages/gitbeaker-core/src/services/Services.ts +++ b/packages/gitbeaker-core/src/services/Services.ts @@ -1,5 +1,10 @@ import { BaseService } from '@gitbeaker/requester-utils'; -import { RequestHelper, BaseRequestOptions, Sudo } from '../infrastructure'; +import { + RequestHelper, + BaseRequestOptions, + PaginatedRequestOptions, + Sudo, +} from '../infrastructure'; export type SupportedService = | 'asana' @@ -35,22 +40,57 @@ export type SupportedService = | 'mock-ci' | 'youtrack'; -export class Services extends BaseService { +export interface ServiceSchema extends Record { + id: number; + title: string; + slug: string; + created_at: string; + updated_at: string; + active: boolean; + commit_events: boolean; + push_events: boolean; + issues_events: boolean; + confidential_issues_events: boolean; + merge_requests_events: boolean; + tag_push_events: boolean; + note_events: boolean; + confidential_note_events: boolean; + pipeline_events: boolean; + wiki_page_events: boolean; + job_events: boolean; + comment_on_event_enabled: boolean; +} + +export class Services extends BaseService { + all(projectId: string | number, options?: PaginatedRequestOptions) { + const pId = encodeURIComponent(projectId); + + return RequestHelper.get()(this, `projects/${pId}/services`, options); + } + edit(projectId: string | number, serviceName: SupportedService, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.put(this, `projects/${pId}/services/${serviceName}`, options); + return RequestHelper.put()( + this, + `projects/${pId}/services/${serviceName}`, + options, + ); } remove(projectId: string | number, serviceName: SupportedService, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.del(this, `projects/${pId}/services/${serviceName}`, options); + return RequestHelper.del()(this, `projects/${pId}/services/${serviceName}`, options); } show(projectId: string | number, serviceName: SupportedService, options?: Sudo) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/services/${serviceName}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/services/${serviceName}`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/SidekiqMetrics.ts b/packages/gitbeaker-core/src/services/SidekiqMetrics.ts index 8ba4180d..4d5353a8 100644 --- a/packages/gitbeaker-core/src/services/SidekiqMetrics.ts +++ b/packages/gitbeaker-core/src/services/SidekiqMetrics.ts @@ -1,20 +1,58 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper } from '../infrastructure'; -export class SidekiqMetrics extends BaseService { +export interface ProcessMetricSchema { + hostname: string; + pid: number; + tag: string; + started_at: string; + queues?: string[]; + labels?: string[]; + concurrency: number; + busy: number; +} + +export interface SidekickProcessMetricsSchema extends Record { + processes?: ProcessMetricSchema[]; +} + +export interface SidekickQueueMetricsSchema extends Record { + queues: { + default: { + backlog: number; + latency: number; + }; + }; +} + +export interface SidekickJobStatsSchema extends Record { + jobs: { + processed: number; + failed: number; + enqueued: number; + dead: number; + }; +} + +export interface SidekickCompoundMetricsSchema + extends SidekickJobStatsSchema, + SidekickQueueMetricsSchema, + SidekickProcessMetricsSchema {} + +export class SidekiqMetrics extends BaseService { queueMetrics() { - return RequestHelper.get(this, 'sidekiq/queue_metrics'); + return RequestHelper.get()(this, 'sidekiq/queue_metrics'); } processMetrics() { - return RequestHelper.get(this, 'sidekiq/process_metrics'); + return RequestHelper.get()(this, 'sidekiq/process_metrics'); } jobStats() { - return RequestHelper.get(this, 'sidekiq/job_stats'); + return RequestHelper.get()(this, 'sidekiq/job_stats'); } compoundMetrics() { - return RequestHelper.get(this, 'sidekiq/compound_metrics'); + return RequestHelper.get()(this, 'sidekiq/compound_metrics'); } } diff --git a/packages/gitbeaker-core/src/services/Snippets.ts b/packages/gitbeaker-core/src/services/Snippets.ts index a1c182f5..a1a9c3e8 100644 --- a/packages/gitbeaker-core/src/services/Snippets.ts +++ b/packages/gitbeaker-core/src/services/Snippets.ts @@ -1,4 +1,5 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -8,17 +9,49 @@ import { export type SnippetVisibility = 'private' | 'public' | 'internal'; -export class Snippets extends BaseService { +export interface SnippetSchema extends Record { + id: number; + title: string; + file_name: string; + description?: string; + visibility: string; + author: Pick; + updated_at: string; + created_at: string; + project_id?: string | number; + web_url: string; + raw_url: string; +} + +export interface FileSchema { + path: string; + raw_url: string; +} + +export interface SnippetExtendedSchema extends SnippetSchema { + expires_at?: string; + ssh_url_to_repo: string; + http_url_to_repo: string; + files?: FileSchema[]; +} + +export interface UserAgentDetailSchema extends Record { + user_agent: string; + ip_address: string; + akismet_submitted: boolean; +} + +export class Snippets extends BaseService { all({ public: p, ...options }: { public?: boolean } & PaginatedRequestOptions = {}) { const url = p ? 'snippets/public' : 'snippets'; - return RequestHelper.get(this, url, options); + return RequestHelper.get()(this, url, options); } content(snippetId: number, options?: Sudo) { const sId = encodeURIComponent(snippetId); - return RequestHelper.get(this, `snippets/${sId}/raw`, options); + return RequestHelper.get()(this, `snippets/${sId}/raw`, options); } create( @@ -28,7 +61,7 @@ export class Snippets extends BaseService { visibility: SnippetVisibility, options?: BaseRequestOptions, ) { - return RequestHelper.post(this, 'snippets', { + return RequestHelper.post()(this, 'snippets', { title, fileName, content, @@ -40,24 +73,28 @@ export class Snippets extends BaseService { edit(snippetId: number, options?: BaseRequestOptions) { const sId = encodeURIComponent(snippetId); - return RequestHelper.put(this, `snippets/${sId}`, options); + return RequestHelper.put()(this, `snippets/${sId}`, options); } remove(snippetId: number, options?: Sudo) { const sId = encodeURIComponent(snippetId); - return RequestHelper.del(this, `snippets/${sId}`, options); + return RequestHelper.del()(this, `snippets/${sId}`, options); } show(snippetId: number, options?: Sudo) { const sId = encodeURIComponent(snippetId); - return RequestHelper.get(this, `snippets/${sId}`, options); + return RequestHelper.get()(this, `snippets/${sId}`, options); } userAgentDetails(snippetId: number, options?: Sudo) { const sId = encodeURIComponent(snippetId); - return RequestHelper.get(this, `snippets/${sId}/user_agent_detail`, options); + return RequestHelper.get()( + this, + `snippets/${sId}/user_agent_detail`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/SystemHooks.ts b/packages/gitbeaker-core/src/services/SystemHooks.ts index 5609c40b..67954013 100644 --- a/packages/gitbeaker-core/src/services/SystemHooks.ts +++ b/packages/gitbeaker-core/src/services/SystemHooks.ts @@ -6,24 +6,35 @@ import { Sudo, } from '../infrastructure'; -export class SystemHooks extends BaseService { +export interface SystemHookSchema extends Record { + id: number; + url: string; + created_at: string; + push_events: boolean; + tag_push_events: boolean; + merge_requests_events: boolean; + repository_update_events: boolean; + enable_ssl_verification: boolean; +} + +export class SystemHooks extends BaseService { add(url: string, options?: BaseRequestOptions) { - return RequestHelper.post(this, 'hooks', { url, ...options }); + return RequestHelper.post()(this, 'hooks', { url, ...options }); } all(options?: PaginatedRequestOptions) { - return RequestHelper.get(this, 'hooks', options); + return RequestHelper.get()(this, 'hooks', options); } edit(hookId: number, url: string, options?: BaseRequestOptions) { const hId = encodeURIComponent(hookId); - return RequestHelper.put(this, `hooks/${hId}`, { url, ...options }); + return RequestHelper.put()(this, `hooks/${hId}`, { url, ...options }); } remove(hookId: number, options?: Sudo) { const hId = encodeURIComponent(hookId); - return RequestHelper.del(this, `hooks/${hId}`, options); + return RequestHelper.del()(this, `hooks/${hId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/Tags.ts b/packages/gitbeaker-core/src/services/Tags.ts index d017084f..5f361ece 100644 --- a/packages/gitbeaker-core/src/services/Tags.ts +++ b/packages/gitbeaker-core/src/services/Tags.ts @@ -1,4 +1,6 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { CommitSchema } from './Commits'; +import { ReleaseSchema } from './Releases'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -6,28 +8,37 @@ import { Sudo, } from '../infrastructure'; -export class Tags extends BaseService { +export interface TagSchema extends Record { + commit: CommitSchema; + release: Pick; + name: string; + target: string; + message?: string; + protected: boolean; +} + +export class Tags extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/repository/tags`, options); + return RequestHelper.get()(this, `projects/${pId}/repository/tags`, options); } create(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/repository/tags`, options); + return RequestHelper.post()(this, `projects/${pId}/repository/tags`, options); } remove(projectId: string | number, tagName: string, options?: Sudo) { const [pId, tId] = [projectId, tagName].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/repository/tags/${tId}`, options); + return RequestHelper.del()(this, `projects/${pId}/repository/tags/${tId}`, options); } show(projectId: string | number, tagName: string, options?: Sudo) { const [pId, tId] = [projectId, tagName].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/repository/tags/${tId}`, options); + return RequestHelper.get()(this, `projects/${pId}/repository/tags/${tId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/Todos.ts b/packages/gitbeaker-core/src/services/Todos.ts index 917ed2a6..30f4110a 100644 --- a/packages/gitbeaker-core/src/services/Todos.ts +++ b/packages/gitbeaker-core/src/services/Todos.ts @@ -1,35 +1,84 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; +import { ProjectSchema } from './Projects'; +import { MilestoneSchema } from '../templates'; import { RequestHelper, PaginatedRequestOptions, Sudo } from '../infrastructure'; -interface CreateTodoOptions extends Sudo { - resourceName?: 'mergerequest' | 'issue'; +export interface TodoSchema extends Record { + id: number; + project: Pick< + ProjectSchema, + 'id' | 'name' | 'name_with_namespace' | 'path' | 'path_with_namespace' + >; + author: Pick; + action_name: string; + target_type: string; + target: { + id: number; + iid: number; + project_id: number; + title: string; + description: string; + state: string; + created_at: string; + updated_at: string; + target_branch: string; + source_branch: string; + upvotes: number; + downvotes: number; + author: Pick; + assignee: Pick; + source_project_id: number; + target_project_id: number; + labels?: string[]; + work_in_progress: boolean; + milestone: Omit; + merge_when_pipeline_succeeds: boolean; + merge_status: string; + user_notes_count: number; + }; + target_url: string; + body: string; + state: string; + created_at: string; + updated_at: string; } -export class Todos extends BaseService { +export class Todos extends BaseService { all(options?: PaginatedRequestOptions) { - return RequestHelper.get(this, 'todos', options); + return RequestHelper.get()(this, 'todos', options); } create( projectId: string | number, resourceId: number, - { resourceName, ...options }: CreateTodoOptions = {}, + resourceName: 'mergerequest' | 'issue', + options?: Sudo, ) { - if (resourceName === 'issue') { - return RequestHelper.post(this, `projects/${projectId}/issues/${resourceId}/todo`, options); - } - return RequestHelper.post( + const resourceAPI = resourceName === 'issue' ? 'issues' : 'merge_requests'; + + return RequestHelper.post()( this, - `projects/${projectId}/merge_requests/${resourceId}/todo`, + `projects/${projectId}/${resourceAPI}/${resourceId}/todo`, options, ); } - done({ todoId, ...options }: { todoId?: number } & Sudo) { - let url = 'mark_as_done'; + done({ todoId, ...options }: { todoId?: number } & Sudo = {}) { + const url = ['todos']; - if (todoId) url = `${todoId}/${url}`; + if (todoId) url.push(todoId.toString()); - return RequestHelper.post(this, `todos/${url}`, options); + url.push('mark_as_done'); + + // Fixme: Rewrite this to make better use of proper typing + if (todoId) { + return RequestHelper.post()( + this, + url.join('/'), + options as Record, + ); + } + return RequestHelper.post()(this, url.join('/'), options as Record); } } diff --git a/packages/gitbeaker-core/src/services/Triggers.ts b/packages/gitbeaker-core/src/services/Triggers.ts index 581e7f00..273d2518 100644 --- a/packages/gitbeaker-core/src/services/Triggers.ts +++ b/packages/gitbeaker-core/src/services/Triggers.ts @@ -1,4 +1,5 @@ import { BaseService } from '@gitbeaker/requester-utils'; +import { UserSchema } from './Users'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -6,23 +7,38 @@ import { Sudo, } from '../infrastructure'; -export class Triggers extends BaseService { +export interface PipelineTriggerSchema extends Record { + id: number; + description: string; + created_at: string; + last_used?: string; + token: string; + updated_at: string; + owner: Pick; +} + +// TODO: Rename PipelineTriggers +export class Triggers extends BaseService { add(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/triggers`, options); + return RequestHelper.post()(this, `projects/${pId}/triggers`, options); } all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/triggers`, options); + return RequestHelper.get()(this, `projects/${pId}/triggers`, options); } edit(projectId: string | number, triggerId: number, options?: BaseRequestOptions) { const [pId, tId] = [projectId, triggerId].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/triggers/${tId}`, options); + return RequestHelper.put()( + this, + `projects/${pId}/triggers/${tId}`, + options, + ); } pipeline( @@ -40,7 +56,7 @@ export class Triggers extends BaseService { }); } - return RequestHelper.post(this, `projects/${pId}/trigger/pipeline`, { + return RequestHelper.post()(this, `projects/${pId}/trigger/pipeline`, { isForm: true, ref, token, @@ -51,12 +67,16 @@ export class Triggers extends BaseService { remove(projectId: string | number, triggerId: number, options?: Sudo) { const [pId, tId] = [projectId, triggerId].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/triggers/${tId}`, options); + return RequestHelper.del()(this, `projects/${pId}/triggers/${tId}`, options); } show(projectId: string | number, triggerId: number, options?: Sudo) { const [pId, tId] = [projectId, triggerId].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/triggers/${tId}`, options); + return RequestHelper.get()( + this, + `projects/${pId}/triggers/${tId}`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/UserCustomAttributes.ts b/packages/gitbeaker-core/src/services/UserCustomAttributes.ts index 04a061d6..5fc3a0c8 100644 --- a/packages/gitbeaker-core/src/services/UserCustomAttributes.ts +++ b/packages/gitbeaker-core/src/services/UserCustomAttributes.ts @@ -1,19 +1,33 @@ import { BaseServiceOptions } from '@gitbeaker/requester-utils'; -import { ResourceCustomAttributes } from '../templates'; -import { PaginatedRequestOptions, Sudo } from '../infrastructure'; +import { ResourceCustomAttributes, CustomAttributeSchema } from '../templates'; +import { PaginatedRequestOptions, CamelizedRecord, Sudo } from '../infrastructure'; -export interface UserCustomAttributes extends ResourceCustomAttributes { - all(userId: string | number, options?: PaginatedRequestOptions); +export interface UserCustomAttributes + extends ResourceCustomAttributes { + all( + userId: string | number, + options?: PaginatedRequestOptions, + ): Promise[]>; - set(userId: string | number, customAttributeId: number, value: string, options?: Sudo); + set( + userId: string | number, + customAttributeId: number, + value: string, + options?: Sudo, + ): Promise>; - remove(userId: string | number, customAttributeId: number, options?: Sudo); + remove(userId: string | number, customAttributeId: number, options?: Sudo): Promise; - show(userId: string | number, customAttributeId: number, options?: Sudo); + show( + userId: string | number, + customAttributeId: number, + options?: Sudo, + ): Promise>; } -export class UserCustomAttributes extends ResourceCustomAttributes { - constructor(options: BaseServiceOptions = {}) { +export class UserCustomAttributes extends ResourceCustomAttributes { + constructor(options: BaseServiceOptions) { + /* istanbul ignore next */ super('users', options); } } diff --git a/packages/gitbeaker-core/src/services/UserEmails.ts b/packages/gitbeaker-core/src/services/UserEmails.ts index e1e7e671..2f6da45e 100644 --- a/packages/gitbeaker-core/src/services/UserEmails.ts +++ b/packages/gitbeaker-core/src/services/UserEmails.ts @@ -1,29 +1,36 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { BaseRequestOptions, PaginatedRequestOptions, RequestHelper } from '../infrastructure'; -const url = (userId) => (userId ? `users/${encodeURIComponent(userId)}/emails` : 'user/emails'); +export interface UserEmailSchema extends Record { + id: number; + email: string; + confirmed_at: string; +} -export class UserEmails extends BaseService { +const url = (userId?: number) => + userId ? `users/${encodeURIComponent(userId)}/emails` : 'user/emails'; + +export class UserEmails extends BaseService { all({ userId, ...options }: { userId?: number } & PaginatedRequestOptions = {}) { - return RequestHelper.get(this, url(userId), options); + return RequestHelper.get()(this, url(userId), options); } - add(email, { userId, ...options }: { userId?: number } & BaseRequestOptions = {}) { - return RequestHelper.post(this, url(userId), { + add(email: string, { userId, ...options }: { userId?: number } & BaseRequestOptions = {}) { + return RequestHelper.post()(this, url(userId), { email, ...options, }); } - show(emailId, options?: BaseRequestOptions) { + show(emailId: number, options?: BaseRequestOptions) { const eId = encodeURIComponent(emailId); - return RequestHelper.get(this, `user/emails/${eId}`, options); + return RequestHelper.get()(this, `user/emails/${eId}`, options); } - remove(emailId, { userId, ...options }: { userId?: number } & BaseRequestOptions = {}) { + remove(emailId: number, { userId, ...options }: { userId?: number } & BaseRequestOptions = {}) { const eId = encodeURIComponent(emailId); - return RequestHelper.del(this, `${url(userId)}/${eId}`, options); + return RequestHelper.del()(this, `${url(userId)}/${eId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/UserGPGKeys.ts b/packages/gitbeaker-core/src/services/UserGPGKeys.ts index f3515d67..3b5ff68f 100644 --- a/packages/gitbeaker-core/src/services/UserGPGKeys.ts +++ b/packages/gitbeaker-core/src/services/UserGPGKeys.ts @@ -1,16 +1,22 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { BaseRequestOptions, PaginatedRequestOptions, RequestHelper } from '../infrastructure'; -const url = (userId) => - userId ? `users/${encodeURIComponent(userId)}/gpg_keys` : 'users/gpg_keys'; +export interface UserGPGKeySchema extends Record { + id: number; + key: string; + created_at: string; +} -export class UserGPGKeys extends BaseService { +const url = (userId?: number) => + userId ? `users/${encodeURIComponent(userId)}/gpg_keys` : 'user/gpg_keys'; + +export class UserGPGKeys extends BaseService { all({ userId, ...options }: { userId?: number } & PaginatedRequestOptions = {}) { - return RequestHelper.get(this, url(userId), options); + return RequestHelper.get()(this, url(userId), options); } add(key: string, { userId, ...options }: { userId?: number } & BaseRequestOptions = {}) { - return RequestHelper.post(this, url(userId), { + return RequestHelper.post()(this, url(userId), { key, ...options, }); @@ -19,12 +25,12 @@ export class UserGPGKeys extends BaseService { show(keyId: number, { userId, ...options }: { userId?: number } & BaseRequestOptions = {}) { const kId = encodeURIComponent(keyId); - return RequestHelper.get(this, `${url(userId)}/${kId}`, options); + return RequestHelper.get()(this, `${url(userId)}/${kId}`, options); } remove(keyId: number, { userId, ...options }: { userId?: number } & BaseRequestOptions = {}) { const kId = encodeURIComponent(keyId); - return RequestHelper.del(this, `${url(userId)}/${kId}`, options); + return RequestHelper.del()(this, `${url(userId)}/${kId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/UserImpersonationTokens.ts b/packages/gitbeaker-core/src/services/UserImpersonationTokens.ts index b88e1079..b6e21878 100644 --- a/packages/gitbeaker-core/src/services/UserImpersonationTokens.ts +++ b/packages/gitbeaker-core/src/services/UserImpersonationTokens.ts @@ -2,14 +2,32 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, PaginatedRequestOptions, Sudo } from '../infrastructure'; type ImpersonationTokenScope = 'api' | 'read_user'; +type ImpersonationTokenState = 'all' | 'active' | 'inactive'; -export class UserImpersonationTokens extends BaseService { - all(userId: number, options?: PaginatedRequestOptions) { +export interface UserImpersonationTokenSchema extends Record { + active: boolean; + user_id: number; + scopes?: string[]; + revoked: boolean; + name: string; + id: number; + created_at: string; + impersonation: boolean; + expires_at: string; +} + +export class UserImpersonationTokens extends BaseService { + all(userId: number, options?: { state?: ImpersonationTokenState } & PaginatedRequestOptions) { const uId = encodeURIComponent(userId); - return RequestHelper.get(this, `users/${uId}/impersonation_tokens`, options); + return RequestHelper.get()( + this, + `users/${uId}/impersonation_tokens`, + options, + ); } + // TODO: change required params add( userId: number, name: string, @@ -19,23 +37,31 @@ export class UserImpersonationTokens extends BaseService { ) { const uId = encodeURIComponent(userId); - return RequestHelper.post(this, `users/${uId}/impersonation_tokens`, { - name, - expiresAt, - scopes, - ...options, - }); + return RequestHelper.post()( + this, + `users/${uId}/impersonation_tokens`, + { + name, + expiresAt, + scopes, + ...options, + }, + ); } show(userId: number, tokenId: number, options?: Sudo) { const [uId, tId] = [userId, tokenId].map(encodeURIComponent); - return RequestHelper.get(this, `users/${uId}/impersonation_tokens/${tId}`, options); + return RequestHelper.get()( + this, + `users/${uId}/impersonation_tokens/${tId}`, + options, + ); } revoke(userId: number, tokenId: number, options?: Sudo) { const [uId, tId] = [userId, tokenId].map(encodeURIComponent); - return RequestHelper.del(this, `users/${uId}/impersonation_tokens/${tId}`, options); + return RequestHelper.del()(this, `users/${uId}/impersonation_tokens/${tId}`, options); } } diff --git a/packages/gitbeaker-core/src/services/UserKeys.ts b/packages/gitbeaker-core/src/services/UserKeys.ts deleted file mode 100644 index d56c8cdf..00000000 --- a/packages/gitbeaker-core/src/services/UserKeys.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { BaseService } from '@gitbeaker/requester-utils'; -import { BaseRequestOptions, PaginatedRequestOptions, RequestHelper } from '../infrastructure'; - -const url = (userId) => (userId ? `users/${encodeURIComponent(userId)}/keys` : 'user/keys'); - -export class UserKeys extends BaseService { - all({ userId, ...options }: { userId?: number } & PaginatedRequestOptions = {}) { - return RequestHelper.get(this, url(userId), options); - } - - create(title, key, { userId, ...options }: { userId?: number } & BaseRequestOptions = {}) { - return RequestHelper.post(this, url(userId), { - title, - key, - ...options, - }); - } - - show(keyId, options?: BaseRequestOptions) { - const kId = encodeURIComponent(keyId); - - return RequestHelper.get(this, `user/keys/${kId}`, options); - } - - remove(keyId, { userId, ...options }: { userId?: number } & BaseRequestOptions = {}) { - const kId = encodeURIComponent(keyId); - - return RequestHelper.del(this, `${url(userId)}/${kId}`, options); - } -} diff --git a/packages/gitbeaker-core/src/services/UserSSHKeys.ts b/packages/gitbeaker-core/src/services/UserSSHKeys.ts new file mode 100644 index 00000000..97743646 --- /dev/null +++ b/packages/gitbeaker-core/src/services/UserSSHKeys.ts @@ -0,0 +1,42 @@ +import { BaseService } from '@gitbeaker/requester-utils'; +import { BaseRequestOptions, PaginatedRequestOptions, RequestHelper } from '../infrastructure'; + +export interface UserSSHKeySchema extends Record { + id: number; + key: string; + title: string; + created_at: string; +} + +const url = (userId?: number) => + userId ? `users/${encodeURIComponent(userId)}/keys` : 'user/keys'; + +export class UserSSHKeys extends BaseService { + all({ userId, ...options }: { userId?: number } & PaginatedRequestOptions = {}) { + return RequestHelper.get()(this, url(userId), options); + } + + create( + title: string, + key: string, + { userId, ...options }: { userId?: number } & BaseRequestOptions = {}, + ) { + return RequestHelper.post()(this, url(userId), { + title, + key, + ...options, + }); + } + + show(keyId: number, { userId, ...options }: { userId?: number } & BaseRequestOptions = {}) { + const kId = encodeURIComponent(keyId); + + return RequestHelper.get()(this, `${url(userId)}/${kId}`, options); + } + + remove(keyId: number, { userId, ...options }: { userId?: number } & BaseRequestOptions = {}) { + const kId = encodeURIComponent(keyId); + + return RequestHelper.del()(this, `${url(userId)}/${kId}`, options); + } +} diff --git a/packages/gitbeaker-core/src/services/Users.ts b/packages/gitbeaker-core/src/services/Users.ts index 0ff6c3d3..0b5e029f 100644 --- a/packages/gitbeaker-core/src/services/Users.ts +++ b/packages/gitbeaker-core/src/services/Users.ts @@ -5,100 +5,93 @@ import { RequestHelper, Sudo, } from '../infrastructure'; +import { ProjectExtendedSchema } from './Projects'; +import { EventOptions, EventSchema } from './Events'; -import { EventOptions } from './Events'; - -export interface UserSchemaDefault { +export interface UserSchema extends Record { id: number; name: string; username: string; state: string; avatar_url: string; web_url: string; + created_at?: string; } -export interface UserSchemaCamelized { - id: number; - name: string; - username: string; - state: string; - avatarUrl: string; - webUrl: string; -} - -// As of GitLab v12.6.2 -export type UserSchema = UserSchemaDefault | UserSchemaCamelized; - -export interface UserDetailSchemaDefault extends UserSchemaDefault { - created_at: Date; +export interface UserExtendedSchema extends UserSchema { bio?: string; location?: string; public_email: string; skype: string; linkedin: string; twitter: string; - website_url?: string; + website_url: string; organization?: string; + last_sign_in_at: string; + confirmed_at: string; + last_activity_on: string; + email: string; + theme_id: number; + color_scheme_id: number; + projects_limit: number; + current_sign_in_at?: string; + identities?: string[]; + can_create_group: boolean; + can_create_project: boolean; + two_factor_enabled: boolean; + external: boolean; + private_profile?: string; } -export interface UserDetailSchemaCamelized extends UserSchemaCamelized { - createdAt: Date; - bio?: string; - location?: string; - publicEmail: string; - skype: string; - linkedin: string; - twitter: string; - websiteUrl?: string; - organization?: string; +export interface UserActivitySchema extends Record { + username: string; + last_activity_on: string; + last_activity_at: string; } -// As of GitLab v12.6.2 -export type UserDetailSchema = UserDetailSchemaDefault | UserSchemaCamelized; - -export class Users extends BaseService { +export class Users extends BaseService { all(options?: PaginatedRequestOptions) { - return RequestHelper.get(this, 'users', options); + return RequestHelper.get()(this, 'users', options); } activities(options?: Sudo) { - return RequestHelper.get(this, 'users/activities', options); + return RequestHelper.get()(this, 'users/activities', options); } projects(userId: number, options?: Sudo) { const uId = encodeURIComponent(userId); - return RequestHelper.get(this, `users/${uId}/projects`, options); + return RequestHelper.get()(this, `users/${uId}/projects`, options); } block(userId: number, options?: Sudo) { const uId = encodeURIComponent(userId); - return RequestHelper.post(this, `users/${uId}/block`, options); + return RequestHelper.post()(this, `users/${uId}/block`, options); } create(options?: BaseRequestOptions) { - return RequestHelper.post(this, 'users', options); + return RequestHelper.post()(this, 'users', options); } current(options?: Sudo) { - return RequestHelper.get(this, 'user', options); + return RequestHelper.get()(this, 'user', options); } edit(userId: number, options?: BaseRequestOptions) { const uId = encodeURIComponent(userId); - return RequestHelper.put(this, `users/${uId}`, options); + return RequestHelper.put()(this, `users/${uId}`, options); } events(userId: number, options?: BaseRequestOptions & EventOptions) { const uId = encodeURIComponent(userId); - return RequestHelper.get(this, `users/${uId}/events`, options); + return RequestHelper.get()(this, `users/${uId}/events`, options); } search(emailOrUsername: string, options?: Sudo) { - return RequestHelper.get(this, 'users', { + return RequestHelper.get()(this, 'users', { search: emailOrUsername, ...options, }); @@ -107,18 +100,18 @@ export class Users extends BaseService { show(userId: number, options?: BaseRequestOptions) { const uId = encodeURIComponent(userId); - return RequestHelper.get(this, `users/${uId}`, options); + return RequestHelper.get()(this, `users/${uId}`, options); } remove(userId: number, options?: Sudo) { const uId = encodeURIComponent(userId); - return RequestHelper.del(this, `users/${uId}`, options); + return RequestHelper.del()(this, `users/${uId}`, options); } unblock(userId: number, options?: Sudo) { const uId = encodeURIComponent(userId); - return RequestHelper.post(this, `users/${uId}/unblock`, options); + return RequestHelper.post()(this, `users/${uId}/unblock`, options); } } diff --git a/packages/gitbeaker-core/src/services/Version.ts b/packages/gitbeaker-core/src/services/Version.ts index f420dbc9..4b422366 100644 --- a/packages/gitbeaker-core/src/services/Version.ts +++ b/packages/gitbeaker-core/src/services/Version.ts @@ -1,8 +1,13 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { RequestHelper, Sudo } from '../infrastructure'; -export class Version extends BaseService { +interface VersionSchema extends Record { + version: string; + revision: string; +} + +export class Version extends BaseService { show(options?: Sudo) { - return RequestHelper.get(this, 'version', options); + return RequestHelper.get()(this, 'version', options); } } diff --git a/packages/gitbeaker-core/src/services/VulnerabilityFindings.ts b/packages/gitbeaker-core/src/services/VulnerabilityFindings.ts index d49911a0..e63a4d2f 100644 --- a/packages/gitbeaker-core/src/services/VulnerabilityFindings.ts +++ b/packages/gitbeaker-core/src/services/VulnerabilityFindings.ts @@ -1,20 +1,86 @@ import { BaseService } from '@gitbeaker/requester-utils'; import { PaginatedRequestOptions, RequestHelper } from '../infrastructure'; -export class VulnerabilityFindings extends BaseService { +export interface IdentifierSchema { + external_type: string; + external_id: string; + name: string; + url: string; +} + +export interface LinkSchema { + url: string; +} + +export interface ItemSchema { + type: string; + href: string; +} + +export interface VulnerabilityFindingSchema extends Record { + id: number; + report_type: string; + name: string; + severity: string; + confidence: string; + scanner: { + external_id: string; + name: string; + }; + identifiers?: IdentifierSchema[]; + project_fingerprint: string; + uuid: string; + create_vulnerability_feedback_issue_path: string; + create_vulnerability_feedback_merge_request_path: string; + create_vulnerability_feedback_dismissal_path: string; + project: { + id: number; + name: string; + full_path: string; + full_name: string; + }; + dismissal_feedback?: string; + issue_feedback?: string; + merge_request_feedback?: string; + description: string; + links?: LinkSchema[]; + location: { + file: string; + dependency: { + package: { + name: string; + }; + version: string; + }; + }; + details: { + [custom_field: string]: { + name: string; + type: string; + items?: ItemSchema[]; + }; + }; + solution: string; + blob_path: string; +} + +export class VulnerabilityFindings extends BaseService { all( projectId: string | number, options?: { - id: string | number; - reportType: string[]; - scope: string; - severity: string[]; - confidence: string[]; - pipelineId: string | number; + reportType?: string[]; + scope?: string; + severity?: string[]; + confidence?: string[]; + pipelineId?: string | number; } & PaginatedRequestOptions, ) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/vulnerability_findings`, options); + return RequestHelper.get()( + this, + `projects/${pId}/vulnerability_findings`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/services/Wikis.ts b/packages/gitbeaker-core/src/services/Wikis.ts index 6446bc34..c95e0f9d 100644 --- a/packages/gitbeaker-core/src/services/Wikis.ts +++ b/packages/gitbeaker-core/src/services/Wikis.ts @@ -6,34 +6,41 @@ import { Sudo, } from '../infrastructure'; -export class Wikis extends BaseService { +export interface WikiSchema extends Record { + content: string; + format: string; + slug: string; + title: string; +} + +export class Wikis extends BaseService { all(projectId: string | number, options?: PaginatedRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.get(this, `projects/${pId}/wikis`, options); + return RequestHelper.get()(this, `projects/${pId}/wikis`, options); } create(projectId: string | number, options?: BaseRequestOptions) { const pId = encodeURIComponent(projectId); - return RequestHelper.post(this, `projects/${pId}/wikis`, options); + return RequestHelper.post()(this, `projects/${pId}/wikis`, options); } edit(projectId: string | number, slug: string, options?: BaseRequestOptions) { const [pId, s] = [projectId, slug].map(encodeURIComponent); - return RequestHelper.put(this, `projects/${pId}/wikis/${s}`, options); + return RequestHelper.put()(this, `projects/${pId}/wikis/${s}`, options); } show(projectId: string | number, slug: string, options?: Sudo) { const [pId, s] = [projectId, slug].map(encodeURIComponent); - return RequestHelper.get(this, `projects/${pId}/wikis/${s}`, options); + return RequestHelper.get()(this, `projects/${pId}/wikis/${s}`, options); } remove(projectId: string | number, slug: string, options?: Sudo) { const [pId, s] = [projectId, slug].map(encodeURIComponent); - return RequestHelper.del(this, `projects/${pId}/wikis/${s}`, options); + return RequestHelper.del()(this, `projects/${pId}/wikis/${s}`, options); } } diff --git a/packages/gitbeaker-core/src/services/index.ts b/packages/gitbeaker-core/src/services/index.ts index 32bd97e0..2b4b6a86 100644 --- a/packages/gitbeaker-core/src/services/index.ts +++ b/packages/gitbeaker-core/src/services/index.ts @@ -6,7 +6,6 @@ export { GroupCustomAttributes } from './GroupCustomAttributes'; export { GroupIssueBoards } from './GroupIssueBoards'; export { GroupMembers } from './GroupMembers'; export { GroupMilestones } from './GroupMilestones'; -export { GroupProjects } from './GroupProjects'; export { GroupRunners } from './GroupRunners'; export { GroupVariables } from './GroupVariables'; export { GroupLabels } from './GroupLabels'; @@ -21,7 +20,7 @@ export { Users } from './Users'; export { UserCustomAttributes } from './UserCustomAttributes'; export { UserEmails } from './UserEmails'; export { UserImpersonationTokens } from './UserImpersonationTokens'; -export { UserKeys } from './UserKeys'; +export { UserSSHKeys } from './UserSSHKeys'; export { UserGPGKeys } from './UserGPGKeys'; // Projects @@ -36,6 +35,7 @@ export { FreezePeriods } from './FreezePeriods'; export { Issues } from './Issues'; export { IssuesStatistics } from './IssuesStatistics'; export { IssueNotes } from './IssueNotes'; +export { IssueNoteAwardEmojis } from './IssueNoteAwardEmojis'; export { IssueDiscussions } from './IssueDiscussions'; export { IssueAwardEmojis } from './IssueAwardEmojis'; export { Jobs } from './Jobs'; @@ -88,7 +88,7 @@ export { GitignoreTemplates } from './GitignoreTemplates'; export { GitLabCIYMLTemplates } from './GitLabCIYMLTemplates'; export { Keys } from './Keys'; export { License } from './License'; -export { LicenceTemplates } from './LicenceTemplates'; +export { LicenseTemplates } from './LicenseTemplates'; export { Lint } from './Lint'; export { Namespaces } from './Namespaces'; export { NotificationSettings } from './NotificationSettings'; diff --git a/packages/gitbeaker-core/src/templates/ResourceAccessRequests.ts b/packages/gitbeaker-core/src/templates/ResourceAccessRequests.ts index 2f7a1fca..63d83288 100644 --- a/packages/gitbeaker-core/src/templates/ResourceAccessRequests.ts +++ b/packages/gitbeaker-core/src/templates/ResourceAccessRequests.ts @@ -1,23 +1,32 @@ import { BaseService, BaseServiceOptions } from '@gitbeaker/requester-utils'; import { RequestHelper, Sudo } from '../infrastructure'; -export type AccessLevel = 10 | 20 | 30 | 40 | 50; +export type AccessLevel = 0 | 5 | 10 | 20 | 30 | 40 | 50; -export class ResourceAccessRequests extends BaseService { - constructor(resourceType: string, options: BaseServiceOptions) { +export interface AccessRequestSchema extends Record { + id: number; + username: string; + name: string; + state: string; + created_at: string; + requested_at: string; +} + +export class ResourceAccessRequests extends BaseService { + constructor(resourceType: string, options: BaseServiceOptions) { super({ prefixUrl: resourceType, ...options }); } all(resourceId: string | number) { const rId = encodeURIComponent(resourceId); - return RequestHelper.get(this, `${rId}/access_requests`); + return RequestHelper.get()(this, `${rId}/access_requests`); } request(resourceId: string | number) { const rId = encodeURIComponent(resourceId); - return RequestHelper.post(this, `${rId}/access_requests`); + return RequestHelper.post()(this, `${rId}/access_requests`); } approve( @@ -27,12 +36,16 @@ export class ResourceAccessRequests extends BaseService { ) { const [rId, uId] = [resourceId, userId].map(encodeURIComponent); - return RequestHelper.post(this, `${rId}/access_requests/${uId}/approve`, options); + return RequestHelper.post()( + this, + `${rId}/access_requests/${uId}/approve`, + options, + ); } deny(resourceId: string | number, userId: number) { const [rId, uId] = [resourceId, userId].map(encodeURIComponent); - return RequestHelper.del(this, `${rId}/access_requests/${uId}`); + return RequestHelper.del()(this, `${rId}/access_requests/${uId}`); } } diff --git a/packages/gitbeaker-core/src/templates/ResourceAwardEmojis.ts b/packages/gitbeaker-core/src/templates/ResourceAwardEmojis.ts index a396fe7c..22b74e61 100644 --- a/packages/gitbeaker-core/src/templates/ResourceAwardEmojis.ts +++ b/packages/gitbeaker-core/src/templates/ResourceAwardEmojis.ts @@ -1,76 +1,76 @@ import { BaseService, BaseServiceOptions } from '@gitbeaker/requester-utils'; +import { UserSchema } from '../services/Users'; import { PaginatedRequestOptions, RequestHelper, Sudo } from '../infrastructure'; -function url( +export interface AwardEmojiSchema extends Record { + id: number; + name: string; + user: UserSchema; + created_at: string; + updated_at: string; + awardable_id: number; + awardable_type: string; +} + +export function url( projectId: number | string, resourceType: string, resourceId: number | string, - noteId: number, - awardId?: number, + awardId?: number | null, + noteId?: number, ) { - const [pId, rId, nId] = [projectId, resourceId, noteId].map(encodeURIComponent); - const output = [pId, resourceType, rId, 'notes', nId, 'award_emoji']; + const [pId, rId] = [projectId, resourceId].map(encodeURIComponent); + const output = [pId, resourceType, rId]; + + if (noteId) output.push('notes', encodeURIComponent(noteId)); + + output.push('award_emoji'); if (awardId) output.push(encodeURIComponent(awardId)); return output.join('/'); } -export class ResourceAwardEmojis extends BaseService { +export class ResourceAwardEmojis extends BaseService { protected resourceType: string; - constructor(resourceType: string, options: BaseServiceOptions) { + constructor(resourceType: string, options: BaseServiceOptions) { super({ prefixUrl: 'projects', ...options }); this.resourceType = resourceType; } - all( - projectId: string | number, - resourceId: string | number, - noteId: number, - options?: PaginatedRequestOptions, - ) { - return RequestHelper.get(this, url(projectId, this.resourceType, resourceId, noteId), options); - } - - award( - projectId: string | number, - resourceId: string | number, - noteId: number, - name: string, - options?: Sudo, - ) { - return RequestHelper.post(this, url(projectId, this.resourceType, resourceId, noteId), { - name, - ...options, - }); - } - - remove( - projectId: string | number, - resourceId: string | number, - noteId: number, - awardId: number, - options?: Sudo, - ) { - return RequestHelper.del( + all(projectId: string | number, resourceIId: number, options?: PaginatedRequestOptions) { + return RequestHelper.get()( this, - url(projectId, this.resourceType, resourceId, noteId, awardId), + url(projectId, this.resourceType, resourceIId), options, ); } - show( - projectId: string | number, - resourceId: string | number, - noteId: number, - awardId: number, - options?: Sudo, - ) { - return RequestHelper.get( + award(projectId: string | number, resourceIId: number, name: string, options?: Sudo) { + return RequestHelper.post()( this, - url(projectId, this.resourceType, resourceId, noteId, awardId), + url(projectId, this.resourceType, resourceIId), + { + name, + ...options, + }, + ); + } + + remove(projectId: string | number, resourceIId: number, awardId: number, options?: Sudo) { + return RequestHelper.del()( + this, + url(projectId, this.resourceType, resourceIId, awardId), + options, + ); + } + + show(projectId: string | number, resourceIId: number, awardId: number, options?: Sudo) { + return RequestHelper.get()( + this, + url(projectId, this.resourceType, resourceIId, awardId), options, ); } diff --git a/packages/gitbeaker-core/src/templates/ResourceBadges.ts b/packages/gitbeaker-core/src/templates/ResourceBadges.ts index f7e3df8b..0208d605 100644 --- a/packages/gitbeaker-core/src/templates/ResourceBadges.ts +++ b/packages/gitbeaker-core/src/templates/ResourceBadges.ts @@ -6,44 +6,58 @@ import { Sudo, } from '../infrastructure'; -export class ResourceBadges extends BaseService { - constructor(resourceType: string, options: BaseServiceOptions) { +export interface BadgeSchema extends Record { + name: string; + id: number; + link_url: string; + image_url: string; + rendered_link_url: string; + rendered_image_url: string; + kind: 'project' | 'group'; +} + +export class ResourceBadges extends BaseService { + constructor(resourceType: string, options: BaseServiceOptions) { super({ prefixUrl: resourceType, ...options }); } add(resourceId: string | number, options?: BaseRequestOptions) { const rId = encodeURIComponent(resourceId); - return RequestHelper.post(this, `${rId}/badges`, options); + return RequestHelper.post()(this, `${rId}/badges`, options); } all(resourceId: string | number, options?: PaginatedRequestOptions) { const rId = encodeURIComponent(resourceId); - return RequestHelper.get(this, `${rId}/badges`, options); + return RequestHelper.get()(this, `${rId}/badges`, options); } edit(resourceId: string | number, badgeId: number, options?: BaseRequestOptions) { const [rId, bId] = [resourceId, badgeId].map(encodeURIComponent); - return RequestHelper.put(this, `${rId}/badges/${bId}`, options); + return RequestHelper.put()(this, `${rId}/badges/${bId}`, options); } preview(resourceId: string | number, linkUrl: string, imageUrl: string, options?: Sudo) { const rId = encodeURIComponent(resourceId); - return RequestHelper.get(this, `${rId}/badges/render`, { linkUrl, imageUrl, ...options }); + return RequestHelper.get>()( + this, + `${rId}/badges/render`, + { linkUrl, imageUrl, ...options }, + ); } remove(resourceId: string | number, badgeId: number, options?: Sudo) { const [rId, bId] = [resourceId, badgeId].map(encodeURIComponent); - return RequestHelper.del(this, `${rId}/badges/${bId}`, options); + return RequestHelper.del()(this, `${rId}/badges/${bId}`, options); } show(resourceId: string | number, badgeId: number, options?: Sudo) { const [rId, bId] = [resourceId, badgeId].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/badges/${bId}`, options); + return RequestHelper.get()(this, `${rId}/badges/${bId}`, options); } } diff --git a/packages/gitbeaker-core/src/templates/ResourceCustomAttributes.ts b/packages/gitbeaker-core/src/templates/ResourceCustomAttributes.ts index a618e125..e5e5f3a3 100644 --- a/packages/gitbeaker-core/src/templates/ResourceCustomAttributes.ts +++ b/packages/gitbeaker-core/src/templates/ResourceCustomAttributes.ts @@ -1,21 +1,26 @@ import { BaseService, BaseServiceOptions } from '@gitbeaker/requester-utils'; import { PaginatedRequestOptions, RequestHelper, Sudo } from '../infrastructure'; -export class ResourceCustomAttributes extends BaseService { - constructor(resourceType: string, options: BaseServiceOptions) { +export interface CustomAttributeSchema extends Record { + key: string; + value: string; +} + +export class ResourceCustomAttributes extends BaseService { + constructor(resourceType: string, options: BaseServiceOptions) { super({ prefixUrl: resourceType, ...options }); } all(resourceId: string | number, options?: PaginatedRequestOptions) { const rId = encodeURIComponent(resourceId); - return RequestHelper.get(this, `${rId}/custom_attributes`, options); + return RequestHelper.get()(this, `${rId}/custom_attributes`, options); } set(resourceId: string | number, customAttributeId: number, value: string, options?: Sudo) { const [rId, cId] = [resourceId, customAttributeId].map(encodeURIComponent); - return RequestHelper.put(this, `${rId}/custom_attributes/${cId}`, { + return RequestHelper.put()(this, `${rId}/custom_attributes/${cId}`, { value, ...options, }); @@ -24,12 +29,16 @@ export class ResourceCustomAttributes extends BaseService { remove(resourceId: string | number, customAttributeId: number, options?: Sudo) { const [rId, cId] = [resourceId, customAttributeId].map(encodeURIComponent); - return RequestHelper.del(this, `${rId}/custom_attributes/${cId}`, options); + return RequestHelper.del()(this, `${rId}/custom_attributes/${cId}`, options); } show(resourceId: string | number, customAttributeId: number, options?: Sudo) { const [rId, cId] = [resourceId, customAttributeId].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/custom_attributes/${cId}`, options); + return RequestHelper.get()( + this, + `${rId}/custom_attributes/${cId}`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/templates/ResourceDeployTokens.ts b/packages/gitbeaker-core/src/templates/ResourceDeployTokens.ts index cdfab5c2..93c2a7f7 100644 --- a/packages/gitbeaker-core/src/templates/ResourceDeployTokens.ts +++ b/packages/gitbeaker-core/src/templates/ResourceDeployTokens.ts @@ -6,11 +6,24 @@ import { Sudo, } from '../infrastructure'; -type DeployTokenScope = 'read_repository' | 'read_registry' | 'write_registry'; +export type DeployTokenScope = + | 'read_repository' + | 'read_registry' + | 'write_registry' + | 'read_package_registry' + | 'write_package_registry'; + +export interface DeployTokenSchema extends Record { + id: number; + name: string; + username: string; + expires_at: string; + scopes?: string[]; +} // https://docs.gitlab.com/ee/api/deploy_tokens.html -export class ResourceDeployTokens extends BaseService { - constructor(resourceType: string, options: BaseServiceOptions) { +export class ResourceDeployTokens extends BaseService { + constructor(resourceType: string, options: BaseServiceOptions) { super({ prefixUrl: resourceType, ...options }); } @@ -20,28 +33,38 @@ export class ResourceDeployTokens extends BaseService { tokenScopes: DeployTokenScope[], options?: BaseRequestOptions, ) { - return RequestHelper.post(this, `${encodeURIComponent(resourceId)}/deploy_tokens`, { - name: tokenName, - scopes: tokenScopes, - ...options, - }); + return RequestHelper.post()( + this, + `${encodeURIComponent(resourceId)}/deploy_tokens`, + { + name: tokenName, + scopes: tokenScopes, + ...options, + }, + ); } - all({ resourceId, ...options }: { resourceId?: string | number } & PaginatedRequestOptions) { - let url; + all({ + resourceId, + projectId, + groupId, + ...options + }: { + resourceId?: string | number; + projectId?: string | number; + groupId?: string | number; + } & PaginatedRequestOptions = {}) { + const prefix = + resourceId || projectId || groupId + ? `${encodeURIComponent((resourceId || projectId || groupId) as string)}/` + : ''; - if (resourceId) { - url = `${encodeURIComponent(resourceId)}/deploy_tokens`; - } else { - url = 'deploy_tokens'; - } - - return RequestHelper.get(this, url, options); + return RequestHelper.get()(this, `${prefix}deploy_tokens`, options); } remove(resourceId: string | number, tokenId: number, options?: Sudo) { const [rId, tId] = [resourceId, tokenId].map(encodeURIComponent); - return RequestHelper.del(this, `${rId}/deploy_tokens/${tId}`, options); + return RequestHelper.del()(this, `${rId}/deploy_tokens/${tId}`, options); } } diff --git a/packages/gitbeaker-core/src/templates/ResourceDiscussions.ts b/packages/gitbeaker-core/src/templates/ResourceDiscussions.ts index 4bf560e3..d9a06191 100644 --- a/packages/gitbeaker-core/src/templates/ResourceDiscussions.ts +++ b/packages/gitbeaker-core/src/templates/ResourceDiscussions.ts @@ -1,4 +1,5 @@ import { BaseService, BaseServiceOptions } from '@gitbeaker/requester-utils'; +import { UserSchema } from '../services/Users'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -6,10 +7,43 @@ import { Sudo, } from '../infrastructure'; -export class ResourceDiscussions extends BaseService { +export interface PositionSchema { + base_sha: string; + start_sha: string; + head_sha: string; + old_path: string; + new_path: string; + position_type: string; + old_line: number; + new_line: number; +} + +export interface NotesEntitySchema { + id: number; + type?: string; + body: string; + attachment?: string; + author: Omit; + created_at: string; + updated_at: string; + system: boolean; + noteable_id: number; + noteable_type: string; + noteable_iid?: number; + resolvable: boolean; + position?: PositionSchema; +} + +export interface DiscussionSchema extends Record { + id: string; + individual_note: boolean; + notes?: NotesEntitySchema[]; +} + +export class ResourceDiscussions extends BaseService { protected resource2Type: string; - constructor(resourceType: string, resource2Type: string, options: BaseServiceOptions) { + constructor(resourceType: string, resource2Type: string, options: BaseServiceOptions) { super({ prefixUrl: resourceType, ...options }); this.resource2Type = resource2Type; @@ -27,7 +61,7 @@ export class ResourceDiscussions extends BaseService { encodeURIComponent, ); - return RequestHelper.post( + return RequestHelper.post()( this, `${rId}/${this.resource2Type}/${r2Id}/discussions/${dId}/notes`, { body: content, noteId: nId, ...options }, @@ -41,7 +75,11 @@ export class ResourceDiscussions extends BaseService { ) { const [rId, r2Id] = [resourceId, resource2Id].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/${this.resource2Type}/${r2Id}/discussions`, options); + return RequestHelper.get()( + this, + `${rId}/${this.resource2Type}/${r2Id}/discussions`, + options, + ); } create( @@ -52,10 +90,14 @@ export class ResourceDiscussions extends BaseService { ) { const [rId, r2Id] = [resourceId, resource2Id].map(encodeURIComponent); - return RequestHelper.post(this, `${rId}/${this.resource2Type}/${r2Id}/discussions`, { - body: content, - ...options, - }); + return RequestHelper.post()( + this, + `${rId}/${this.resource2Type}/${r2Id}/discussions`, + { + body: content, + ...options, + }, + ); } editNote( @@ -70,7 +112,7 @@ export class ResourceDiscussions extends BaseService { encodeURIComponent, ); - return RequestHelper.put( + return RequestHelper.put()( this, `${rId}/${this.resource2Type}/${r2Id}/discussions/${dId}/notes/${nId}`, { @@ -91,7 +133,7 @@ export class ResourceDiscussions extends BaseService { encodeURIComponent, ); - return RequestHelper.del( + return RequestHelper.del()( this, `${rId}/${this.resource2Type}/${r2Id}/discussions/${dId}/notes/${nId}`, options, @@ -106,7 +148,7 @@ export class ResourceDiscussions extends BaseService { ) { const [rId, r2Id, dId] = [resourceId, resource2Id, discussionId].map(encodeURIComponent); - return RequestHelper.get( + return RequestHelper.get()( this, `${rId}/${this.resource2Type}/${r2Id}/discussions/${dId}`, options, diff --git a/packages/gitbeaker-core/src/templates/ResourceIssueBoards.ts b/packages/gitbeaker-core/src/templates/ResourceIssueBoards.ts index ece65190..f007b3b9 100644 --- a/packages/gitbeaker-core/src/templates/ResourceIssueBoards.ts +++ b/packages/gitbeaker-core/src/templates/ResourceIssueBoards.ts @@ -1,4 +1,6 @@ -import { BaseService } from '@gitbeaker/requester-utils'; +import { BaseService, BaseServiceOptions } from '@gitbeaker/requester-utils'; +import { MilestoneSchema } from './ResourceMilestones'; +import { LabelSchema } from './ResourceLabels'; import { BaseRequestOptions, PaginatedRequestOptions, @@ -6,33 +8,57 @@ import { Sudo, } from '../infrastructure'; -export class ResourceIssueBoards extends BaseService { - constructor(resourceType: string, options) { +export interface IssueBoardListSchema extends Record { + id: number; + label: Pick; + position: number; + max_issue_count: number; + max_issue_weight: number; + limit_metric?: string; +} + +export interface IssueBoardSchema extends Record { + id: number; + name: string; + milestone: Pick; + lists?: IssueBoardListSchema[]; +} + +export class ResourceIssueBoards extends BaseService { + constructor(resourceType: string, options: BaseServiceOptions) { super({ prefixUrl: resourceType, ...options }); } all(resourceId: string | number, options?: PaginatedRequestOptions) { const rId = encodeURIComponent(resourceId); - return RequestHelper.get(this, `${rId}/boards`, options); + return RequestHelper.get()(this, `${rId}/boards`, options); } create(resourceId: string | number, name: string, options?: Sudo) { const rId = encodeURIComponent(resourceId); - return RequestHelper.post(this, `${rId}/boards`, { name, ...options }); + return RequestHelper.post()(this, `${rId}/boards`, { name, ...options }); } - createList(resourceId: string | number, boardId: number, labelId: number, options?: Sudo) { + createList( + resourceId: string | number, + boardId: number, + labelId: number | string, + options?: Sudo, + ) { const [rId, bId] = [resourceId, boardId].map(encodeURIComponent); - return RequestHelper.post(this, `${rId}/boards/${bId}/lists`, { labelId, ...options }); + return RequestHelper.post()(this, `${rId}/boards/${bId}/lists`, { + labelId, + ...options, + }); } edit(resourceId: string | number, boardId: number, options?: BaseRequestOptions) { const [rId, bId] = [resourceId, boardId].map(encodeURIComponent); - return RequestHelper.put(this, `${rId}/boards/${bId}`, options); + return RequestHelper.put()(this, `${rId}/boards/${bId}`, options); } editList( @@ -44,36 +70,43 @@ export class ResourceIssueBoards extends BaseService { ) { const [rId, bId, lId] = [resourceId, boardId, listId].map(encodeURIComponent); - return RequestHelper.put(this, `${rId}/boards/${bId}/lists/${lId}`, { position, ...options }); + return RequestHelper.put()(this, `${rId}/boards/${bId}/lists/${lId}`, { + position, + ...options, + }); } lists(resourceId: string | number, boardId: number, options?: Sudo) { const [rId, bId] = [resourceId, boardId].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/boards/${bId}/lists`, options); + return RequestHelper.get()(this, `${rId}/boards/${bId}/lists`, options); } remove(resourceId: string | number, boardId: number, options?: Sudo) { const [rId, bId] = [resourceId, boardId].map(encodeURIComponent); - return RequestHelper.del(this, `${rId}/boards/${bId}`, options); + return RequestHelper.del()(this, `${rId}/boards/${bId}`, options); } removeList(resourceId: string | number, boardId: number, listId: number, options?: Sudo) { const [rId, bId, lId] = [resourceId, boardId, listId].map(encodeURIComponent); - return RequestHelper.del(this, `${rId}/boards/${bId}/lists/${lId}`, options); + return RequestHelper.del()(this, `${rId}/boards/${bId}/lists/${lId}`, options); } show(resourceId: string | number, boardId: number, options?: Sudo) { const [rId, bId] = [resourceId, boardId].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/boards/${bId}`, options); + return RequestHelper.get()(this, `${rId}/boards/${bId}`, options); } showList(resourceId: string | number, boardId: number, listId: number, options?: Sudo) { const [rId, bId, lId] = [resourceId, boardId, listId].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/boards/${bId}/lists/${lId}`, options); + return RequestHelper.get()( + this, + `${rId}/boards/${bId}/lists/${lId}`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/templates/ResourceLabels.ts b/packages/gitbeaker-core/src/templates/ResourceLabels.ts index b8739896..e0e0b8cd 100644 --- a/packages/gitbeaker-core/src/templates/ResourceLabels.ts +++ b/packages/gitbeaker-core/src/templates/ResourceLabels.ts @@ -7,57 +7,72 @@ import { ShowExpanded, } from '../infrastructure'; -export class ResourceLabels extends BaseService { - constructor(resourceType: string, options: BaseServiceOptions & ShowExpanded) { +export interface LabelSchema extends Record { + id: number; + name: string; + color: string; + text_color: string; + description: string; + description_html: string; + open_issues_count: number; + closed_issues_count: number; + open_merge_requests_count: number; + subscribed: boolean; + priority: number; + is_project_label: boolean; +} + +export class ResourceLabels extends BaseService { + constructor(resourceType: string, options: BaseServiceOptions) { super({ prefixUrl: resourceType, ...options }); } - all(resourceId: string | number, options?: PaginatedRequestOptions & ShowExpanded) { + all(resourceId: string | number, options?: PaginatedRequestOptions) { const rId = encodeURIComponent(resourceId); - return RequestHelper.get(this, `${rId}/labels`, options); + return RequestHelper.get()(this, `${rId}/labels`, options); } create( resourceId: string | number, labelName: string, color: string, - options?: BaseRequestOptions & ShowExpanded, + options?: BaseRequestOptions, ) { const rId = encodeURIComponent(resourceId); - return RequestHelper.post(this, `${rId}/labels`, { + return RequestHelper.post()(this, `${rId}/labels`, { name: labelName, color, ...options, }); } - edit( + edit(resourceId: string | number, labelId: number | string, options?: BaseRequestOptions) { + const [rId, lId] = [resourceId, labelId].map(encodeURIComponent); + + return RequestHelper.put()(this, `${rId}/labels/${lId}`, options); + } + + remove(resourceId: string | number, labelId: number | string, options?: Sudo & ShowExpanded) { + const [rId, lId] = [resourceId, labelId].map(encodeURIComponent); + + return RequestHelper.del()(this, `${rId}/labels/${lId}`, options); + } + + subscribe(resourceId: string | number, labelId: number | string, options?: Sudo & ShowExpanded) { + const [rId, lId] = [resourceId, labelId].map(encodeURIComponent); + + return RequestHelper.post()(this, `${rId}/issues/${lId}/subscribe`, options); + } + + unsubscribe( resourceId: string | number, - labelName: string, - options?: BaseRequestOptions & ShowExpanded, + labelId: number | string, + options?: Sudo & ShowExpanded, ) { - const rId = encodeURIComponent(resourceId); - - return RequestHelper.put(this, `${rId}/labels`, { name: labelName, ...options }); - } - - remove(resourceId: string | number, labelName: string, options?: Sudo & ShowExpanded) { - const rId = encodeURIComponent(resourceId); - - return RequestHelper.del(this, `${rId}/labels`, { name: labelName, ...options }); - } - - subscribe(resourceId: string | number, labelId: number, options?: Sudo & ShowExpanded) { const [rId, lId] = [resourceId, labelId].map(encodeURIComponent); - return RequestHelper.post(this, `${rId}/issues/${lId}/subscribe`, options); - } - - unsubscribe(resourceId: string | number, labelId: number, options?: Sudo & ShowExpanded) { - const [rId, lId] = [resourceId, labelId].map(encodeURIComponent); - - return RequestHelper.del(this, `${rId}/issues/${lId}/unsubscribe`, options); + return RequestHelper.post()(this, `${rId}/issues/${lId}/unsubscribe`, options); } } diff --git a/packages/gitbeaker-core/src/templates/ResourceMembers.ts b/packages/gitbeaker-core/src/templates/ResourceMembers.ts index e98dd730..ea541856 100644 --- a/packages/gitbeaker-core/src/templates/ResourceMembers.ts +++ b/packages/gitbeaker-core/src/templates/ResourceMembers.ts @@ -7,12 +7,29 @@ import { } from '../infrastructure'; import { AccessLevel } from './ResourceAccessRequests'; -interface IncludeInherited { +export interface IncludeInherited { includeInherited?: boolean; } -export class ResourceMembers extends BaseService { - constructor(resourceType: string, options: BaseServiceOptions) { +export interface MembersSchema extends Record { + id: number; + username: string; + name: string; + state: string; + avatar_url: string; + web_url: string; + expires_at: string; + access_level: AccessLevel; + email: string; + group_saml_identity: { + extern_uid: string; + provider: string; + saml_provider_id: number; + }; +} + +export class ResourceMembers extends BaseService { + constructor(resourceType: string, options: BaseServiceOptions) { super({ prefixUrl: resourceType, ...options }); } @@ -24,7 +41,7 @@ export class ResourceMembers extends BaseService { ) { const [rId, uId] = [resourceId, userId].map(encodeURIComponent); - return RequestHelper.post(this, `${rId}/members`, { + return RequestHelper.post()(this, `${rId}/members`, { userId: uId, accessLevel, ...options, @@ -40,7 +57,7 @@ export class ResourceMembers extends BaseService { if (includeInherited) url.push('all'); - return RequestHelper.get(this, url.join('/'), options); + return RequestHelper.get()(this, url.join('/'), options); } edit( @@ -51,7 +68,7 @@ export class ResourceMembers extends BaseService { ) { const [rId, uId] = [resourceId, userId].map(encodeURIComponent); - return RequestHelper.put(this, `${rId}/members/${uId}`, { + return RequestHelper.put()(this, `${rId}/members/${uId}`, { accessLevel, ...options, }); @@ -69,12 +86,16 @@ export class ResourceMembers extends BaseService { url.push(uId); - return RequestHelper.get(this, url.join('/'), options); + return RequestHelper.get()( + this, + url.join('/'), + options as Record, + ); } remove(resourceId: string | number, userId: number, options?: Sudo) { const [rId, uId] = [resourceId, userId].map(encodeURIComponent); - return RequestHelper.del(this, `${rId}/members/${uId}`, options); + return RequestHelper.del()(this, `${rId}/members/${uId}`, options); } } diff --git a/packages/gitbeaker-core/src/templates/ResourceMilestones.ts b/packages/gitbeaker-core/src/templates/ResourceMilestones.ts index 1317b64b..e36851ae 100644 --- a/packages/gitbeaker-core/src/templates/ResourceMilestones.ts +++ b/packages/gitbeaker-core/src/templates/ResourceMilestones.ts @@ -5,45 +5,66 @@ import { BaseRequestOptions, Sudo, } from '../infrastructure'; +import type { IssueSchema } from '../services/Issues'; +import type { MergeRequestSchema } from '../services/MergeRequests'; -export class ResourceMilestones extends BaseService { - constructor(resourceType: string, options: BaseServiceOptions) { +export interface MilestoneSchema extends Record { + id: number; + iid: number; + project_id: number; + title: string; + description: string; + due_date?: string; + start_date: string; + state: string; + updated_at: string; + created_at: string; + expired: boolean; + web_url?: string; +} + +export class ResourceMilestones extends BaseService { + constructor(resourceType: string, options: BaseServiceOptions) { super({ prefixUrl: resourceType, ...options }); } all(resourceId: string | number, options?: PaginatedRequestOptions) { const rId = encodeURIComponent(resourceId); - return RequestHelper.get(this, `${rId}/milestones`, options); + return RequestHelper.get()(this, `${rId}/milestones`, options); } create(resourceId: string | number, title: string, options?: BaseRequestOptions) { const rId = encodeURIComponent(resourceId); - return RequestHelper.post(this, `${rId}/milestones`, { title, ...options }); + return RequestHelper.post()(this, `${rId}/milestones`, { title, ...options }); } edit(resourceId: string | number, milestoneId: number, options?: BaseRequestOptions) { const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); - return RequestHelper.put(this, `${rId}/milestones/${mId}`, options); + return RequestHelper.put()(this, `${rId}/milestones/${mId}`, options); } issues(resourceId: string | number, milestoneId: number, options?: Sudo) { const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/milestones/${mId}/issues`, options); + return RequestHelper.get()(this, `${rId}/milestones/${mId}/issues`, options); } mergeRequests(resourceId: string | number, milestoneId: number, options?: Sudo) { const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/milestones/${mId}/merge_requests`, options); + return RequestHelper.get()( + this, + `${rId}/milestones/${mId}/merge_requests`, + options, + ); } show(resourceId: string | number, milestoneId: number, options?: Sudo) { const [rId, mId] = [resourceId, milestoneId].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/milestones/${mId}`, options); + return RequestHelper.get()(this, `${rId}/milestones/${mId}`, options); } } diff --git a/packages/gitbeaker-core/src/templates/ResourceNoteAwardEmojis.ts b/packages/gitbeaker-core/src/templates/ResourceNoteAwardEmojis.ts new file mode 100644 index 00000000..359f0139 --- /dev/null +++ b/packages/gitbeaker-core/src/templates/ResourceNoteAwardEmojis.ts @@ -0,0 +1,71 @@ +import { BaseService, BaseServiceOptions } from '@gitbeaker/requester-utils'; +import { PaginatedRequestOptions, RequestHelper, Sudo } from '../infrastructure'; +import { AwardEmojiSchema, url } from './ResourceAwardEmojis'; + +export class ResourceNoteAwardEmojis extends BaseService { + protected resourceType: string; + + constructor(resourceType: string, options: BaseServiceOptions) { + super({ prefixUrl: 'projects', ...options }); + + this.resourceType = resourceType; + } + + all( + projectId: string | number, + resourceIId: number, + noteId: number, + options?: PaginatedRequestOptions, + ) { + return RequestHelper.get()( + this, + url(projectId, this.resourceType, resourceIId, null, noteId), + options, + ); + } + + award( + projectId: string | number, + resourceIId: number, + noteId: number, + name: string, + options?: Sudo, + ) { + return RequestHelper.post()( + this, + url(projectId, this.resourceType, resourceIId, null, noteId), + { + name, + ...options, + }, + ); + } + + remove( + projectId: string | number, + resourceIId: number, + noteId: number, + awardId: number, + options?: Sudo, + ) { + return RequestHelper.del()( + this, + url(projectId, this.resourceType, resourceIId, awardId, noteId), + options, + ); + } + + show( + projectId: string | number, + resourceIId: number, + noteId: number, + awardId: number, + options?: Sudo, + ) { + return RequestHelper.get()( + this, + url(projectId, this.resourceType, resourceIId, awardId, noteId), + options, + ); + } +} diff --git a/packages/gitbeaker-core/src/templates/ResourceNotes.ts b/packages/gitbeaker-core/src/templates/ResourceNotes.ts index 3ad03ed0..2b934016 100644 --- a/packages/gitbeaker-core/src/templates/ResourceNotes.ts +++ b/packages/gitbeaker-core/src/templates/ResourceNotes.ts @@ -1,4 +1,5 @@ import { BaseService, BaseServiceOptions } from '@gitbeaker/requester-utils'; +import { UserSchema } from '../services/Users'; import { RequestHelper, PaginatedRequestOptions, @@ -6,10 +7,19 @@ import { Sudo, } from '../infrastructure'; -export class ResourceNotes extends BaseService { +export interface NoteSchema extends Record { + id: number; + body: string; + author: UserSchema; + created_at: string; + updated_at: string; + confidential: boolean; +} + +export class ResourceNotes extends BaseService { protected resource2Type: string; - constructor(resourceType: string, resource2Type: string, options: BaseServiceOptions) { + constructor(resourceType: string, resource2Type: string, options: BaseServiceOptions) { super({ prefixUrl: resourceType, ...options }); this.resource2Type = resource2Type; @@ -22,7 +32,11 @@ export class ResourceNotes extends BaseService { ) { const [rId, r2Id] = [resourceId, resource2Id].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/${this.resource2Type}/${r2Id}/notes`, options); + return RequestHelper.get()( + this, + `${rId}/${this.resource2Type}/${r2Id}/notes`, + options, + ); } create( @@ -33,7 +47,7 @@ export class ResourceNotes extends BaseService { ) { const [rId, r2Id] = [resourceId, resource2Id].map(encodeURIComponent); - return RequestHelper.post(this, `${rId}/${this.resource2Type}/${r2Id}/notes`, { + return RequestHelper.post()(this, `${rId}/${this.resource2Type}/${r2Id}/notes`, { body, ...options, }); @@ -48,10 +62,14 @@ export class ResourceNotes extends BaseService { ) { const [rId, r2Id, nId] = [resourceId, resource2Id, noteId].map(encodeURIComponent); - return RequestHelper.put(this, `${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`, { - body, - ...options, - }); + return RequestHelper.put()( + this, + `${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`, + { + body, + ...options, + }, + ); } remove( @@ -62,12 +80,16 @@ export class ResourceNotes extends BaseService { ) { const [rId, r2Id, nId] = [resourceId, resource2Id, noteId].map(encodeURIComponent); - return RequestHelper.del(this, `${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`, options); + return RequestHelper.del()(this, `${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`, options); } show(resourceId: string | number, resource2Id: string | number, noteId: number, options?: Sudo) { const [rId, r2Id, nId] = [resourceId, resource2Id, noteId].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`, options); + return RequestHelper.get()( + this, + `${rId}/${this.resource2Type}/${r2Id}/notes/${nId}`, + options, + ); } } diff --git a/packages/gitbeaker-core/src/templates/ResourceTemplates.ts b/packages/gitbeaker-core/src/templates/ResourceTemplates.ts index e02152cf..cd24c94e 100644 --- a/packages/gitbeaker-core/src/templates/ResourceTemplates.ts +++ b/packages/gitbeaker-core/src/templates/ResourceTemplates.ts @@ -1,18 +1,23 @@ import { BaseService, BaseServiceOptions } from '@gitbeaker/requester-utils'; import { RequestHelper, PaginatedRequestOptions, Sudo } from '../infrastructure'; -export class ResourceTemplates extends BaseService { - constructor(resourceType: string, options: BaseServiceOptions) { +export interface ResourceTemplateSchema extends Record { + name: string; + content: string; +} + +export class ResourceTemplates extends BaseService { + constructor(resourceType: string, options: BaseServiceOptions) { super({ prefixUrl: ['templates', resourceType].join('/'), ...options }); } all(options?: PaginatedRequestOptions) { - return RequestHelper.get(this, '', options); + return RequestHelper.get()(this, '', options); } - show(resourceId: string | number, options?: Sudo) { - const rId = encodeURIComponent(resourceId); + show(key: string | number, options?: Sudo) { + const rId = encodeURIComponent(key); - return RequestHelper.get(this, `${rId}`, options); + return RequestHelper.get()(this, `${rId}`, options); } } diff --git a/packages/gitbeaker-core/src/templates/ResourceVariables.ts b/packages/gitbeaker-core/src/templates/ResourceVariables.ts index 445575a9..7e91ee04 100644 --- a/packages/gitbeaker-core/src/templates/ResourceVariables.ts +++ b/packages/gitbeaker-core/src/templates/ResourceVariables.ts @@ -1,7 +1,7 @@ import { BaseService, BaseServiceOptions } from '@gitbeaker/requester-utils'; import { RequestHelper, PaginatedRequestOptions } from '../infrastructure'; -export interface ResourceVariableSchemaDefault { +export interface ResourceVariableSchema extends Record { variable_type: 'env_var' | 'file'; value: string; protected: boolean; @@ -10,54 +10,38 @@ export interface ResourceVariableSchemaDefault { key: string; } -export interface ResourceVariableSchemaCamelizedNoKey { - variableType: 'env_var' | 'file'; - value: string; - protected: boolean; - masked: boolean; - environmentScope?: string; -} - -export interface ResourceVariableSchemaCamelized extends ResourceVariableSchemaCamelizedNoKey { - key: string; -} - -export type ResourceVariableSchema = - | ResourceVariableSchemaDefault - | ResourceVariableSchemaCamelized; - -export class ResourceVariables extends BaseService { - constructor(resourceType: string, options: BaseServiceOptions) { +export class ResourceVariables extends BaseService { + constructor(resourceType: string, options: BaseServiceOptions) { super({ prefixUrl: resourceType, ...options }); } all(resourceId: string | number, options?: PaginatedRequestOptions) { const rId = encodeURIComponent(resourceId); - return RequestHelper.get(this, `${rId}/variables`, options); + return RequestHelper.get()(this, `${rId}/variables`, options); } - create(resourceId: string | number, options?: ResourceVariableSchemaCamelized) { + create(resourceId: string | number, options?: ResourceVariableSchema) { const rId = encodeURIComponent(resourceId); - return RequestHelper.post(this, `${rId}/variables`, options); + return RequestHelper.post()(this, `${rId}/variables`, options); } - edit(resourceId: string | number, keyId: string, options?: ResourceVariableSchemaCamelizedNoKey) { + edit(resourceId: string | number, keyId: string, options?: Omit) { const [rId, kId] = [resourceId, keyId].map(encodeURIComponent); - return RequestHelper.put(this, `${rId}/variables/${kId}`, options); + return RequestHelper.put()(this, `${rId}/variables/${kId}`, options); } show(resourceId: string | number, keyId: string, options?: PaginatedRequestOptions) { const [rId, kId] = [resourceId, keyId].map(encodeURIComponent); - return RequestHelper.get(this, `${rId}/variables/${kId}`, options); + return RequestHelper.get()(this, `${rId}/variables/${kId}`, options); } remove(resourceId: string | number, keyId: string, options?: PaginatedRequestOptions) { const [rId, kId] = [resourceId, keyId].map(encodeURIComponent); - return RequestHelper.del(this, `${rId}/variables/${kId}`, options); + return RequestHelper.del()(this, `${rId}/variables/${kId}`, options); } } diff --git a/packages/gitbeaker-core/src/templates/index.ts b/packages/gitbeaker-core/src/templates/index.ts index 22971c1b..10405a16 100644 --- a/packages/gitbeaker-core/src/templates/index.ts +++ b/packages/gitbeaker-core/src/templates/index.ts @@ -1,5 +1,6 @@ export * from './ResourceAccessRequests'; export * from './ResourceAwardEmojis'; +export * from './ResourceNoteAwardEmojis'; export * from './ResourceBadges'; export * from './ResourceCustomAttributes'; export * from './ResourceDeployTokens'; diff --git a/packages/gitbeaker-core/test/__mocks__/RequestHelper.ts b/packages/gitbeaker-core/test/__mocks__/RequestHelper.ts new file mode 100644 index 00000000..9484d202 --- /dev/null +++ b/packages/gitbeaker-core/test/__mocks__/RequestHelper.ts @@ -0,0 +1,11 @@ +const mockHelperFn = jest.fn(); + +export default { + RequestHelper: { + post: () => mockHelperFn, + get: () => mockHelperFn, + put: () => mockHelperFn, + del: () => mockHelperFn, + stream: mockHelperFn, + }, +}; diff --git a/packages/gitbeaker-core/test/unit/bundles/GroupsBundle.ts b/packages/gitbeaker-core/test/unit/bundles/GroupsBundle.ts index 7a2fa019..24deba6f 100644 --- a/packages/gitbeaker-core/test/unit/bundles/GroupsBundle.ts +++ b/packages/gitbeaker-core/test/unit/bundles/GroupsBundle.ts @@ -11,9 +11,10 @@ test('All the correct service keys are included in the groups bundle', async () 'GroupIssueBoards', 'GroupMembers', 'GroupMilestones', - 'GroupProjects', + 'GroupRunners', 'GroupVariables', 'GroupLabels', + 'GroupDeployTokens', 'Epics', 'EpicIssues', 'EpicNotes', diff --git a/packages/gitbeaker-core/test/unit/bundles/UsersBundle.ts b/packages/gitbeaker-core/test/unit/bundles/UsersBundle.ts index f3de1610..85473ac7 100644 --- a/packages/gitbeaker-core/test/unit/bundles/UsersBundle.ts +++ b/packages/gitbeaker-core/test/unit/bundles/UsersBundle.ts @@ -8,7 +8,7 @@ test('All the correct service keys are included in the users bundle', async () = 'UserEmails', 'UserCustomAttributes', 'UserImpersonationTokens', - 'UserKeys', + 'UserSSHKeys', 'UserGPGKeys', ]; diff --git a/packages/gitbeaker-core/test/unit/infrastructure/RequestHelper.ts b/packages/gitbeaker-core/test/unit/infrastructure/RequestHelper.ts index 69e1b110..a3276491 100644 --- a/packages/gitbeaker-core/test/unit/infrastructure/RequestHelper.ts +++ b/packages/gitbeaker-core/test/unit/infrastructure/RequestHelper.ts @@ -1,6 +1,6 @@ import FormData from 'form-data'; import { BaseService, RequesterType } from '@gitbeaker/requester-utils'; -import { RequestHelper, PaginationResponse } from '../../../src/infrastructure/RequestHelper'; +import { RequestHelper } from '../../../src/infrastructure/RequestHelper'; /* eslint no-empty-pattern: 0 */ /* eslint prefer-destructuring: 0 */ @@ -70,7 +70,7 @@ describe('RequestHelper.get()', () => { it('should respond with the proper get url without pagination', async () => { service.requester.get = jest.fn(() => mockedGetBasic()); - await RequestHelper.get(service, 'test'); + await RequestHelper.get()(service, 'test'); expect(service.requester.get).toHaveBeenCalledWith('test', { query: {}, @@ -81,7 +81,7 @@ describe('RequestHelper.get()', () => { it('should respond with an object', async () => { service.requester.get = jest.fn(() => mockedGetBasic()); - const response = (await RequestHelper.get(service, 'test')) as Record; + const response = await RequestHelper.get()(service, 'test'); expect(response.prop1).toBe(5); expect(response.prop2).toBe('test property'); @@ -90,7 +90,7 @@ describe('RequestHelper.get()', () => { it('should be paginated when links are present', async () => { service.requester.get = jest.fn((url, options) => mockedGetExtended(url, options)); - const response = (await RequestHelper.get(service, 'test')) as Record[]; + const response = await RequestHelper.get[]>()(service, 'test'); response.forEach((l, index) => { expect(l.prop1).toBe(1 + index); @@ -105,7 +105,7 @@ describe('RequestHelper.get()', () => { mockedGetExtended(url, { query: { ...options.query, maxPages: 70 } }), ); - const response = (await RequestHelper.get(service, 'test')) as Record[]; + const response = await RequestHelper.get[]>()(service, 'test'); response.forEach((l, index) => { expect(l.prop1).toBe(1 + index); @@ -120,10 +120,9 @@ describe('RequestHelper.get()', () => { mockedGetExtended(url, { query: { ...options.query, maxPages: 3 } }), ); - const response = (await RequestHelper.get(service, 'test', { maxPages: 3 })) as Record< - string, - unknown - >[]; + const response = await RequestHelper.get[]>()(service, 'test', { + maxPages: 3, + }); expect(response).toHaveLength(6); @@ -136,10 +135,9 @@ describe('RequestHelper.get()', () => { it('should be paginated but limited by the page option', async () => { service.requester.get = jest.fn((url, options) => mockedGetExtended(url, options)); - const response = (await RequestHelper.get(service, 'test', { page: 2 })) as Record< - string, - unknown - >[]; + const response = await RequestHelper.get[]>()(service, 'test', { + page: 2, + }); expect(response).toHaveLength(2); @@ -152,10 +150,10 @@ describe('RequestHelper.get()', () => { it('should show the pagination information when the showExpanded option is given', async () => { service.requester.get = jest.fn((url, options) => mockedGetExtended(url, options)); - const response = (await RequestHelper.get(service, 'test', { + const response = await RequestHelper.get[]>()(service, 'test', { page: 2, showExpanded: true, - })) as PaginationResponse; + }); expect(response.data).toHaveLength(2); @@ -177,10 +175,10 @@ describe('RequestHelper.get()', () => { it('should not show the pagination information when the showExpanded option is undefined or false', async () => { service.requester.get = jest.fn((url, options) => mockedGetExtended(url, options)); - const response = (await RequestHelper.get(service, 'test', { + const response = await RequestHelper.get[]>()(service, 'test', { page: 2, showExpanded: false, - })) as Record[]; + }); expect(response).toHaveLength(2); @@ -193,9 +191,9 @@ describe('RequestHelper.get()', () => { it('should not show the pagination information when using keyset pagination', async () => { service.requester.get = jest.fn((url, options) => mockedGetExtended(url, options)); - const response = (await RequestHelper.get(service, 'test', { + const response = await RequestHelper.get[]>()(service, 'test', { pagination: 'keyset', - })) as Record[]; + }); expect(response).toHaveLength(20); @@ -210,10 +208,10 @@ describe('RequestHelper.get()', () => { mockedGetExtended(url, { query: { ...options.query, maxPages: 2 } }), ); - const response = (await RequestHelper.get(service, 'test', { + const response = await RequestHelper.get[]>()(service, 'test', { pagination: 'keyset', maxPages: 2, - })) as Record[]; + }); expect(response).toHaveLength(4); @@ -226,10 +224,10 @@ describe('RequestHelper.get()', () => { it('should not show the pagination information when using keyset pagination and showExpanded is given', async () => { service.requester.get = jest.fn((url, options) => mockedGetExtended(url, options)); - const response = (await RequestHelper.get(service, 'test', { + const response = await RequestHelper.get[]>()(service, 'test', { pagination: 'keyset', showExpanded: true, - })) as Record[]; + }); expect(response).toHaveLength(20); @@ -241,11 +239,11 @@ describe('RequestHelper.get()', () => { it('should return simple response with camelized keys when using the camelize option', async () => { service.camelize = true; - service.show = jest.fn(() => RequestHelper.get(service, 'test')); + service.show = jest.fn(() => RequestHelper.get()(service, 'test')); service.requester.get = jest.fn(() => ({ body: [ - { id: 3, gravatar_enable: true }, - { id: 4, gravatar_enable: false }, + { id: 3, gravatar_enable: true }, // eslint-disable-line + { id: 4, gravatar_enable: false }, // eslint-disable-line ], headers: {}, })); @@ -259,7 +257,7 @@ describe('RequestHelper.get()', () => { }); it('should return simple response with default keys without camelize option', async () => { - service.show = jest.fn(() => RequestHelper.get(service, 'test')); + service.show = jest.fn(() => RequestHelper.get()(service, 'test')); service.requester.get = jest.fn(() => ({ body: { id: 3, gravatar_enable: true }, headers: {}, @@ -267,7 +265,7 @@ describe('RequestHelper.get()', () => { const results = await service.show(); - expect(results).toMatchObject({ id: 3, gravatar_enable: true }); + expect(results).toMatchObject({ id: 3, gravatar_enable: true }); // eslint-disable-line }); }); @@ -293,7 +291,7 @@ describe('RequestHelper.post()', () => { it('should pass the correct arguments to the Requester', async () => { service.requester.post = jest.fn(() => ({ body: '' })); - await RequestHelper.post(service, 'test', { sudo: 'yes' }); + await RequestHelper.post()(service, 'test', { sudo: 'yes' }); expect(service.requester.post).toBeCalledWith('test', { body: {}, sudo: 'yes' }); }); @@ -301,7 +299,7 @@ describe('RequestHelper.post()', () => { it('should pass arguments as form arguments if the isForm flag is passed', async () => { service.requester.post = jest.fn(() => ({ body: '' })); - RequestHelper.post(service, 'test', { isForm: true, test: 3 }); + await RequestHelper.post()(service, 'test', { isForm: true, test: 3 }); expect(service.requester.post).toBeCalledWith('test', { body: expect.any(FormData), @@ -314,7 +312,7 @@ describe('RequestHelper.put()', () => { it('should pass the correct arguments to the Requester', async () => { service.requester.put = jest.fn(() => ({ body: '' })); - await RequestHelper.put(service, 'test', { sudo: 'yes' }); + await RequestHelper.put()(service, 'test', { sudo: 'yes' }); expect(service.requester.put).toBeCalledWith('test', { body: {}, sudo: 'yes' }); }); @@ -324,7 +322,7 @@ describe('RequestHelper.del()', () => { it('should pass the correct arguments to the Requester', async () => { service.requester.delete = jest.fn(() => ({ body: '' })); - await RequestHelper.del(service, 'test', { sudo: 'yes' }); + await RequestHelper.del()(service, 'test', { sudo: 'yes' }); expect(service.requester.delete).toBeCalledWith('test', { query: {}, sudo: 'yes' }); }); diff --git a/packages/gitbeaker-core/test/unit/services/ApplicationSettings.ts b/packages/gitbeaker-core/test/unit/services/ApplicationSettings.ts index 80362dc5..6ca27eda 100644 --- a/packages/gitbeaker-core/test/unit/services/ApplicationSettings.ts +++ b/packages/gitbeaker-core/test/unit/services/ApplicationSettings.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { ApplicationSettings } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ApplicationSettings; @@ -27,7 +30,7 @@ describe('ApplicationSettings.all', () => { it('should request GET /application/settings', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'application/settings', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'application/settings', undefined); }); }); @@ -35,7 +38,7 @@ describe('ApplicationSettings.edit', () => { it('should request PUT /application_settings with a terms property', async () => { await service.edit({ terms: 'Testing terms' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'application/settings', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'application/settings', { terms: 'Testing terms', }); }); diff --git a/packages/gitbeaker-core/test/unit/services/Branches.ts b/packages/gitbeaker-core/test/unit/services/Branches.ts index 982436fc..99f39e65 100644 --- a/packages/gitbeaker-core/test/unit/services/Branches.ts +++ b/packages/gitbeaker-core/test/unit/services/Branches.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Branches } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Branches; @@ -27,7 +30,7 @@ describe('Branches.all', () => { it('should request GET /projects/:id/repository/branches', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/repository/branches', undefined, @@ -39,7 +42,7 @@ describe('Branches.create', () => { it('should request POST /projects/:id/repository/branches in v4', async () => { await service.create(1, 'name', 'ref'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/repository/branches', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/repository/branches', { branch: 'name', ref: 'ref', }); @@ -55,28 +58,18 @@ describe('Branches.create', () => { await v3Service.create(1, 'name', 'ref'); - expect(RequestHelper.post).toHaveBeenCalledWith(v3Service, 'projects/1/repository/branches', { + expect(RequestHelper.post()).toHaveBeenCalledWith(v3Service, 'projects/1/repository/branches', { branchName: 'name', ref: 'ref', }); }); }); -describe('Branches.protect', () => { - it('should request POST /projects/:id/protected_branches', async () => { - await service.protect(1, 'name'); - - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/protected_branches', { - name: 'name', - }); - }); -}); - describe('Branches.remove', () => { it('should request DEL /projects/:id/repository/branches/:name', async () => { await service.remove(1, 'name'); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/1/repository/branches/name', undefined, @@ -88,22 +81,10 @@ describe('Branches.show', () => { it('should request GET /projects/:id/repository/branches/:name', async () => { await service.show(1, 'name'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/repository/branches/name', undefined, ); }); }); - -describe('Branches.unprotect', () => { - it('should request PUT /projects/:id/repository/branches/:name/unprotect', async () => { - await service.unprotect(1, 'name'); - - expect(RequestHelper.put).toHaveBeenCalledWith( - service, - 'projects/1/repository/branches/name/unprotect', - undefined, - ); - }); -}); diff --git a/packages/gitbeaker-core/test/unit/services/BroadcastMessages.ts b/packages/gitbeaker-core/test/unit/services/BroadcastMessages.ts index 97f008c4..08c21a61 100644 --- a/packages/gitbeaker-core/test/unit/services/BroadcastMessages.ts +++ b/packages/gitbeaker-core/test/unit/services/BroadcastMessages.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { BroadcastMessages } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: BroadcastMessages; @@ -27,7 +30,7 @@ describe('BroadcastMessages.all', () => { it('should request GET /broadcast_messages', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'broadcast_messages', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'broadcast_messages', undefined); }); }); @@ -35,7 +38,7 @@ describe('BroadcastMessages.create', () => { it('should request POST /broadcast_messages', async () => { await service.create({ prop: 'test epic' }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'broadcast_messages', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'broadcast_messages', { prop: 'test epic', }); }); @@ -45,7 +48,7 @@ describe('BroadcastMessages.edit', () => { it('should request PUT /broadcast_messages', async () => { await service.edit(2, { prop: 4 }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'broadcast_messages/2', { prop: 4 }); + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'broadcast_messages/2', { prop: 4 }); }); }); @@ -53,7 +56,7 @@ describe('BroadcastMessages.remove', () => { it('should request DEL /broadcast_messages/:id', async () => { await service.remove(2); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'broadcast_messages/2', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'broadcast_messages/2', undefined); }); }); @@ -61,6 +64,6 @@ describe('BroadcastMessages.show', () => { it('should request GET /broadcast_messages/:id', async () => { await service.show(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'broadcast_messages/1', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'broadcast_messages/1', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/CommitDiscussions.ts b/packages/gitbeaker-core/test/unit/services/CommitDiscussions.ts index 80d4f581..ae53e65c 100644 --- a/packages/gitbeaker-core/test/unit/services/CommitDiscussions.ts +++ b/packages/gitbeaker-core/test/unit/services/CommitDiscussions.ts @@ -1,6 +1,9 @@ import { CommitDiscussions } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: CommitDiscussions; diff --git a/packages/gitbeaker-core/test/unit/services/Commits.ts b/packages/gitbeaker-core/test/unit/services/Commits.ts index f16b6547..4e1a5fc5 100644 --- a/packages/gitbeaker-core/test/unit/services/Commits.ts +++ b/packages/gitbeaker-core/test/unit/services/Commits.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Commits } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Commits; @@ -27,7 +30,7 @@ describe('Commits.all', () => { it('should request GET /projects/:id/repository/commits', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/repository/commits', undefined, @@ -39,7 +42,7 @@ describe('Commits.cherryPick', () => { it('should request POST projects/:id/repository/commits/:sha/cherry_pick', async () => { await service.cherryPick(1, '5a', 'master'); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/1/repository/commits/5a/cherry_pick', { @@ -53,7 +56,7 @@ describe('Commits.comments', () => { it('should request POST projects/:id/repository/commits/:sha/comments', async () => { await service.comments(1, '5a'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/repository/commits/5a/comments', undefined, @@ -71,7 +74,7 @@ describe('Commits.create', () => { }, ]); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/repository/commits', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/repository/commits', { branch: 'master', commitMessage: 'Test API commit creation', actions: [ @@ -87,7 +90,7 @@ describe('Commits.create', () => { it('should request POST /projects/:id/repository/commits without actions', async () => { await service.create(1, 'master', 'Test API commit creation'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/repository/commits', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/repository/commits', { branch: 'master', commitMessage: 'Test API commit creation', actions: [], @@ -99,7 +102,7 @@ describe('Commits.createComment', () => { it('should request POST projects/:id/repository/commits/:sha/comments', async () => { await service.createComment(1, '5a', 'note'); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/1/repository/commits/5a/comments', { note: 'note' }, @@ -111,7 +114,7 @@ describe('Commits.diff', () => { it('should request GET projects/:id/repository/commits/:sha/diff', async () => { await service.diff(1, '5a'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/repository/commits/5a/diff', undefined, @@ -123,7 +126,7 @@ describe('Commits.editStatus', () => { it('should request POST projects/:id/statuses/:ref', async () => { await service.editStatus(1, '5a'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/statuses/5a', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/statuses/5a', undefined); }); }); @@ -131,7 +134,7 @@ describe('Commits.references', () => { it('should request GET projects/:id/repository/commits/:sha/refs', async () => { await service.references(1, '5a'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/repository/commits/5a/refs', undefined, @@ -143,7 +146,7 @@ describe('Commits.show', () => { it('should request GET projects/:id/repository/commits/:sha', async () => { await service.show(1, '5a'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/repository/commits/5a', undefined, @@ -153,9 +156,9 @@ describe('Commits.show', () => { describe('Commits.status', () => { it('should request GET projects/:id/repository/commits/:sha/statuses', async () => { - await service.status(1, '5a'); + await service.statuses(1, '5a'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/repository/commits/5a/statuses', undefined, @@ -167,7 +170,7 @@ describe('Commits.mergeRequests', () => { it('should request GET projects/:id/repository/commits/:sha/statuses', async () => { await service.mergeRequests(1, '5a'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/repository/commits/5a/merge_requests', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/ContainerRegistry.ts b/packages/gitbeaker-core/test/unit/services/ContainerRegistry.ts index 2dc0f224..b4b44653 100644 --- a/packages/gitbeaker-core/test/unit/services/ContainerRegistry.ts +++ b/packages/gitbeaker-core/test/unit/services/ContainerRegistry.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { ContainerRegistry } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ContainerRegistry; @@ -25,9 +28,9 @@ describe('Instantiating ContainerRegistry service', () => { describe('ContainerRegistry.repositories', () => { it('should request GET /projects/:id/registry/repositories', async () => { - await service.repositories(1); + await service.projectRepositories(1); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/registry/repositories', undefined, @@ -39,7 +42,7 @@ describe('ContainerRegistry.tags', () => { it('should request GET /projects/:id/registry/repositories/:id/tags', async () => { await service.tags(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/registry/repositories/2/tags', undefined, @@ -51,7 +54,7 @@ describe('ContainerRegistry.removeRepository', () => { it('should request DELETE /projects/:id/registry/repositories/:id', async () => { await service.removeRepository(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/1/registry/repositories/2', undefined, @@ -63,7 +66,7 @@ describe('ContainerRegistry.removeTag', () => { it('should request DELETE /projects/:id/registry/repositories/:id/tags/:id', async () => { await service.removeTag(1, 2, 'name'); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/1/registry/repositories/2/tags/name', undefined, @@ -75,7 +78,7 @@ describe('ContainerRegistry.removeTags', () => { it('should request DELETE /projects/:id/registry/repositories/:id/tags', async () => { await service.removeTags(1, 2, 'name'); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/1/registry/repositories/2/tags', { nameRegexDelete: 'name' }, @@ -87,7 +90,7 @@ describe('ContainerRegistry.showTag', () => { it('should request GET /projects/:id/registry/repositories/:id/tags/:id', async () => { await service.showTag(1, 2, 'name'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/registry/repositories/2/tags/name', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/DeployKeys.ts b/packages/gitbeaker-core/test/unit/services/DeployKeys.ts index 05580036..aefc4ec9 100644 --- a/packages/gitbeaker-core/test/unit/services/DeployKeys.ts +++ b/packages/gitbeaker-core/test/unit/services/DeployKeys.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { DeployKeys } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: DeployKeys; @@ -27,7 +30,7 @@ describe('DeployKeys.add', () => { it('should request POST /projects/:id/deploy_keys', async () => { await service.add(1); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/deploy_keys', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/deploy_keys', undefined); }); }); @@ -35,21 +38,21 @@ describe('DeployKeys.all', () => { it('should request GET /deploy_keys', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'deploy_keys', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'deploy_keys', {}); }); it('should request GET /projects/:id/deploy_keys', async () => { await service.all({ projectId: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/deploy_keys', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/deploy_keys', {}); }); }); describe('DeployKeys.edit', () => { it('should request PUT /projects/:id/deploy_keys/:key', async () => { - await service.edit(1, 'key', { prop: 3 }); + await service.edit(1, 2, { prop: 3 }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/deploy_keys/key', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/deploy_keys/2', { prop: 3, }); }); @@ -57,11 +60,11 @@ describe('DeployKeys.edit', () => { describe('DeployKeys.show', () => { it('should request GET /projects/:id/deploy_keys/:key', async () => { - await service.show(1, 'key'); + await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, - 'projects/1/deploy_keys/key', + 'projects/1/deploy_keys/2', undefined, ); }); @@ -69,11 +72,11 @@ describe('DeployKeys.show', () => { describe('DeployKeys.remove', () => { it('should request DEL /projects/:id/deploy_keys/:key', async () => { - await service.remove(1, 'key'); + await service.remove(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, - 'projects/1/deploy_keys/key', + 'projects/1/deploy_keys/2', undefined, ); }); diff --git a/packages/gitbeaker-core/test/unit/services/Deployments.ts b/packages/gitbeaker-core/test/unit/services/Deployments.ts index bd9ee7e6..66763bd9 100644 --- a/packages/gitbeaker-core/test/unit/services/Deployments.ts +++ b/packages/gitbeaker-core/test/unit/services/Deployments.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Deployments } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Deployments; @@ -27,7 +30,7 @@ describe('Deployments.all', () => { it('should request GET /projects/:id/deployments', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/deployments', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/deployments', undefined); }); }); @@ -35,7 +38,11 @@ describe('Deployments.show', () => { it('should request GET /projects/:id/deployments/:id', async () => { await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/deployments/2', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith( + service, + 'projects/1/deployments/2', + undefined, + ); }); }); @@ -43,7 +50,7 @@ describe('Deployments.mergeRequests', () => { it('should request GET /projects/:id/deployments/:id/merge_requests', async () => { await service.mergeRequests(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/deployments/2/merge_requests', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/Environments.ts b/packages/gitbeaker-core/test/unit/services/Environments.ts index ac010a53..7537b312 100644 --- a/packages/gitbeaker-core/test/unit/services/Environments.ts +++ b/packages/gitbeaker-core/test/unit/services/Environments.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Environments } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Environments; @@ -27,7 +30,7 @@ describe('Environments.all', () => { it('should request GET /projects/:id/environments', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/environments', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/environments', undefined); }); }); @@ -35,7 +38,7 @@ describe('Environments.create', () => { it('should request POST /projects/:id/environments', async () => { await service.create(1, { prop: 1 }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/environments', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/environments', { prop: 1, }); }); @@ -45,7 +48,11 @@ describe('Environments.edit', () => { it('should request PUT /projects/:id/environments', async () => { await service.edit(1, 2); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/environments/2', undefined); + expect(RequestHelper.put()).toHaveBeenCalledWith( + service, + 'projects/1/environments/2', + undefined, + ); }); }); @@ -53,7 +60,11 @@ describe('Environments.show', () => { it('should request GET /projects/:id/environments/:id', async () => { await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/environments/2', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith( + service, + 'projects/1/environments/2', + undefined, + ); }); }); @@ -61,7 +72,11 @@ describe('Environments.remove', () => { it('should request DEL /projects/:id/environments/:id', async () => { await service.remove(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'projects/1/environments/2', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith( + service, + 'projects/1/environments/2', + undefined, + ); }); }); @@ -69,7 +84,7 @@ describe('Environments.stop', () => { it('should request POST /projects/:id/environments/:id/stop', async () => { await service.stop(1, 2); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/1/environments/2/stop', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/EpicDiscussions.ts b/packages/gitbeaker-core/test/unit/services/EpicDiscussions.ts index d2cb8ca2..7d2b320e 100644 --- a/packages/gitbeaker-core/test/unit/services/EpicDiscussions.ts +++ b/packages/gitbeaker-core/test/unit/services/EpicDiscussions.ts @@ -1,6 +1,9 @@ import { EpicDiscussions } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: EpicDiscussions; diff --git a/packages/gitbeaker-core/test/unit/services/EpicIssues.ts b/packages/gitbeaker-core/test/unit/services/EpicIssues.ts index 32b449eb..8b1f3327 100644 --- a/packages/gitbeaker-core/test/unit/services/EpicIssues.ts +++ b/packages/gitbeaker-core/test/unit/services/EpicIssues.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { EpicIssues } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: EpicIssues; @@ -27,7 +30,7 @@ describe('EpicIssues.all', () => { it('should request GET /groups/:id/epics/:id/issues', async () => { await service.all(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups/1/epics/2/issues', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/1/epics/2/issues', undefined); }); }); @@ -35,7 +38,7 @@ describe('EpicIssues.edit', () => { it('should request PUT /groups/:id/epics/:id/issues/:id', async () => { await service.edit(1, 2, 3, { title: 'Testing terms' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'groups/1/epics/2/issues/3', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'groups/1/epics/2/issues/3', { title: 'Testing terms', }); }); @@ -45,7 +48,7 @@ describe('EpicIssues.assign', () => { it('should request POST /groups/:id/epics/:id/issues/:id', async () => { await service.assign(1, 2, 3); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'groups/1/epics/2/issues/3', undefined, @@ -57,6 +60,10 @@ describe('EpicIssues.remove', () => { it('should request DEL /groups/:id/epics/:id/issues/:id', async () => { await service.remove(1, 2, 3); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'groups/1/epics/2/issues/3', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith( + service, + 'groups/1/epics/2/issues/3', + undefined, + ); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/EpicNotes.ts b/packages/gitbeaker-core/test/unit/services/EpicNotes.ts index 005dd393..0dbcf21b 100644 --- a/packages/gitbeaker-core/test/unit/services/EpicNotes.ts +++ b/packages/gitbeaker-core/test/unit/services/EpicNotes.ts @@ -1,6 +1,9 @@ import { EpicNotes } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: EpicNotes; diff --git a/packages/gitbeaker-core/test/unit/services/Epics.ts b/packages/gitbeaker-core/test/unit/services/Epics.ts index 8ef13030..69171137 100644 --- a/packages/gitbeaker-core/test/unit/services/Epics.ts +++ b/packages/gitbeaker-core/test/unit/services/Epics.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Epics } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Epics; @@ -27,7 +30,7 @@ describe('Epics.all', () => { it('should request GET /groups/:id/epics', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups/1/epics', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/1/epics', undefined); }); }); @@ -35,7 +38,7 @@ describe('Epics.create', () => { it('should request POST /groups/:id/epics', async () => { await service.create(1, 'test epic'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'groups/1/epics', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'groups/1/epics', { title: 'test epic', }); }); @@ -45,7 +48,7 @@ describe('Epics.edit', () => { it('should request PUT /groups/:id/epics', async () => { await service.edit(1, 2); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'groups/1/epics/2', undefined); + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'groups/1/epics/2', undefined); }); }); @@ -53,7 +56,7 @@ describe('Epics.show', () => { it('should request GET /groups/:id/epics/:id', async () => { await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups/1/epics/2', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/1/epics/2', undefined); }); }); @@ -61,6 +64,6 @@ describe('Epics.remove', () => { it('should request DEL /groups/:id/epics/:id', async () => { await service.remove(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'groups/1/epics/2', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'groups/1/epics/2', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/Events.ts b/packages/gitbeaker-core/test/unit/services/Events.ts new file mode 100644 index 00000000..d90aabd4 --- /dev/null +++ b/packages/gitbeaker-core/test/unit/services/Events.ts @@ -0,0 +1,31 @@ +import { Events } from '../../../src'; +import { RequestHelper } from '../../../src/infrastructure'; + +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); + +let service: Events; + +beforeEach(() => { + service = new Events({ + requesterFn: jest.fn(), + token: 'abcdefg', + requestTimeout: 3000, + }); +}); + +describe('Events.all', () => { + it('should request GET /projects/:id/events', async () => { + await service.all({ projectId: 12 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/12/events', {}); + }); + + it('should request GET /projects/:id/events without options', async () => { + await service.all(); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'events', {}); + }); +}); diff --git a/packages/gitbeaker-core/test/unit/services/FeatureFlags.ts b/packages/gitbeaker-core/test/unit/services/FeatureFlags.ts new file mode 100644 index 00000000..1acf6b96 --- /dev/null +++ b/packages/gitbeaker-core/test/unit/services/FeatureFlags.ts @@ -0,0 +1,86 @@ +import { RequestHelper } from '../../../src/infrastructure'; +import { FeatureFlags } from '../../../src'; + +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); + +let service: FeatureFlags; + +beforeEach(() => { + service = new FeatureFlags({ + requesterFn: jest.fn(), + token: 'abcdefg', + requestTimeout: 3000, + }); +}); + +describe('Instantiating FeatureFlags service', () => { + it('should create a valid service object', async () => { + expect(service).toBeInstanceOf(FeatureFlags); + expect(service.url).toBeDefined(); + expect(service.rejectUnauthorized).toBeTruthy(); + expect(service.headers).toMatchObject({ 'private-token': 'abcdefg' }); + expect(service.requestTimeout).toBe(3000); + }); +}); + +describe('FeatureFlags.all', () => { + it('should request GET /projects/:id/features_flags without options', async () => { + await service.all(1); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/features_flags', {}); + }); + + it('should request GET /projects/:id/features_flags', async () => { + await service.all(1, { scopes: 'enabled' }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/features_flags', { + scopes: 'enabled', + }); + }); +}); + +describe('FeatureFlags.create', () => { + it('should request POST /projects/:id/features_flags', async () => { + await service.create(1, 'name', '1'); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/features_flags', { + version: '1', + name: 'name', + }); + }); +}); + +describe('FeatureFlags.edit', () => { + it('should request PUT /projects/:id/features_flags/:flag_name', async () => { + await service.edit(1, 'name', { test: 1 }); + + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/features_flags/name', { + test: 1, + }); + }); +}); + +describe('FeatureFlags.remove', () => { + it('should request DEL /projects/:id/features_flags/:flag_name', async () => { + await service.remove(1, 'name', { sudo: 1 }); + + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/features_flags/name', { + sudo: 1, + }); + }); +}); + +describe('FeatureFlags.show', () => { + it('should request GET /projects/:id/features_flags/:flag_name', async () => { + await service.show(1, 'name'); + + expect(RequestHelper.get()).toHaveBeenCalledWith( + service, + 'projects/1/features_flags/name', + undefined, + ); + }); +}); diff --git a/packages/gitbeaker-core/test/unit/services/FreezePeriods.ts b/packages/gitbeaker-core/test/unit/services/FreezePeriods.ts index aff71fd3..3e2a71b5 100644 --- a/packages/gitbeaker-core/test/unit/services/FreezePeriods.ts +++ b/packages/gitbeaker-core/test/unit/services/FreezePeriods.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { FreezePeriods } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: FreezePeriods; @@ -27,7 +30,11 @@ describe('FreezePeriods.all', () => { it('should request GET /projects/:id/freeze_periods', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/freeze_periods', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith( + service, + 'projects/1/freeze_periods', + undefined, + ); }); }); @@ -35,7 +42,7 @@ describe('FreezePeriods.show', () => { it('should request GET /projects/:id/freeze_periods/:freeze_period_id', async () => { await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/freeze_periods/2', undefined, @@ -47,7 +54,7 @@ describe('FreezePeriods.create', () => { it('should request POST projects/:id/freeze_periods', async () => { await service.create(1, '* * * * *', '* * * * *', { cronTimezone: 'UTC' }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/freeze_periods', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/freeze_periods', { freezeStart: '* * * * *', freezeEnd: '* * * * *', cronTimezone: 'UTC', @@ -59,7 +66,7 @@ describe('FreezePeriods.edit', () => { it('should request PUT projects/:id/freeze_periods/:freeze_period_id', async () => { await service.edit(1, 2, { freezeStart: '* * * * *' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/freeze_periods/2', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/freeze_periods/2', { freezeStart: '* * * * *', }); }); @@ -69,7 +76,7 @@ describe('FreezePeriods.delete', () => { it('should request DELETE projects/:id/freeze_periods/:freeze_period_id', async () => { await service.delete(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/1/freeze_periods/2', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/GeoNodes.ts b/packages/gitbeaker-core/test/unit/services/GeoNodes.ts index 51c11e97..96b11123 100644 --- a/packages/gitbeaker-core/test/unit/services/GeoNodes.ts +++ b/packages/gitbeaker-core/test/unit/services/GeoNodes.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { GeoNodes } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: GeoNodes; @@ -27,7 +30,7 @@ describe('GeoNodes.all', () => { it('should request GET /geo_nodes', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'geo_nodes', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'geo_nodes', undefined); }); }); @@ -35,7 +38,7 @@ describe('GeoNodes.create', () => { it('should request POST /geo_nodes', async () => { await service.create(1); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'geo_nodes/1', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'geo_nodes/1', undefined); }); }); @@ -43,7 +46,7 @@ describe('GeoNodes.edit', () => { it('should request PUT /geo_nodes/:id', async () => { await service.edit(1); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'geo_nodes/1', undefined); + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'geo_nodes/1', undefined); }); }); @@ -51,7 +54,7 @@ describe('GeoNodes.failures', () => { it('should request POST /geo_nodes/current/failures', async () => { await service.failures(); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'geo_nodes/current/failures', undefined, @@ -63,7 +66,7 @@ describe('GeoNodes.repair', () => { it('should request DELETE /geo_nodes/:id', async () => { await service.repair(1); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'geo_nodes/1', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'geo_nodes/1', undefined); }); }); @@ -71,7 +74,7 @@ describe('GeoNodes.show', () => { it('should request GET /geo_nodes/:id', async () => { await service.show(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'geo_nodes/1', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'geo_nodes/1', undefined); }); }); @@ -79,7 +82,7 @@ describe('GeoNodes.status', () => { it('should request GET /geo_nodes/:id/status', async () => { await service.status(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'geo_nodes/1/status', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'geo_nodes/1/status', undefined); }); }); @@ -87,6 +90,6 @@ describe('GeoNodes.statuses', () => { it('should request GET /geo_nodes/statuses', async () => { await service.statuses(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'geo_nodes/statuses', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'geo_nodes/statuses', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/GitignoreTemplates.ts b/packages/gitbeaker-core/test/unit/services/GitignoreTemplates.ts index fe981e28..64332239 100644 --- a/packages/gitbeaker-core/test/unit/services/GitignoreTemplates.ts +++ b/packages/gitbeaker-core/test/unit/services/GitignoreTemplates.ts @@ -1,6 +1,9 @@ import { GitignoreTemplates } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: GitignoreTemplates; diff --git a/packages/gitbeaker-core/test/unit/services/GroupBadges.ts b/packages/gitbeaker-core/test/unit/services/GroupBadges.ts index ab4918cd..1c03b531 100644 --- a/packages/gitbeaker-core/test/unit/services/GroupBadges.ts +++ b/packages/gitbeaker-core/test/unit/services/GroupBadges.ts @@ -1,6 +1,9 @@ import { GroupBadges } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: GroupBadges; diff --git a/packages/gitbeaker-core/test/unit/services/GroupMembers.ts b/packages/gitbeaker-core/test/unit/services/GroupMembers.ts index 53f4d01e..87ff216e 100644 --- a/packages/gitbeaker-core/test/unit/services/GroupMembers.ts +++ b/packages/gitbeaker-core/test/unit/services/GroupMembers.ts @@ -1,7 +1,10 @@ import { GroupMembers } from '../../../src'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: GroupMembers; @@ -27,12 +30,12 @@ describe('GroupMembers.all', () => { it('should call /groups/1/members', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, '1/members', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, '1/members', {}); }); it('should call /groups/1/members/all', async () => { await service.all(1, { includeInherited: true }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, '1/members/all', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, '1/members/all', {}); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/GroupRunners.ts b/packages/gitbeaker-core/test/unit/services/GroupRunners.ts new file mode 100644 index 00000000..74d8c99e --- /dev/null +++ b/packages/gitbeaker-core/test/unit/services/GroupRunners.ts @@ -0,0 +1,41 @@ +import { GroupRunners } from '../../../src'; +import { RequestHelper } from '../../../src/infrastructure'; + +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); + +let service: GroupRunners; + +beforeEach(() => { + service = new GroupRunners({ + requesterFn: jest.fn(), + token: 'abcdefg', + requestTimeout: 3000, + }); +}); + +describe('Instantiating GroupRunners service', () => { + it('should create a valid service object', async () => { + expect(service).toBeInstanceOf(GroupRunners); + expect(service.url).toBeDefined(); + expect(service.rejectUnauthorized).toBeTruthy(); + expect(service.headers).toMatchObject({ 'private-token': 'abcdefg' }); + expect(service.requestTimeout).toBe(3000); + }); +}); + +describe('GroupRunners.all', () => { + it('should request GET /groups/:id/runners', async () => { + await service.all(1, { test: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/1/runners', { test: 1 }); + }); + + it('should request GET /groups/:id/runners without options', async () => { + await service.all(1); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/1/runners', undefined); + }); +}); diff --git a/packages/gitbeaker-core/test/unit/services/Groups.ts b/packages/gitbeaker-core/test/unit/services/Groups.ts index 9091cecc..c93444d2 100644 --- a/packages/gitbeaker-core/test/unit/services/Groups.ts +++ b/packages/gitbeaker-core/test/unit/services/Groups.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Groups } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Groups; @@ -27,7 +30,7 @@ describe('Groups.all', () => { it('should request GET /groups', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups', undefined); }); }); @@ -35,7 +38,7 @@ describe('Groups.create', () => { it('should request POST /groups', async () => { await service.create('test group', 'test-group'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'groups', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'groups', { name: 'test group', path: 'test-group', }); @@ -46,7 +49,7 @@ describe('Groups.edit', () => { it('should request PUT /groups', async () => { await service.edit(12, { name: 'test group 2' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'groups/12', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'groups/12', { name: 'test group 2', }); }); @@ -56,7 +59,7 @@ describe('Groups.projects', () => { it('should request GET /groups/:id/projects', async () => { await service.projects(12); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups/12/projects', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/12/projects', undefined); }); }); @@ -64,7 +67,7 @@ describe('Groups.show', () => { it('should request GET /groups/:id', async () => { await service.show(12); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups/12', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/12', undefined); }); }); @@ -72,21 +75,25 @@ describe('Groups.remove', () => { it('should request DEL /groups/:id', async () => { await service.remove(12); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'groups/12', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'groups/12', undefined); }); }); describe('Groups.removeLDAPLink', () => { it('should request DEL /groups/:id/ldap_group_links/:id without provider', async () => { - await service.removeLDAPLink(1, 2); + await service.removeLDAPLink(1, 'cd'); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'groups/1/ldap_group_links/2', {}); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'groups/1/ldap_group_links/cd', {}); }); it('should request DEL /groups/:id/ldap_group_links/:provider/:id with provider', async () => { - await service.removeLDAPLink(1, 2, { provider: 'test' }); + await service.removeLDAPLink(1, 'cd', { provider: 'test' }); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'groups/1/ldap_group_links/test/2', {}); + expect(RequestHelper.del()).toHaveBeenCalledWith( + service, + 'groups/1/ldap_group_links/test/cd', + {}, + ); }); }); @@ -94,7 +101,7 @@ describe('Groups.search', () => { it('should request GET /groups', async () => { await service.search('keywords'); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups', { + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups', { search: 'keywords', }); }); diff --git a/packages/gitbeaker-core/test/unit/services/Issues.ts b/packages/gitbeaker-core/test/unit/services/Issues.ts index 6a385872..9ef467f2 100644 --- a/packages/gitbeaker-core/test/unit/services/Issues.ts +++ b/packages/gitbeaker-core/test/unit/services/Issues.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Issues } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Issues; @@ -27,9 +30,13 @@ describe('Issues.addSpentTime', () => { it('should request POST projects/:id/issues:id/add_spent_time', async () => { await service.addSpentTime(2, 3, '10m'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/2/issues/3/add_spent_time', { - duration: '10m', - }); + expect(RequestHelper.post()).toHaveBeenCalledWith( + service, + 'projects/2/issues/3/add_spent_time', + { + duration: '10m', + }, + ); }); }); @@ -37,9 +44,13 @@ describe('Issues.addTimeEstimate', () => { it('should request POST projects/:id/issues:id/add_spent_time', async () => { await service.addTimeEstimate(2, 3, '10m'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/2/issues/3/time_estimate', { - duration: '10m', - }); + expect(RequestHelper.post()).toHaveBeenCalledWith( + service, + 'projects/2/issues/3/time_estimate', + { + duration: '10m', + }, + ); }); }); @@ -47,19 +58,19 @@ describe('Issues.all', () => { it('should request GET /issues', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'issues', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'issues', {}); }); it('should request GET /projects/:id/issues when project Id is passed', async () => { await service.all({ projectId: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/issues', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/issues', {}); }); it('should request GET /group/:id/issues when group Id is passed', async () => { await service.all({ groupId: 2 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups/2/issues', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/2/issues', {}); }); }); @@ -67,7 +78,7 @@ describe('Issues.edit', () => { it('should request PUT /projects/:id/issues/:iid', async () => { await service.edit(1, 2, { title: 'Testing terms' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/issues/2', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/issues/2', { title: 'Testing terms', }); }); @@ -80,22 +91,20 @@ describe('Issues.create', () => { description: 'A test issue', }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/2/issues', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/2/issues', { title: 'Issue.create Test', description: 'A test issue', }); }); }); -// FIXME: Seems to error out with the correct # of calls but incorrect # recieved -// https://gitlab.com/jdalrymple/gitbeaker/-/jobs/574881954#L253 -describe.skip('Issues.link', () => { +describe('Issues.link', () => { it('should request POST projects/:id/issues/:id/links', async () => { await service.link(8, 3, 4, 5); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/8/issues/3/links', { - targetProjectId: 4, - targetIssueIid: 5, + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/8/issues/3/links', { + targetProjectId: '4', + targetIssueIid: '5', }); }); }); @@ -104,7 +113,7 @@ describe('Issues.participants', () => { it('should request GET /projects/:id/issues/:id/participants', async () => { await service.participants(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/issues/2/participants', undefined, @@ -116,7 +125,7 @@ describe('Issues.remove', () => { it('should request DEL /projects/:id/issues/:id', async () => { await service.remove(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'projects/1/issues/2', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/issues/2', undefined); }); }); @@ -124,7 +133,7 @@ describe('Issues.resetSpentTime', () => { it('should request POST projects/:id/issues/:iid/reset_spent_time', async () => { await service.resetSpentTime(2, 3); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/issues/3/reset_spent_time', undefined, @@ -136,7 +145,7 @@ describe('Issues.resetTimeEstimate', () => { it('should request POST projects/:id/issues/:iid/reset_time_estimate', async () => { await service.resetTimeEstimate(2, 3); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/issues/3/reset_time_estimate', undefined, @@ -148,7 +157,7 @@ describe('Issues.show', () => { it('should request GET /projects/:id/issues/:id', async () => { await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/issues/2', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/issues/2', undefined); }); }); @@ -156,7 +165,7 @@ describe('Issues.subscribe', () => { it('should request POST projects/:id/issues/:iid/subscribe', async () => { await service.subscribe(2, 3); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/issues/3/subscribe', undefined, @@ -168,7 +177,7 @@ describe('Issues.timeStats', () => { it('should request GET /projects/:id/issues/:id/time_stats', async () => { await service.timeStats(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/issues/2/time_stats', undefined, @@ -180,7 +189,7 @@ describe('Issues.unsubscribe', () => { it('should request POST projects/:id/issues/:iid/unsubscribe', async () => { await service.unsubscribe(2, 3); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/issues/3/unsubscribe', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/IssuesStatistics.ts b/packages/gitbeaker-core/test/unit/services/IssuesStatistics.ts index 46193435..8276d6cc 100644 --- a/packages/gitbeaker-core/test/unit/services/IssuesStatistics.ts +++ b/packages/gitbeaker-core/test/unit/services/IssuesStatistics.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { IssuesStatistics } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: IssuesStatistics; @@ -27,18 +30,18 @@ describe('IssuesStatistics.all', () => { it('should request GET /issues_statistics', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'issues_statistics', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'issues_statistics', {}); }); it('should request GET /projects/:id/issues_statistics when project Id is passed', async () => { await service.all({ projectId: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/issues_statistics', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/issues_statistics', {}); }); it('should request GET /group/:id/issues_statistics when group Id is passed', async () => { await service.all({ groupId: 2 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups/2/issues_statistics', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/2/issues_statistics', {}); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/Jobs.ts b/packages/gitbeaker-core/test/unit/services/Jobs.ts index 76752b0c..d9935a7d 100644 --- a/packages/gitbeaker-core/test/unit/services/Jobs.ts +++ b/packages/gitbeaker-core/test/unit/services/Jobs.ts @@ -1,7 +1,10 @@ import { Jobs } from '../../../src'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Jobs; @@ -27,7 +30,7 @@ describe('Jobs.all', () => { it('should request GET /projects/:id/jobs', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/jobs', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/jobs', undefined); }); }); @@ -35,7 +38,11 @@ describe('Jobs.cancel', () => { it('should request POST /projects/:id/jobs/:id', async () => { await service.cancel(1, 2); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/jobs/2/cancel', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith( + service, + 'projects/1/jobs/2/cancel', + undefined, + ); }); }); @@ -43,7 +50,7 @@ describe('Jobs.downloadSingleArtifactFile', () => { it('should request GET /projects/:id/jobs/:id/artifacts/:path without streaming', async () => { await service.downloadSingleArtifactFile(1, 2, 'test/path'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/jobs/2/artifacts/test/path', {}, @@ -65,7 +72,7 @@ describe('Jobs.downloadSingleArtifactFileFromRef', () => { it('should request GET /projects/:id/jobs/artifacts/:id/raw/:path?job=:name without streaming', async () => { await service.downloadSingleArtifactFileFromRef(1, 'ref', 'test/path', 'name'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, `projects/1/jobs/artifacts/ref/raw/test/path?job=name`, {}, @@ -89,7 +96,7 @@ describe('Jobs.downloadLatestArtifactFile', () => { it('should request GET /projects/:id/jobs/artifacts/:id/download?job=:name without streaming', async () => { await service.downloadLatestArtifactFile(1, 'ref', 'name'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, `projects/1/jobs/artifacts/ref/download?job=name`, {}, @@ -111,7 +118,7 @@ describe('Jobs.downloadTraceFile', () => { it('should request GET /projects/:id/jobs/:id/trace', async () => { await service.downloadTraceFile(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/jobs/2/trace', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/jobs/2/trace', undefined); }); }); @@ -119,7 +126,11 @@ describe('Jobs.erase', () => { it('should request POST /projects/:id/jobs/:id/erase', async () => { await service.erase(1, 2); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/jobs/2/erase', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith( + service, + 'projects/1/jobs/2/erase', + undefined, + ); }); }); @@ -127,7 +138,7 @@ describe('Jobs.eraseArtifacts', () => { it('should request DELETE /projects/:id/jobs/:id/artifacts', async () => { await service.eraseArtifacts(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/1/jobs/2/artifacts', undefined, @@ -139,7 +150,7 @@ describe('Jobs.keepArtifacts', () => { it('should request POST /projects/:id/jobs/:id/artifacts/keep', async () => { await service.keepArtifacts(1, 2); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/1/jobs/2/artifacts/keep', undefined, @@ -151,7 +162,7 @@ describe('Jobs.play', () => { it('should request POST /projects/:id/jobs/:id/play', async () => { await service.play(1, 2); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/jobs/2/play', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/jobs/2/play', undefined); }); }); @@ -159,7 +170,11 @@ describe('Jobs.retry', () => { it('should request POST /projects/:id/jobs/:id/retry', async () => { await service.retry(1, 2); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/jobs/2/retry', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith( + service, + 'projects/1/jobs/2/retry', + undefined, + ); }); }); @@ -167,7 +182,7 @@ describe('Jobs.show', () => { it('should request GET /projects/:id/jobs/:id', async () => { await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/jobs/2', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/jobs/2', undefined); }); }); @@ -175,7 +190,7 @@ describe('Jobs.showPipelineJobs', () => { it('should request GET /projects/:id/pipelines/:id/jobs', async () => { await service.showPipelineJobs(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/pipelines/2/jobs', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/License.ts b/packages/gitbeaker-core/test/unit/services/License.ts index 98ff1f87..0d0a12fb 100644 --- a/packages/gitbeaker-core/test/unit/services/License.ts +++ b/packages/gitbeaker-core/test/unit/services/License.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { License } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: License; @@ -27,7 +30,7 @@ describe('License.all', () => { it('should request GET licenses', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'licenses', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'licenses', undefined); }); }); @@ -35,7 +38,7 @@ describe('License.add', () => { it('should request POST license', async () => { await service.add('A cool licence'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'license', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'license', { license: 'A cool licence', }); }); @@ -45,7 +48,7 @@ describe('License.show', () => { it('should request GET license', async () => { await service.show(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'license', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'license', undefined); }); }); @@ -53,6 +56,6 @@ describe('License.remove', () => { it('should request DELETE license', async () => { await service.remove(1); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'license/1', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'license/1', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/MergeRequestApprovals.ts b/packages/gitbeaker-core/test/unit/services/MergeRequestApprovals.ts index 8f7863cf..6092112a 100644 --- a/packages/gitbeaker-core/test/unit/services/MergeRequestApprovals.ts +++ b/packages/gitbeaker-core/test/unit/services/MergeRequestApprovals.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { MergeRequestApprovals } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: MergeRequestApprovals; @@ -31,7 +34,7 @@ describe('MergeRequests.addApprovalRules', () => { protectedBranchIds: [5, 6], }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/2/approval_rules', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/2/approval_rules', { name: 'Some rule', approvalsRequired: 5, userIds: [1, 2], @@ -47,7 +50,7 @@ describe('MergeRequests.addApprovalRules', () => { groupIds: [3, 4], }); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/approval_rules', { @@ -64,13 +67,13 @@ describe('MergeRequests.approvals', () => { it('should request GET /projects/:id/approvals', async () => { await service.approvals(3); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/3/approvals', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/3/approvals', {}); }); it('should request GET /projects/:id/merge_requests/:merge_request_iid/approvals when mergerequestIid Id is passed', async () => { await service.approvals(3, { mergerequestIid: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/3/merge_requests/1/approvals', {}, @@ -82,13 +85,13 @@ describe('MergeRequests.approvalRules', () => { it('should request GET /projects/:id/approval_rules', async () => { await service.approvalRules(2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/2/approval_rules', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/2/approval_rules', {}); }); it('should request GET /projects/:id/merge_requests/:merge_request_iid/approval_rules when mergerequestIid Id is passed', async () => { await service.approvalRules(2, { mergerequestIid: 3 }); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/approval_rules', {}, @@ -100,7 +103,7 @@ describe('MergeRequests.approvalState', () => { it('should request GET /projects/:id/merge_requests/:merge_request_iid/approval_state', async () => { await service.approvalState(2, 3); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/approval_state', undefined, @@ -112,7 +115,7 @@ describe('MergeRequests.approve', () => { it('should request POST /projects/:id/merge_requests/:merge_request_iid/approve', async () => { await service.approve(2, 3); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/approve', undefined, @@ -124,7 +127,7 @@ describe('MergeRequests.approvers', () => { it('should request PUT /projects/:id/approvers', async () => { await service.approvers(3, [4, 5], [6, 7]); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/3/approvers', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/3/approvers', { approverIds: [4, 5], approverGroupIds: [6, 7], }); @@ -137,7 +140,7 @@ describe('MergeRequests.approvers', () => { mergerequestIid: 1, }); - expect(RequestHelper.put).toHaveBeenCalledWith( + expect(RequestHelper.put()).toHaveBeenCalledWith( service, 'projects/3/merge_requests/1/approvers', { approverIds: [4, 5], approverGroupIds: [6, 7] }, @@ -153,7 +156,7 @@ describe('MergeRequests.editApprovalRules', () => { protectedBranchIds: [5, 6], }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/2/approval_rules/30', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/2/approval_rules/30', { name: 'Some rule', approvalsRequired: 5, userIds: [1, 2], @@ -169,7 +172,7 @@ describe('MergeRequests.editApprovalRules', () => { groupIds: [3, 4], }); - expect(RequestHelper.put).toHaveBeenCalledWith( + expect(RequestHelper.put()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/approval_rules/30', { @@ -186,13 +189,13 @@ describe('MergeRequests.editApprovals', () => { it('should request POST /projects/:id/approvals', async () => { await service.editApprovals(3, { prop: 4 }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/3/approvals', { prop: 4 }); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/3/approvals', { prop: 4 }); }); it('should request POST /projects/:id/merge_requests/:merge_request_iid/approvals when mergerequestIid Id is passed', async () => { await service.editApprovals(3, { mergerequestIid: 1, prop: 4 }); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/3/merge_requests/1/approvals', { prop: 4 }, @@ -204,13 +207,13 @@ describe('MergeRequests.removeApprovalRules', () => { it('should request DELETE /projects/:id/approval_rules/:approval_rule_id', async () => { await service.removeApprovalRule(2, 30); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'projects/2/approval_rules/30', {}); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/2/approval_rules/30', {}); }); it('should request DELETE /projects/:id/merge_requests/:merge_request_iid/approval_rules/:approval_rule_id when mergerequestIid is passed', async () => { await service.removeApprovalRule(2, 30, { mergerequestIid: 3 }); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/approval_rules/30', {}, @@ -222,7 +225,7 @@ describe('MergeRequests.unapprove', () => { it('should request POST /projects/:id/merge_requests/:merge_request_iid/unapprove', async () => { await service.unapprove(2, 3); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/unapprove', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/MergeRequests.ts b/packages/gitbeaker-core/test/unit/services/MergeRequests.ts index 6af2ef2b..cbeebcce 100644 --- a/packages/gitbeaker-core/test/unit/services/MergeRequests.ts +++ b/packages/gitbeaker-core/test/unit/services/MergeRequests.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { MergeRequests } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: MergeRequests; @@ -27,7 +30,7 @@ describe('MergeRequests.accept', () => { it('should request PUT projects/:id/merge_requests:id/merge', async () => { await service.accept(2, 3); - expect(RequestHelper.put).toHaveBeenCalledWith( + expect(RequestHelper.put()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/merge', undefined, @@ -39,7 +42,7 @@ describe('MergeRequests.addSpentTime', () => { it('should request POST projects/:id/merge_requests:id/add_spent_time', async () => { await service.addSpentTime(2, 3, '10m'); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/add_spent_time', { @@ -53,7 +56,7 @@ describe('MergeRequests.addTimeEstimate', () => { it('should request POST projects/:id/merge_requests:id/add_spent_time', async () => { await service.addTimeEstimate(2, 3, '10m'); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/time_estimate', { @@ -67,19 +70,19 @@ describe('MergeRequests.all', () => { it('should request GET /merge_requests', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'merge_requests', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'merge_requests', {}); }); it('should request GET /projects/:id/merge_requests when project Id is passed', async () => { await service.all({ projectId: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/merge_requests', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/merge_requests', {}); }); it('should request GET /group/:id/merge_requests when group Id is passed', async () => { await service.all({ groupId: 2 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups/2/merge_requests', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/2/merge_requests', {}); }); }); @@ -87,7 +90,7 @@ describe('MergeRequests.cancelOnPipelineSucess', () => { it('should request PUT projects/:id/merge_requests/:id/cancel_merge_when_pipeline_succeeds', async () => { await service.cancelOnPipelineSucess(2, 3); - expect(RequestHelper.put).toHaveBeenCalledWith( + expect(RequestHelper.put()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/cancel_merge_when_pipeline_succeeds', undefined, @@ -99,7 +102,7 @@ describe('MergeRequests.changes', () => { it('should request GET projects/:id/merge_requests/:id/changes', async () => { await service.changes(2, 3); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/changes', undefined, @@ -111,7 +114,7 @@ describe('MergeRequests.closesIssues', () => { it('should request GET projects/:id/merge_requests/:id/closes_issues', async () => { await service.closesIssues(2, 3); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/closes_issues', undefined, @@ -123,7 +126,7 @@ describe('MergeRequests.commits', () => { it('should request GET projects/:id/merge_requests/:id/commits', async () => { await service.commits(2, 3); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/commits', undefined, @@ -132,12 +135,11 @@ describe('MergeRequests.commits', () => { }); // FIXME: Seems to error out with the correct # of calls but incorrect # recieved -describe.skip('MergeRequests.create', () => { +describe('MergeRequests.create', () => { it('should request POST projects/:id/merge_requests', async () => { await service.create(2, 'dev', 'main', 'Test'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/2/merge_requests', { - id: 2, + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/2/merge_requests', { sourceBranch: 'dev', targetBranch: 'main', title: 'Test', @@ -149,7 +151,7 @@ describe('MergeRequests.edit', () => { it('should request PUT /projects/:id/merge_requests/:iid', async () => { await service.edit(1, 2, { title: 'Testing MR' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/merge_requests/2', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/merge_requests/2', { title: 'Testing MR', }); }); @@ -159,7 +161,7 @@ describe('MergeRequests.participants', () => { it('should request GET /projects/:id/merge_requests/:id/participants', async () => { await service.participants(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/merge_requests/2/participants', undefined, @@ -171,7 +173,7 @@ describe('MergeRequests.pipelines', () => { it('should request GET /projects/:id/merge_requests/:id/pipelines', async () => { await service.pipelines(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/merge_requests/2/pipelines', undefined, @@ -183,7 +185,7 @@ describe('MergeRequests.remove', () => { it('should request DEL /projects/:id/merge_requests/:id', async () => { await service.remove(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/1/merge_requests/2', undefined, @@ -195,7 +197,7 @@ describe('MergeRequests.resetSpentTime', () => { it('should request POST projects/:id/merge_requests/:iid/reset_spent_time', async () => { await service.resetSpentTime(2, 3); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/reset_spent_time', undefined, @@ -207,7 +209,7 @@ describe('MergeRequests.resetTimeEstimate', () => { it('should request POST projects/:id/merge_requests/:iid/reset_time_estimate', async () => { await service.resetTimeEstimate(2, 3); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/reset_time_estimate', undefined, @@ -219,7 +221,7 @@ describe('MergeRequests.show', () => { it('should request GET /projects/:id/merge_requests/:id', async () => { await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/merge_requests/2', undefined, @@ -231,7 +233,7 @@ describe('MergeRequests.subscribe', () => { it('should request POST projects/:id/merge_requests/:iid/subscribe', async () => { await service.subscribe(2, 3); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/subscribe', undefined, @@ -243,7 +245,7 @@ describe('MergeRequests.timeStats', () => { it('should request GET /projects/:id/merge_requests/:id/time_stats', async () => { await service.timeStats(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/merge_requests/2/time_stats', undefined, @@ -255,7 +257,7 @@ describe('MergeRequests.version', () => { it('should request GET /projects/:id/merge_requests/:id/versions/:id', async () => { await service.version(1, 2, 3); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/merge_requests/2/versions/3', undefined, @@ -267,7 +269,7 @@ describe('MergeRequests.versions', () => { it('should request GET /projects/:id/merge_requests/:id/versions', async () => { await service.versions(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/merge_requests/2/versions', undefined, @@ -279,7 +281,7 @@ describe('MergeRequests.unsubscribe', () => { it('should request DEL projects/:id/merge_requests/:iid/unsubscribe', async () => { await service.unsubscribe(2, 3); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/2/merge_requests/3/unsubscribe', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/NotificationSettings.ts b/packages/gitbeaker-core/test/unit/services/NotificationSettings.ts index 40d5730a..868b2b22 100644 --- a/packages/gitbeaker-core/test/unit/services/NotificationSettings.ts +++ b/packages/gitbeaker-core/test/unit/services/NotificationSettings.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { NotificationSettings } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: NotificationSettings; @@ -27,7 +30,7 @@ describe('NotificationSettings.all', () => { it('should request GET /notification_settings', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'notification_settings', { + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'notification_settings', { sudo: undefined, }); }); @@ -35,7 +38,7 @@ describe('NotificationSettings.all', () => { it('should request GET /projects/:id/notification_settings when project Id is passed', async () => { await service.all({ projectId: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/notification_settings', { + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/notification_settings', { sudo: undefined, }); }); @@ -43,7 +46,7 @@ describe('NotificationSettings.all', () => { it('should request GET /group/:id/notification_settings when group Id is passed', async () => { await service.all({ groupId: 2 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups/2/notification_settings', { + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/2/notification_settings', { sudo: undefined, }); }); @@ -53,7 +56,7 @@ describe('NotificationSettings.edit', () => { it('should request PUT /notification_settings', async () => { await service.edit({ level: 'watch' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'notification_settings', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'notification_settings', { sudo: undefined, level: 'watch', }); @@ -62,7 +65,7 @@ describe('NotificationSettings.edit', () => { it('should request PUT /projects/:id/notification_settings when project Id is passed', async () => { await service.edit({ projectId: 1, level: 'watch' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/notification_settings', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/notification_settings', { sudo: undefined, level: 'watch', }); @@ -71,7 +74,7 @@ describe('NotificationSettings.edit', () => { it('should request PUT /group/:id/notification_settings when group Id is passed', async () => { await service.edit({ groupId: 2, level: 'watch' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'groups/2/notification_settings', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'groups/2/notification_settings', { sudo: undefined, level: 'watch', }); diff --git a/packages/gitbeaker-core/test/unit/services/Packages.ts b/packages/gitbeaker-core/test/unit/services/Packages.ts index a8781193..479a2eaa 100644 --- a/packages/gitbeaker-core/test/unit/services/Packages.ts +++ b/packages/gitbeaker-core/test/unit/services/Packages.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Packages } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Packages; @@ -27,7 +30,7 @@ describe('Packages.all', () => { it('should request GET /projects/:id/packages', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/packages', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/packages', undefined); }); }); @@ -35,7 +38,7 @@ describe('Packages.remove', () => { it('should request DEL /projects/:id/packages/:id', async () => { await service.remove(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'projects/1/packages/2', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/packages/2', undefined); }); }); @@ -43,7 +46,7 @@ describe('Packages.show', () => { it('should request GET /projects/:id/packages/:id', async () => { await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/packages/2', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/packages/2', undefined); }); }); @@ -51,7 +54,7 @@ describe('Packages.showFiles', () => { it('should request GET /projects/:id/packages/:id/package_files', async () => { await service.showFiles(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/packages/2/package_files', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/PagesDomains.ts b/packages/gitbeaker-core/test/unit/services/PagesDomains.ts index b9f449ae..2d1f5d82 100644 --- a/packages/gitbeaker-core/test/unit/services/PagesDomains.ts +++ b/packages/gitbeaker-core/test/unit/services/PagesDomains.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { PagesDomains } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: PagesDomains; @@ -27,13 +30,13 @@ describe('PagesDomains.all', () => { it('should request GET /projects/:id/pages/domains', async () => { await service.all({ projectId: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/pages/domains', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/pages/domains', {}); }); it('should request GET /pages/domains', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'pages/domains', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'pages/domains', {}); }); }); @@ -41,7 +44,7 @@ describe('PagesDomains.create', () => { it('should request POST /projects/:id/pages/domains', async () => { await service.create(1, 'domain'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/pages/domains', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/pages/domains', { domain: 'domain', }); }); @@ -51,7 +54,7 @@ describe('PagesDomains.edit', () => { it('should request PUT /projects/:id/pages/domains/:domain', async () => { await service.edit(1, 'domain'); - expect(RequestHelper.put).toHaveBeenCalledWith( + expect(RequestHelper.put()).toHaveBeenCalledWith( service, 'projects/1/pages/domains/domain', undefined, @@ -63,7 +66,7 @@ describe('PagesDomains.show', () => { it('should request GET /projects/:id/pages/domains/:domain', async () => { await service.show(1, 'domain'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/pages/domains/domain', undefined, @@ -75,7 +78,7 @@ describe('PagesDomains.remove', () => { it('should request DEL /projects/:id/pages/domains/:domain', async () => { await service.remove(1, 'domain'); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/1/pages/domains/domain', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/PipelineScheduleVariables.ts b/packages/gitbeaker-core/test/unit/services/PipelineScheduleVariables.ts index e54f6811..456e1b02 100644 --- a/packages/gitbeaker-core/test/unit/services/PipelineScheduleVariables.ts +++ b/packages/gitbeaker-core/test/unit/services/PipelineScheduleVariables.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { PipelineScheduleVariables } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: PipelineScheduleVariables; @@ -27,7 +30,7 @@ describe('PipelineScheduleVariables.all', () => { it('should request GET /projects/:id/pipeline_schedules/:id/variables', async () => { await service.all(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/pipeline_schedules/2/variables', undefined, @@ -39,7 +42,7 @@ describe('PipelineScheduleVariables.create', () => { it('should request POST /projects/:id/pipeline_schedules/:id/variables', async () => { await service.create(1, 2, { prop: 1 }); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/1/pipeline_schedules/2/variables', { @@ -53,7 +56,7 @@ describe('PipelineScheduleVariables.edit', () => { it('should request PUT /projects/:id/pipeline_schedules/:id/variables/:key', async () => { await service.edit(1, 2, 'key'); - expect(RequestHelper.put).toHaveBeenCalledWith( + expect(RequestHelper.put()).toHaveBeenCalledWith( service, 'projects/1/pipeline_schedules/2/variables/key', undefined, @@ -65,7 +68,7 @@ describe('PipelineScheduleVariables.show', () => { it('should request GET /projects/:id/pipeline_schedules/:id/variables', async () => { await service.show(1, 2, 'key'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/pipeline_schedules/2/variables/key', undefined, @@ -77,7 +80,7 @@ describe('PipelineScheduleVariables.remove', () => { it('should request DEL /projects/:id/pipeline_schedules/:id/variables/:key', async () => { await service.remove(1, 2, 'key'); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/1/pipeline_schedules/2/variables/key', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/PipelineSchedules.ts b/packages/gitbeaker-core/test/unit/services/PipelineSchedules.ts index 0e1067d8..80466471 100644 --- a/packages/gitbeaker-core/test/unit/services/PipelineSchedules.ts +++ b/packages/gitbeaker-core/test/unit/services/PipelineSchedules.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { PipelineSchedules } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: PipelineSchedules; @@ -27,7 +30,7 @@ describe('PipelineSchedules.all', () => { it('should request GET /projects/:id/pipeline_schedules/:id', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/pipeline_schedules', undefined, @@ -39,7 +42,7 @@ describe('PipelineSchedules.create', () => { it('should request POST /projects/:id/pipeline_schedules/:id', async () => { await service.create(1, 'description', '5a', 'today'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/pipeline_schedules', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/pipeline_schedules', { description: 'description', ref: '5a', cron: 'today', @@ -51,7 +54,7 @@ describe('PipelineSchedules.edit', () => { it('should request PUT /projects/:id/pipeline_schedules/:id', async () => { await service.edit(1, 2); - expect(RequestHelper.put).toHaveBeenCalledWith( + expect(RequestHelper.put()).toHaveBeenCalledWith( service, 'projects/1/pipeline_schedules/2', undefined, @@ -63,7 +66,7 @@ describe('PipelineSchedules.show', () => { it('should request GET /projects/:id/pipeline_schedules/:id', async () => { await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/pipeline_schedules/2', undefined, @@ -75,7 +78,7 @@ describe('PipelineSchedules.remove', () => { it('should request DEL /projects/:id/pipeline_schedules/:id', async () => { await service.remove(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/1/pipeline_schedules/2', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/Pipelines.ts b/packages/gitbeaker-core/test/unit/services/Pipelines.ts index b0efba61..a3d0e8b6 100644 --- a/packages/gitbeaker-core/test/unit/services/Pipelines.ts +++ b/packages/gitbeaker-core/test/unit/services/Pipelines.ts @@ -1,7 +1,10 @@ import { Pipelines } from '../../../src'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Pipelines; @@ -31,7 +34,7 @@ describe('Projects.create', () => { }, }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/pipeline', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/pipeline', { ref: 'ci/cd', variables: { PULL_REQUEST_NAME: 'TEST', diff --git a/packages/gitbeaker-core/test/unit/services/ProjectHooks.ts b/packages/gitbeaker-core/test/unit/services/ProjectHooks.ts new file mode 100644 index 00000000..f1a8b41c --- /dev/null +++ b/packages/gitbeaker-core/test/unit/services/ProjectHooks.ts @@ -0,0 +1,87 @@ +import { RequestHelper } from '../../../src/infrastructure'; +import { ProjectHooks } from '../../../src'; + +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); + +let service: ProjectHooks; + +beforeEach(() => { + service = new ProjectHooks({ + requesterFn: jest.fn(), + token: 'abcdefg', + requestTimeout: 3000, + }); +}); + +describe('Instantiating ProjectHooks service', () => { + it('should create a valid service object', async () => { + expect(service).toBeInstanceOf(ProjectHooks); + expect(service.url).toBeDefined(); + expect(service.rejectUnauthorized).toBeTruthy(); + expect(service.headers).toMatchObject({ 'private-token': 'abcdefg' }); + expect(service.requestTimeout).toBe(3000); + }); +}); + +describe('ProjectHooks.all', () => { + it('should request GET /projects/:id/hooks without options', async () => { + await service.all(1); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/hooks', undefined); + }); + + it('should request GET /projects/:id/hooks with options', async () => { + await service.all(1, { test: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/hooks', { test: 1 }); + }); +}); + +describe('ProjectHooks.add', () => { + it('should request POST /projects/:id/hooks', async () => { + await service.add(1, 'url'); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/hooks', { + url: 'url', + }); + }); +}); + +describe('ProjectHooks.edit', () => { + it('should request PUT /projects/:id/hooks/:hook_id', async () => { + await service.edit(1, 2, 'url'); + + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/hooks/2', { url: 'url' }); + }); +}); + +describe('ProjectHooks.show', () => { + it('should request GET /projects/:id/hooks/:hook_id without options', async () => { + await service.show(1, 2); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/hooks/2', undefined); + }); + + it('should request GET /projects/:id/hooks/:hook_id with options', async () => { + await service.show(1, 2, { sudo: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/hooks/2', { sudo: 1 }); + }); +}); + +describe('ProjectHooks.remove', () => { + it('should request DEL /projects/:id/hooks/:hook_id with options', async () => { + await service.remove(1, 2, { sudo: 1 }); + + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/hooks/2', { sudo: 1 }); + }); + + it('should request DEL /projects/:id/hooks/:hook_id without options', async () => { + await service.remove(1, 2); + + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/hooks/2', undefined); + }); +}); diff --git a/packages/gitbeaker-core/test/unit/services/ProjectImportExport.ts b/packages/gitbeaker-core/test/unit/services/ProjectImportExport.ts index aa0a69b5..3db52522 100644 --- a/packages/gitbeaker-core/test/unit/services/ProjectImportExport.ts +++ b/packages/gitbeaker-core/test/unit/services/ProjectImportExport.ts @@ -1,7 +1,10 @@ import { ProjectImportExport } from '../../../src'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ProjectImportExport; @@ -27,7 +30,7 @@ describe('ProjectImportExport.download', () => { it('should request GET /projects/:id/export/download', async () => { await service.download(1); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/export/download', undefined, @@ -39,7 +42,7 @@ describe('ProjectImportExport.exportStatus', () => { it('should request GET /projects/:id/export', async () => { await service.exportStatus(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/export', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/export', undefined); }); }); @@ -47,7 +50,7 @@ describe('ProjectImportExport.import', () => { it('should request POST /projects/import', async () => { await service.import('content', 'path'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/import', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/import', { isForm: true, file: [ 'content', @@ -60,7 +63,7 @@ describe('ProjectImportExport.import', () => { it('should request POST /projects/import with metadata', async () => { await service.import('content', 'path', { metadata: { filename: 'filename' } }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/import', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/import', { isForm: true, file: ['content', { filename: 'filename', contentType: 'application/octet-stream' }], path: 'path', @@ -72,7 +75,7 @@ describe('ProjectImportExport.importStatus', () => { it('should request GET /projects/:id/import', async () => { await service.importStatus(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/import', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/import', undefined); }); }); @@ -80,6 +83,6 @@ describe('ProjectImportExport.schedule', () => { it('should request POST /projects/:id/export', async () => { await service.schedule(1); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/export', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/export', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/ProjectSnippets.ts b/packages/gitbeaker-core/test/unit/services/ProjectSnippets.ts index 05874174..4930900c 100644 --- a/packages/gitbeaker-core/test/unit/services/ProjectSnippets.ts +++ b/packages/gitbeaker-core/test/unit/services/ProjectSnippets.ts @@ -1,7 +1,10 @@ import { ProjectSnippets } from '../../../src'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ProjectSnippets; @@ -27,7 +30,7 @@ describe('ProjectSnippets.all', () => { it('should request GET /projects/:id/snippets', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/snippets', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/snippets', undefined); }); }); @@ -35,7 +38,11 @@ describe('ProjectSnippets.content', () => { it('should request GET /projects/:id/snippets/:id/raw', async () => { await service.content(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/snippets/2/raw', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith( + service, + 'projects/1/snippets/2/raw', + undefined, + ); }); }); @@ -45,7 +52,7 @@ describe('ProjectSnippets.create', () => { description: 'Hello World snippet', }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/snippets', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/snippets', { title: 'This is a snippet', fileName: 'test.txt', code: 'Hello world', @@ -59,7 +66,7 @@ describe('ProjectSnippets.edit', () => { it('should request PUT /projects/:id/snippets', async () => { await service.edit(1, 2, { name: 'test snippet 2' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/snippets/2', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/snippets/2', { name: 'test snippet 2', }); }); @@ -69,7 +76,7 @@ describe('ProjectSnippets.remove', () => { it('should request DELETE /projects/:id/snippets/:id', async () => { await service.remove(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'projects/1/snippets/2', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/snippets/2', undefined); }); }); @@ -77,7 +84,7 @@ describe('ProjectSnippets.show', () => { it('should request GET /projects/:id/snippets/:id', async () => { await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/snippets/2', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/snippets/2', undefined); }); }); @@ -85,7 +92,7 @@ describe('ProjectSnippets.userAgentDetails', () => { it('should request GET /projects/:id/snippets/:id/user_agent_detail', async () => { await service.userAgentDetails(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/snippets/2/user_agent_detail', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/Projects.ts b/packages/gitbeaker-core/test/unit/services/Projects.ts index d3197f80..dc99390f 100644 --- a/packages/gitbeaker-core/test/unit/services/Projects.ts +++ b/packages/gitbeaker-core/test/unit/services/Projects.ts @@ -1,7 +1,10 @@ import { Projects } from '../../../src'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Projects; @@ -26,7 +29,7 @@ describe('Projects.all', () => { it('should request GET /projects', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects', undefined); }); }); @@ -34,13 +37,13 @@ describe('Projects.archive', () => { it('should request POST /projects/:id/archive', async () => { await service.archive(12); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/12/archive', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/12/archive', undefined); }); it('should request POST /projects/:id/archive with sudo', async () => { await service.archive(12, { sudo: 2 }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/12/archive', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/12/archive', { sudo: 2, }); }); @@ -50,7 +53,7 @@ describe('Projects.create', () => { it('should request POST /projects when userId undefined', async () => { await service.create({ name: 'test proj' }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects', { name: 'test proj', }); }); @@ -58,7 +61,7 @@ describe('Projects.create', () => { it('should request POST /projects/user/:id when userId defined', async () => { await service.create({ userId: 2, name: 'test proj' }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/user/2', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/user/2', { name: 'test proj', }); }); @@ -68,24 +71,16 @@ describe('Projects.edit', () => { it('should request PUT /projects', async () => { await service.edit(12, { name: 'test proj 2' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/12', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/12', { name: 'test proj 2', }); }); }); -describe('Projects.events', () => { - it('should request GET /projects/:id/events', async () => { - await service.events(12); - - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/12/events', undefined); - }); -}); - describe('Projects.fork', () => { it('should request POST /projects/:id/fork', async () => { await service.fork(12); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/12/fork', {}); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/12/fork', {}); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/ProtectedBranches.ts b/packages/gitbeaker-core/test/unit/services/ProtectedBranches.ts new file mode 100644 index 00000000..3df9ab0e --- /dev/null +++ b/packages/gitbeaker-core/test/unit/services/ProtectedBranches.ts @@ -0,0 +1,100 @@ +import { RequestHelper } from '../../../src/infrastructure'; +import { ProtectedBranches } from '../../../src'; + +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); + +let service: ProtectedBranches; + +beforeEach(() => { + service = new ProtectedBranches({ + requesterFn: jest.fn(), + token: 'abcdefg', + requestTimeout: 3000, + }); +}); + +describe('Instantiating ProtectedBranches service', () => { + it('should create a valid service object', async () => { + expect(service).toBeInstanceOf(ProtectedBranches); + expect(service.url).toBeDefined(); + expect(service.rejectUnauthorized).toBeTruthy(); + expect(service.headers).toMatchObject({ 'private-token': 'abcdefg' }); + expect(service.requestTimeout).toBe(3000); + }); +}); + +describe('ProtectedBranches.all', () => { + it('should request GET /projects/:id/protected_branches', async () => { + await service.all(1, { test: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/protected_branches', { + test: 1, + }); + }); + + it('should request GET /projects/:id/protected_branches without options', async () => { + await service.all(1); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/protected_branches', {}); + }); +}); + +describe('ProtectedBranches.protect', () => { + it('should request POST /projects/:id/protected_branches', async () => { + await service.protect(1, 'name', { test: 1 }); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/protected_branches', { + name: 'name', + test: 1, + }); + }); +}); + +describe('ProtectedBranches.show', () => { + it('should request GET /projects/:id/protected_branches/:branch_name', async () => { + await service.show(1, 'name', { sudo: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith( + service, + 'projects/1/protected_branches/name', + { + sudo: 1, + }, + ); + }); + + it('should request GET /projects/:id/protected_branches/:branch_name without options', async () => { + await service.show(1, 'name'); + + expect(RequestHelper.get()).toHaveBeenCalledWith( + service, + 'projects/1/protected_branches/name', + undefined, + ); + }); +}); + +describe('ProtectedBranches.unprotect', () => { + it('should request DEL /projects/:id/protected_branches/:branch_name without options', async () => { + await service.unprotect(1, 'name'); + + expect(RequestHelper.del()).toHaveBeenCalledWith( + service, + 'projects/1/protected_branches/name', + undefined, + ); + }); + + it('should request DEL /projects/:id/protected_branches/:branch_name', async () => { + await service.unprotect(1, 'name', { sudo: 1 }); + + expect(RequestHelper.del()).toHaveBeenCalledWith( + service, + 'projects/1/protected_branches/name', + { sudo: 1 }, + ); + }); +}); diff --git a/packages/gitbeaker-core/test/unit/services/PushRules.ts b/packages/gitbeaker-core/test/unit/services/PushRules.ts index 9787a3b7..395c8e72 100644 --- a/packages/gitbeaker-core/test/unit/services/PushRules.ts +++ b/packages/gitbeaker-core/test/unit/services/PushRules.ts @@ -1,7 +1,10 @@ import { PushRules } from '../../../src'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: PushRules; @@ -28,7 +31,7 @@ describe('PushRules.create', () => { it('should request PUT projects/:id/push_rule', async () => { await service.create(1, { prop: 1 }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/push_rule', { prop: 1 }); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/push_rule', { prop: 1 }); }); }); @@ -38,7 +41,7 @@ describe('PushRules.edit', () => { memberCheck: true, }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/push_rule', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/push_rule', { memberCheck: true, }); }); @@ -48,7 +51,7 @@ describe('PushRules.remove', () => { it('should request DELETE projects/:id/push_rule', async () => { await service.remove(1); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'projects/1/push_rule', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/push_rule', undefined); }); }); @@ -56,6 +59,6 @@ describe('PushRules.show', () => { it('should request GET projects/:id/push_rule', async () => { await service.show(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/push_rule', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/push_rule', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/ReleaseLinks.ts b/packages/gitbeaker-core/test/unit/services/ReleaseLinks.ts index d0a96ed0..8f9f0d1a 100644 --- a/packages/gitbeaker-core/test/unit/services/ReleaseLinks.ts +++ b/packages/gitbeaker-core/test/unit/services/ReleaseLinks.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { ReleaseLinks } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ReleaseLinks; @@ -27,7 +30,7 @@ describe('ReleaseLinks.all', () => { it('should request GET /projects/:id/releases/:id/assets/links', async () => { await service.all(1, 'tag'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/releases/tag/assets/links', undefined, @@ -39,7 +42,7 @@ describe('ReleaseLinks.create', () => { it('should request POST /projects/:id/releases/:id/assets/links', async () => { await service.create(1, 'tag', 'name', 'url'); - expect(RequestHelper.post).toHaveBeenCalledWith( + expect(RequestHelper.post()).toHaveBeenCalledWith( service, 'projects/1/releases/tag/assets/links', { name: 'name', url: 'url' }, @@ -51,7 +54,7 @@ describe('ReleaseLinks.edit', () => { it('should request PUT /projects/:id/releases/:id/assets/links/:id', async () => { await service.edit(1, 'tag', 2, { name: 'new name' }); - expect(RequestHelper.put).toHaveBeenCalledWith( + expect(RequestHelper.put()).toHaveBeenCalledWith( service, 'projects/1/releases/tag/assets/links/2', { name: 'new name' }, @@ -63,7 +66,7 @@ describe('ReleaseLinks.remove', () => { it('should request DELETE /projects/:id/releases/:id/assets/links/:id', async () => { await service.remove(1, 'tag', 2); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, 'projects/1/releases/tag/assets/links/2', undefined, @@ -75,7 +78,7 @@ describe('ReleaseLinks.show', () => { it('should request GET /projects/:id/releases/:id/assets/links/:id', async () => { await service.show(1, 'tag', 2); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/releases/tag/assets/links/2', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/Releases.ts b/packages/gitbeaker-core/test/unit/services/Releases.ts index e6e2e71e..8a22cdae 100644 --- a/packages/gitbeaker-core/test/unit/services/Releases.ts +++ b/packages/gitbeaker-core/test/unit/services/Releases.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Releases } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Releases; @@ -27,7 +30,7 @@ describe('Releases.all', () => { it('should request GET /projects/:id/releases', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/releases', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/releases', undefined); }); }); @@ -35,7 +38,7 @@ describe('Releases.create', () => { it('should request POST /projects/:id/releases', async () => { await service.create(1, { prop: 1 }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/releases', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/releases', { prop: 1, }); }); @@ -45,7 +48,7 @@ describe('Releases.edit', () => { it('should request PUT /projects/:id/releases', async () => { await service.edit(1, '2'); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/releases/2', undefined); + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/releases/2', undefined); }); }); @@ -53,7 +56,7 @@ describe('Releases.show', () => { it('should request GET /projects/:id/releases/:id', async () => { await service.show(1, '2'); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/releases/2', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/releases/2', undefined); }); }); @@ -61,6 +64,6 @@ describe('Releases.remove', () => { it('should request DEL /projects/:id/releases/:id', async () => { await service.remove(1, '2'); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'projects/1/releases/2', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/releases/2', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/RepositoryFiles.ts b/packages/gitbeaker-core/test/unit/services/RepositoryFiles.ts index 52f3b86a..af8108d3 100644 --- a/packages/gitbeaker-core/test/unit/services/RepositoryFiles.ts +++ b/packages/gitbeaker-core/test/unit/services/RepositoryFiles.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { RepositoryFiles } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: RepositoryFiles; @@ -27,7 +30,7 @@ describe('RepositoryFiles.create', () => { it('should request POST /projects/:id/repository/files/:path', async () => { await service.create(1, 'path', 'master', 'content', 'message'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/repository/files/path', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/repository/files/path', { branch: 'master', content: 'content', commitMessage: 'message', @@ -39,7 +42,7 @@ describe('RepositoryFiles.edit', () => { it('should request PUT /projects/:id/repository/files/:path', async () => { await service.edit(1, 'path', 'master', 'content', 'message'); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/repository/files/path', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/repository/files/path', { branch: 'master', content: 'content', commitMessage: 'message', @@ -51,7 +54,7 @@ describe('RepositoryFiles.remove', () => { it('should request DELETE /projects/:id/repository/files/:path', async () => { await service.remove(1, 'path', 'master', 'message'); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'projects/1/repository/files/path', { + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/repository/files/path', { branch: 'master', commitMessage: 'message', }); @@ -62,7 +65,7 @@ describe('RepositoryFiles.show', () => { it('should request GET /projects/:id/repository/files/:path', async () => { await service.show(1, 'path', 'master'); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/repository/files/path', { + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/repository/files/path', { ref: 'master', }); }); @@ -72,7 +75,7 @@ describe('RepositoryFiles.showBlame', () => { it('should request GET /projects/:id/repository/files/:path', async () => { await service.showBlame(1, 'path'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/repository/files/path/blame', undefined, @@ -84,7 +87,7 @@ describe('RepositoryFiles.showRaw', () => { it('should request GET /projects/:id/repository/files/:path', async () => { await service.showRaw(1, 'path', 'ref'); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'projects/1/repository/files/path/raw', { ref: 'ref' }, diff --git a/packages/gitbeaker-core/test/unit/services/Runners.ts b/packages/gitbeaker-core/test/unit/services/Runners.ts index 6102d46f..e38fe7ad 100644 --- a/packages/gitbeaker-core/test/unit/services/Runners.ts +++ b/packages/gitbeaker-core/test/unit/services/Runners.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Runners } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Runners; @@ -27,21 +30,21 @@ describe('Runners.all', () => { it('should request GET /runners/all', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'runners/all', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'runners/all', {}); }); it('should request GET /projects/:id/runners', async () => { await service.all({ projectId: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/runners', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/runners', {}); }); }); -describe('Runners.allOwned', () => { +describe('Runners.allowned', () => { it('should request GET /runners', async () => { await service.allOwned(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'runners', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'runners', undefined); }); }); @@ -49,7 +52,7 @@ describe('Runners.edit', () => { it('should request PUT /runners/:id', async () => { await service.edit(2); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'runners/2', undefined); + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'runners/2', undefined); }); }); @@ -57,7 +60,7 @@ describe('Runners.enable', () => { it('should request POST /projects/:id/runners', async () => { await service.enable(1, 2); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/runners', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/runners', { runnerId: '2', }); }); @@ -67,7 +70,7 @@ describe('Runners.disable', () => { it('should request DELETE /projects/:id/runners/:id', async () => { await service.disable(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'projects/1/runners/2', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/runners/2', undefined); }); }); @@ -75,7 +78,7 @@ describe('Runners.jobs', () => { it('should request GET /runners/:id/jobs', async () => { await service.jobs(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'runners/1/jobs', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'runners/1/jobs', undefined); }); }); @@ -83,7 +86,7 @@ describe('Runners.remove', () => { it('should request DEL /runners/:id', async () => { await service.remove(2); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'runners/2', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'runners/2', undefined); }); }); @@ -91,6 +94,6 @@ describe('Runners.show', () => { it('should request GET /runners/:id', async () => { await service.show(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'runners/1', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'runners/1', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/Search.ts b/packages/gitbeaker-core/test/unit/services/Search.ts index 990c5713..5bd7695a 100644 --- a/packages/gitbeaker-core/test/unit/services/Search.ts +++ b/packages/gitbeaker-core/test/unit/services/Search.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Search } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Search; @@ -27,7 +30,7 @@ describe('Search.all', () => { it('should request GET /search', async () => { await service.all('scope', 'search terms'); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'search', { + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'search', { scope: 'scope', search: 'search terms', }); @@ -36,7 +39,7 @@ describe('Search.all', () => { it('should request GET /projects/:id/search when project Id is passed', async () => { await service.all('scope', 'search terms', { projectId: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/search', { + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/search', { scope: 'scope', search: 'search terms', }); @@ -45,7 +48,7 @@ describe('Search.all', () => { it('should request GET /group/:id/search when group Id is passed', async () => { await service.all('scope', 'search terms', { groupId: 2 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'groups/2/search', { + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'groups/2/search', { scope: 'scope', search: 'search terms', }); diff --git a/packages/gitbeaker-core/test/unit/services/Snippets.ts b/packages/gitbeaker-core/test/unit/services/Snippets.ts index ffd7ff64..55d4942c 100644 --- a/packages/gitbeaker-core/test/unit/services/Snippets.ts +++ b/packages/gitbeaker-core/test/unit/services/Snippets.ts @@ -1,7 +1,10 @@ import { Snippets } from '../../../src'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Snippets; @@ -27,13 +30,13 @@ describe('Snippets.all', () => { it('should request GET /snippets', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'snippets', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'snippets', {}); }); it('should request GET /snippets/public', async () => { await service.all({ public: true }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'snippets/public', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'snippets/public', {}); }); }); @@ -41,7 +44,7 @@ describe('Snippets.content', () => { it('should request GET /snippets/:id/raw', async () => { await service.content(12); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'snippets/12/raw', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'snippets/12/raw', undefined); }); }); @@ -51,7 +54,7 @@ describe('Snippets.create', () => { description: 'Hello World snippet', }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'snippets', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'snippets', { title: 'This is a snippet', fileName: 'test.txt', content: 'Hello world', @@ -65,7 +68,7 @@ describe('Snippets.edit', () => { it('should request PUT /snippets', async () => { await service.edit(12, { name: 'test snippet 2' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'snippets/12', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'snippets/12', { name: 'test snippet 2', }); }); @@ -75,7 +78,7 @@ describe('Snippets.show', () => { it('should request GET /snippets/:id', async () => { await service.show(12); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'snippets/12', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'snippets/12', undefined); }); }); @@ -83,7 +86,7 @@ describe('Snippets.remove', () => { it('should request DELETE /snippets/:id', async () => { await service.remove(12); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'snippets/12', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'snippets/12', undefined); }); }); @@ -91,7 +94,7 @@ describe('Snippets.userAgentDetails', () => { it('should request GET /snippets/:id/user_agent_detail', async () => { await service.userAgentDetails(12); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, 'snippets/12/user_agent_detail', undefined, diff --git a/packages/gitbeaker-core/test/unit/services/SystemHooks.ts b/packages/gitbeaker-core/test/unit/services/SystemHooks.ts new file mode 100644 index 00000000..310910dd --- /dev/null +++ b/packages/gitbeaker-core/test/unit/services/SystemHooks.ts @@ -0,0 +1,73 @@ +import { RequestHelper } from '../../../src/infrastructure'; +import { SystemHooks } from '../../../src'; + +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); + +let service: SystemHooks; + +beforeEach(() => { + service = new SystemHooks({ + requesterFn: jest.fn(), + token: 'abcdefg', + requestTimeout: 3000, + }); +}); + +describe('Instantiating SystemHooks service', () => { + it('should create a valid service object', async () => { + expect(service).toBeInstanceOf(SystemHooks); + expect(service.url).toBeDefined(); + expect(service.rejectUnauthorized).toBeTruthy(); + expect(service.headers).toMatchObject({ 'private-token': 'abcdefg' }); + expect(service.requestTimeout).toBe(3000); + }); +}); + +describe('SystemHooks.all', () => { + it('should request GET /hooks without options', async () => { + await service.all(); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'hooks', undefined); + }); + + it('should request GET /hooks with options', async () => { + await service.all({ test: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'hooks', { test: 1 }); + }); +}); + +describe('SystemHooks.add', () => { + it('should request POST /hooks', async () => { + await service.add('url'); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'hooks', { + url: 'url', + }); + }); +}); + +describe('SystemHooks.edit', () => { + it('should request PUT /hooks/:hook_id', async () => { + await service.edit(2, 'url'); + + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'hooks/2', { url: 'url' }); + }); +}); + +describe('SystemHooks.remove', () => { + it('should request DEL /hooks/:hook_id with options', async () => { + await service.remove(2, { sudo: 1 }); + + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'hooks/2', { sudo: 1 }); + }); + + it('should request DEL /hooks/:hook_id without options', async () => { + await service.remove(2); + + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'hooks/2', undefined); + }); +}); diff --git a/packages/gitbeaker-core/test/unit/services/Tags.ts b/packages/gitbeaker-core/test/unit/services/Tags.ts new file mode 100644 index 00000000..f9ce77e3 --- /dev/null +++ b/packages/gitbeaker-core/test/unit/services/Tags.ts @@ -0,0 +1,73 @@ +import { RequestHelper } from '../../../src/infrastructure'; +import { Tags } from '../../../src'; + +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); + +let service: Tags; + +beforeEach(() => { + service = new Tags({ + requesterFn: jest.fn(), + token: 'abcdefg', + requestTimeout: 3000, + }); +}); + +describe('Instantiating Tags service', () => { + it('should create a valid service object', async () => { + expect(service).toBeInstanceOf(Tags); + expect(service.url).toBeDefined(); + expect(service.rejectUnauthorized).toBeTruthy(); + expect(service.headers).toMatchObject({ 'private-token': 'abcdefg' }); + expect(service.requestTimeout).toBe(3000); + }); +}); + +describe('Tags.all', () => { + it('should request GET /projects/:id/repository/tags', async () => { + await service.all(1); + + expect(RequestHelper.get()).toHaveBeenCalledWith( + service, + 'projects/1/repository/tags', + undefined, + ); + }); +}); + +describe('Tags.create', () => { + it('should request POST /projects/:id/repository/tags', async () => { + await service.create(1, { test: 1 }); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/repository/tags', { + test: 1, + }); + }); +}); + +describe('Tags.show', () => { + it('should request GET /projects/:id/repository/tags/:tag_id', async () => { + await service.show(1, 'name'); + + expect(RequestHelper.get()).toHaveBeenCalledWith( + service, + 'projects/1/repository/tags/name', + undefined, + ); + }); +}); + +describe('Tags.remove', () => { + it('should request DEL /projects/:id/repository/tags/:tag_id', async () => { + await service.remove(1, 'name'); + + expect(RequestHelper.del()).toHaveBeenCalledWith( + service, + 'projects/1/repository/tags/name', + undefined, + ); + }); +}); diff --git a/packages/gitbeaker-core/test/unit/services/Todos.ts b/packages/gitbeaker-core/test/unit/services/Todos.ts new file mode 100644 index 00000000..289cda87 --- /dev/null +++ b/packages/gitbeaker-core/test/unit/services/Todos.ts @@ -0,0 +1,93 @@ +import { RequestHelper } from '../../../src/infrastructure'; +import { Todos } from '../../../src'; + +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); + +let service: Todos; + +beforeEach(() => { + service = new Todos({ + requesterFn: jest.fn(), + token: 'abcdefg', + requestTimeout: 3000, + }); +}); + +describe('Instantiating Todos service', () => { + it('should create a valid service object', async () => { + expect(service).toBeInstanceOf(Todos); + expect(service.url).toBeDefined(); + expect(service.rejectUnauthorized).toBeTruthy(); + expect(service.headers).toMatchObject({ 'private-token': 'abcdefg' }); + expect(service.requestTimeout).toBe(3000); + }); +}); + +describe('Todos.all', () => { + it('should request GET /todos', async () => { + await service.all({ test: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'todos', { test: 1 }); + }); + + it('should request GET /todos without options', async () => { + await service.all(); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'todos', undefined); + }); +}); + +describe('Todos.create', () => { + it('should request POST /projects/:project_id/mergerequests/:merge_request_id/todo', async () => { + await service.create(1, 2, 'mergerequest'); + + expect(RequestHelper.post()).toHaveBeenCalledWith( + service, + 'projects/1/merge_requests/2/todo', + undefined, + ); + }); + + it('should request POST /projects/:project_id/issues/:issue_id/todo', async () => { + await service.create(1, 2, 'issue'); + + expect(RequestHelper.post()).toHaveBeenCalledWith( + service, + 'projects/1/issues/2/todo', + undefined, + ); + }); + + it('should request POST /projects/:project_id/issues/:issue_id/todo with options', async () => { + await service.create(1, 2, 'issue', { sudo: 1 }); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/issues/2/todo', { + sudo: 1, + }); + }); + + it('should request POST /projects/:project_id/mergerequests/:merge_request_id/todo with options', async () => { + await service.create(1, 2, 'mergerequest', { sudo: 1 }); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/merge_requests/2/todo', { + sudo: 1, + }); + }); +}); + +describe('Todos.done', () => { + it('should request POST /todos', async () => { + await service.done(); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'todos/mark_as_done', {}); + }); + + it('should request POST /todos/1', async () => { + await service.done({ todoId: 1 }); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'todos/1/mark_as_done', {}); + }); +}); diff --git a/packages/gitbeaker-core/test/unit/services/Triggers.ts b/packages/gitbeaker-core/test/unit/services/Triggers.ts index 9af406b2..cf32b6a2 100644 --- a/packages/gitbeaker-core/test/unit/services/Triggers.ts +++ b/packages/gitbeaker-core/test/unit/services/Triggers.ts @@ -1,7 +1,10 @@ import { Triggers } from '../../../src'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Triggers; @@ -27,7 +30,7 @@ describe('Triggers.all', () => { it('should request GET /projects/:id/triggers', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/triggers', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/triggers', undefined); }); }); @@ -35,7 +38,7 @@ describe('Triggers.add', () => { it('should request POST /projects/:id/triggers', async () => { await service.add(1); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/triggers', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/triggers', undefined); }); }); @@ -43,7 +46,7 @@ describe('Triggers.edit', () => { it('should request PUT /projects/:id/triggers/:id', async () => { await service.edit(1, 2, { prop: 5 }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/triggers/2', { + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/triggers/2', { prop: 5, }); }); @@ -53,7 +56,7 @@ describe('Triggers.pipeline', () => { it('should request PUT /projects/:id/trigger/pipeline with variables', async () => { await service.pipeline(1, 'main', 'abcd', { variables: { VAR_ONE: 'val' } }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/trigger/pipeline', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/trigger/pipeline', { isForm: true, ref: 'main', token: 'abcd', @@ -64,7 +67,7 @@ describe('Triggers.pipeline', () => { it('should request PUT /projects/:id/trigger/pipeline without variables', async () => { await service.pipeline(1, 'main', 'abcd'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/trigger/pipeline', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/trigger/pipeline', { isForm: true, ref: 'main', token: 'abcd', @@ -76,7 +79,7 @@ describe('Triggers.show', () => { it('should request GET /projects/:id/triggers/:id', async () => { await service.show(1, 2); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/triggers/2', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/triggers/2', undefined); }); }); @@ -84,6 +87,6 @@ describe('Triggers.remove', () => { it('should request DELETE /projects/:id/triggers/:id', async () => { await service.remove(1, 2); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'projects/1/triggers/2', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/triggers/2', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/UserEmails.ts b/packages/gitbeaker-core/test/unit/services/UserEmails.ts index 2a832054..870c83c0 100644 --- a/packages/gitbeaker-core/test/unit/services/UserEmails.ts +++ b/packages/gitbeaker-core/test/unit/services/UserEmails.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { UserEmails } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: UserEmails; @@ -27,13 +30,13 @@ describe('UserEmails.all', () => { it('should request GET /user/emails', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'user/emails', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'user/emails', {}); }); it('should request GET /users/:id/emails', async () => { await service.all({ userId: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'users/1/emails', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users/1/emails', {}); }); }); @@ -41,7 +44,7 @@ describe('UserEmails.add', () => { it('should request POST /user/emails', async () => { await service.add('email'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'user/emails', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'user/emails', { email: 'email', }); }); @@ -49,7 +52,7 @@ describe('UserEmails.add', () => { it('should request POST /users/:id/emails', async () => { await service.add('email', { userId: 1 }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'users/1/emails', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'users/1/emails', { email: 'email', }); }); @@ -59,7 +62,7 @@ describe('UserEmails.show', () => { it('should request GET /user/emails/:id', async () => { await service.show(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'user/emails/1', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'user/emails/1', undefined); }); }); @@ -67,12 +70,12 @@ describe('UserEmails.remove', () => { it('should request DEL /users/:id/emails/:id', async () => { await service.remove(2, { userId: 1 }); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'users/1/emails/2', {}); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'users/1/emails/2', {}); }); it('should request DEL /user/emails/:id', async () => { await service.remove(2); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'user/emails/2', {}); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'user/emails/2', {}); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/UserGPGKeys.ts b/packages/gitbeaker-core/test/unit/services/UserGPGKeys.ts index 80a271b3..c9225813 100644 --- a/packages/gitbeaker-core/test/unit/services/UserGPGKeys.ts +++ b/packages/gitbeaker-core/test/unit/services/UserGPGKeys.ts @@ -1,7 +1,10 @@ import { UserGPGKeys } from '../../../src'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: UserGPGKeys; @@ -24,57 +27,57 @@ describe('Instantiating UserGPGKeys service', () => { }); describe('UserGPGKeys.add', () => { - it('should request POST users/gpg_keys', async () => { + it('should request POST user/gpg_keys', async () => { await service.add('key'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'users/gpg_keys', { key: 'key' }); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'user/gpg_keys', { key: 'key' }); }); it('should request POST users/1/gpg_keys', async () => { await service.add('key', { userId: 1 }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'users/1/gpg_keys', { key: 'key' }); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'users/1/gpg_keys', { key: 'key' }); }); }); describe('UserGPGKeys.all', () => { - it('should request GET users/gpg_keys', async () => { + it('should request GET user/gpg_keys', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'users/gpg_keys', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'user/gpg_keys', {}); }); it('should request GET users/:id/gpg_keys', async () => { await service.all({ userId: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'users/1/gpg_keys', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users/1/gpg_keys', {}); }); }); describe('UserGPGKeys.show', () => { - it('should request GET users/gpg_keys', async () => { + it('should request GET user/gpg_keys', async () => { await service.show(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'users/gpg_keys/1', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'user/gpg_keys/1', {}); }); it('should request GET users/1/gpg_keys', async () => { await service.show(1, { userId: 1 }); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'users/1/gpg_keys/1', {}); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users/1/gpg_keys/1', {}); }); }); describe('UserGPGKeys.remove', () => { - it('should request GET users/gpg_keys', async () => { + it('should request GET user/gpg_keys', async () => { await service.remove(1); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'users/gpg_keys/1', {}); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'user/gpg_keys/1', {}); }); it('should request GET users/1/gpg_keys', async () => { await service.remove(1, { userId: 1 }); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'users/1/gpg_keys/1', {}); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'users/1/gpg_keys/1', {}); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/UserSSHKeys.ts b/packages/gitbeaker-core/test/unit/services/UserSSHKeys.ts new file mode 100644 index 00000000..b7d8b29c --- /dev/null +++ b/packages/gitbeaker-core/test/unit/services/UserSSHKeys.ts @@ -0,0 +1,124 @@ +import { UserSSHKeys } from '../../../src'; +import { RequestHelper } from '../../../src/infrastructure'; + +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); + +let service: UserSSHKeys; + +beforeEach(() => { + service = new UserSSHKeys({ + requesterFn: jest.fn(), + token: 'abcdefg', + requestTimeout: 3000, + }); +}); + +describe('Instantiating UserSSHKeys service', () => { + it('should create a valid service object', async () => { + expect(service).toBeInstanceOf(UserSSHKeys); + expect(service.url).toBeDefined(); + expect(service.rejectUnauthorized).toBeTruthy(); + expect(service.headers).toMatchObject({ 'private-token': 'abcdefg' }); + expect(service.requestTimeout).toBe(3000); + }); +}); + +describe('UserSSHKeys.all', () => { + it('should request GET user/keys', async () => { + await service.all({ test: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'user/keys', { test: 1 }); + }); + + it('should request GET user/keys without options', async () => { + await service.all(); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'user/keys', {}); + }); + + it('should request GET users/:id/keys', async () => { + await service.all({ userId: 1, test: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users/1/keys', { test: 1 }); + }); + + it('should request GET users/:id/keys without options', async () => { + await service.all({ userId: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users/1/keys', {}); + }); +}); + +describe('UserSSHKeys.create', () => { + it('should request POST user/keys', async () => { + await service.create('title', 'key', { test: 1 }); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'user/keys', { + title: 'title', + key: 'key', + test: 1, + }); + }); + + it('should request POST user/keys without options', async () => { + await service.create('title', 'key'); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'user/keys', { + title: 'title', + key: 'key', + }); + }); + + it('should request POST users/1/keys', async () => { + await service.create('title', 'key', { userId: 1, test: 1 }); + + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'users/1/keys', { + title: 'title', + key: 'key', + test: 1, + }); + }); +}); + +describe('UserSSHKeys.show', () => { + it('should request GET user/keys', async () => { + await service.show(1, { test: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'user/keys/1', { test: 1 }); + }); + + it('should request GET user/keys without options', async () => { + await service.show(1); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'user/keys/1', {}); + }); + + it('should request GET users/1/keys', async () => { + await service.show(1, { userId: 1, test: 1 }); + + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users/1/keys/1', { test: 1 }); + }); +}); + +describe('UserSSHKeys.remove', () => { + it('should request GET user/keys', async () => { + await service.remove(1, { test: 1 }); + + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'user/keys/1', { test: 1 }); + }); + + it('should request GET user/keys without options', async () => { + await service.remove(1); + + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'user/keys/1', {}); + }); + + it('should request GET users/1/keys', async () => { + await service.remove(1, { userId: 1, test: 1 }); + + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'users/1/keys/1', { test: 1 }); + }); +}); diff --git a/packages/gitbeaker-core/test/unit/services/Users.ts b/packages/gitbeaker-core/test/unit/services/Users.ts index 75b055fd..eac923cd 100644 --- a/packages/gitbeaker-core/test/unit/services/Users.ts +++ b/packages/gitbeaker-core/test/unit/services/Users.ts @@ -1,7 +1,10 @@ import { Users } from '../../../src'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Users; @@ -27,7 +30,7 @@ describe('Users.all', () => { it('should request GET users', async () => { await service.all(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'users', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users', undefined); }); }); @@ -35,7 +38,7 @@ describe('Users.activities', () => { it('should request GET users', async () => { await service.activities(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'users/activities', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users/activities', undefined); }); }); @@ -43,7 +46,7 @@ describe('Users.projects', () => { it('should request GET users/:id/projects', async () => { await service.projects(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'users/1/projects', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users/1/projects', undefined); }); }); @@ -51,7 +54,7 @@ describe('Users.block', () => { it('should request POST users/:id/block', async () => { await service.block(1); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'users/1/block', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'users/1/block', undefined); }); }); @@ -59,7 +62,7 @@ describe('Users.create', () => { it('should request POST users/:id/block', async () => { await service.create({ name: "T'chala" }); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'users', { name: "T'chala" }); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'users', { name: "T'chala" }); }); }); @@ -67,7 +70,7 @@ describe('Users.current', () => { it('should request GET user', async () => { await service.current(); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'user', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'user', undefined); }); }); @@ -75,7 +78,7 @@ describe('Users.edit', () => { it('should request PUT users/:id', async () => { await service.edit(1, { name: 'Okoye' }); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'users/1', { name: 'Okoye' }); + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'users/1', { name: 'Okoye' }); }); }); @@ -83,7 +86,7 @@ describe('Users.events', () => { it('should request GET users/:id/projects', async () => { await service.events(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'users/1/events', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users/1/events', undefined); }); }); @@ -91,7 +94,9 @@ describe('Users.search', () => { it('should request GET users', async () => { await service.search('Erik Killmonger'); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'users', { search: 'Erik Killmonger' }); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users', { + search: 'Erik Killmonger', + }); }); }); @@ -99,7 +104,7 @@ describe('Users.show', () => { it('should request GET users/:id', async () => { await service.show(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'users/1', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'users/1', undefined); }); }); @@ -107,7 +112,7 @@ describe('Users.remove', () => { it('should request DELETE users/:id', async () => { await service.remove(1); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'users/1', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'users/1', undefined); }); }); @@ -115,6 +120,6 @@ describe('Users.unblock', () => { it('should request POST users/:id/unblock', async () => { await service.unblock(1); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'users/1/unblock', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'users/1/unblock', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/services/Wikis.ts b/packages/gitbeaker-core/test/unit/services/Wikis.ts index 0055580e..4fcb7807 100644 --- a/packages/gitbeaker-core/test/unit/services/Wikis.ts +++ b/packages/gitbeaker-core/test/unit/services/Wikis.ts @@ -1,7 +1,10 @@ import { RequestHelper } from '../../../src/infrastructure'; import { Wikis } from '../../../src'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: Wikis; @@ -27,7 +30,7 @@ describe('Wikis.all', () => { it('should request GET /projects/:id/wikis', async () => { await service.all(1); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/wikis', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/wikis', undefined); }); }); @@ -35,7 +38,7 @@ describe('Wikis.create', () => { it('should request POST /projects/:id/wikis', async () => { await service.create(1); - expect(RequestHelper.post).toHaveBeenCalledWith(service, 'projects/1/wikis', undefined); + expect(RequestHelper.post()).toHaveBeenCalledWith(service, 'projects/1/wikis', undefined); }); }); @@ -43,7 +46,7 @@ describe('Wikis.edit', () => { it('should request PUT /projects/:id/wikis/:slug', async () => { await service.edit(1, 'slug'); - expect(RequestHelper.put).toHaveBeenCalledWith(service, 'projects/1/wikis/slug', undefined); + expect(RequestHelper.put()).toHaveBeenCalledWith(service, 'projects/1/wikis/slug', undefined); }); }); @@ -51,7 +54,7 @@ describe('Wikis.show', () => { it('should request GET /projects/:id/wikis/:slug', async () => { await service.show(1, 'slug'); - expect(RequestHelper.get).toHaveBeenCalledWith(service, 'projects/1/wikis/slug', undefined); + expect(RequestHelper.get()).toHaveBeenCalledWith(service, 'projects/1/wikis/slug', undefined); }); }); @@ -59,6 +62,6 @@ describe('Wikis.remove', () => { it('should request DEL /projects/:id/wikis/:slug', async () => { await service.remove(1, 'slug'); - expect(RequestHelper.del).toHaveBeenCalledWith(service, 'projects/1/wikis/slug', undefined); + expect(RequestHelper.del()).toHaveBeenCalledWith(service, 'projects/1/wikis/slug', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceAccessRequests.ts b/packages/gitbeaker-core/test/unit/templates/ResourceAccessRequests.ts index 627db5e0..7ed6ed04 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceAccessRequests.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceAccessRequests.ts @@ -1,7 +1,10 @@ import { ResourceAccessRequests } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ResourceAccessRequests; @@ -28,13 +31,13 @@ describe('ResourceAccessRequests.all', () => { it('should call the correct url for getting all access requests with a string identifer', async () => { await service.all('5'); - expect(RequestHelper.get).toBeCalledWith(service, '5/access_requests'); + expect(RequestHelper.get()).toBeCalledWith(service, '5/access_requests'); }); it('should call the correct url for getting all access requests with a number identifer', async () => { await service.all(5); - expect(RequestHelper.get).toBeCalledWith(service, '5/access_requests'); + expect(RequestHelper.get()).toBeCalledWith(service, '5/access_requests'); }); }); @@ -42,13 +45,13 @@ describe('ResourceAccessRequests.request', () => { it('should call the correct url for requesting access requests with a string identifer', async () => { await service.request('5'); - expect(RequestHelper.post).toBeCalledWith(service, '5/access_requests'); + expect(RequestHelper.post()).toBeCalledWith(service, '5/access_requests'); }); it('should call the correct url for requesting access requests with a number identifer', async () => { await service.request(5); - expect(RequestHelper.post).lastCalledWith(service, '5/access_requests'); + expect(RequestHelper.post()).lastCalledWith(service, '5/access_requests'); }); }); @@ -56,13 +59,13 @@ describe('ResourceAccessRequests.approve', () => { it('should call the correct url for approving access requests with the resource id and user id', async () => { await service.approve('5', 1); - expect(RequestHelper.post).toBeCalledWith(service, '5/access_requests/1/approve', undefined); + expect(RequestHelper.post()).toBeCalledWith(service, '5/access_requests/1/approve', undefined); }); it('should accept the correct access levels', async () => { await service.approve(5, 1, { accessLevel: 20 }); - expect(RequestHelper.post).toBeCalledWith(service, '5/access_requests/1/approve', { + expect(RequestHelper.post()).toBeCalledWith(service, '5/access_requests/1/approve', { accessLevel: 20, }); }); @@ -70,7 +73,7 @@ describe('ResourceAccessRequests.approve', () => { it('should allow for sudo calls', async () => { await service.approve(5, 1, { sudo: 'test' }); - expect(RequestHelper.post).toBeCalledWith(service, '5/access_requests/1/approve', { + expect(RequestHelper.post()).toBeCalledWith(service, '5/access_requests/1/approve', { sudo: 'test', }); }); @@ -80,6 +83,6 @@ describe('ResourceAccessRequests.deny', () => { it('should call the correct url denying access requests with the resource id and user id', async () => { await service.deny('5', 1); - expect(RequestHelper.del).toBeCalledWith(service, '5/access_requests/1'); + expect(RequestHelper.del()).toBeCalledWith(service, '5/access_requests/1'); }); }); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceAwardEmojis.ts b/packages/gitbeaker-core/test/unit/templates/ResourceAwardEmojis.ts index 53e5723a..8360e960 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceAwardEmojis.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceAwardEmojis.ts @@ -1,7 +1,10 @@ import { ResourceAwardEmojis } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ResourceAwardEmojis; @@ -26,29 +29,25 @@ describe('Instantiating ResourceAwardEmojis service', () => { describe('ResourceAwardEmojis.all', () => { it('should call the correct url with a project id, resource id, and note id', async () => { - await service.all('5', 6, 7); + await service.all('5', 6); - expect(RequestHelper.get).toBeCalledWith( - service, - '5/resource/6/notes/7/award_emoji', - undefined, - ); + expect(RequestHelper.get()).toBeCalledWith(service, '5/resource/6/award_emoji', undefined); }); }); describe('ResourceAccessRequests.award', () => { - it('should call the correct url with a project id, name, resource id, and note id', async () => { - await service.award('5', 6, 7, 'frank'); + it('should call the correct url with a project id, name, resource id', async () => { + await service.award('5', 6, 'frank'); - expect(RequestHelper.post).toBeCalledWith(service, '5/resource/6/notes/7/award_emoji', { + expect(RequestHelper.post()).toBeCalledWith(service, '5/resource/6/award_emoji', { name: 'frank', }); }); it('should allow for sudo calls', async () => { - await service.award('5', 6, 7, 'frank', { sudo: 'test' }); + await service.award('5', 6, 'frank', { sudo: 'test' }); - expect(RequestHelper.post).toBeCalledWith(service, '5/resource/6/notes/7/award_emoji', { + expect(RequestHelper.post()).toBeCalledWith(service, '5/resource/6/award_emoji', { name: 'frank', sudo: 'test', }); @@ -56,40 +55,32 @@ describe('ResourceAccessRequests.award', () => { }); describe('ResourceAccessRequests.remove', () => { - it('should call the correct url with a project id, resource id, award_id, and note id', async () => { - await service.remove('5', 6, 7, 9); + it('should call the correct url with a project id, resource id, award_id', async () => { + await service.remove('5', 6, 9); - expect(RequestHelper.del).toBeCalledWith( - service, - '5/resource/6/notes/7/award_emoji/9', - undefined, - ); + expect(RequestHelper.del()).toBeCalledWith(service, '5/resource/6/award_emoji/9', undefined); }); it('should allow for sudo calls', async () => { - await service.remove('5', 6, 7, 9, { sudo: 'test' }); + await service.remove('5', 6, 9, { sudo: 'test' }); - expect(RequestHelper.del).toBeCalledWith(service, '5/resource/6/notes/7/award_emoji/9', { + expect(RequestHelper.del()).toBeCalledWith(service, '5/resource/6/award_emoji/9', { sudo: 'test', }); }); }); describe('ResourceAccessRequests.show', () => { - it('should call the correct url with a project id, resource id, award_id, and note id', async () => { - await service.show('5', 6, 7, 9); + it('should call the correct url with a project id, resource id, award_id', async () => { + await service.show('5', 6, 9); - expect(RequestHelper.get).toBeCalledWith( - service, - '5/resource/6/notes/7/award_emoji/9', - undefined, - ); + expect(RequestHelper.get()).toBeCalledWith(service, '5/resource/6/award_emoji/9', undefined); }); it('should allow for sudo calls', async () => { - await service.show('5', 6, 7, 9, { sudo: 'test' }); + await service.show('5', 6, 9, { sudo: 'test' }); - expect(RequestHelper.get).toBeCalledWith(service, '5/resource/6/notes/7/award_emoji/9', { + expect(RequestHelper.get()).toBeCalledWith(service, '5/resource/6/award_emoji/9', { sudo: 'test', }); }); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceBadges.ts b/packages/gitbeaker-core/test/unit/templates/ResourceBadges.ts index f893544c..9ac40d47 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceBadges.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceBadges.ts @@ -1,7 +1,10 @@ import { ResourceBadges } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ResourceBadges; @@ -28,7 +31,7 @@ describe('ResourceBadges.add', () => { it('should call the correct url with a resource id', async () => { await service.add('5'); - expect(RequestHelper.post).toBeCalledWith(service, '5/badges', undefined); + expect(RequestHelper.post()).toBeCalledWith(service, '5/badges', undefined); }); }); @@ -36,7 +39,7 @@ describe('ResourceBadges.all', () => { it('should call the correct url with a resource id', async () => { await service.all('5'); - expect(RequestHelper.get).toBeCalledWith(service, '5/badges', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/badges', undefined); }); }); @@ -44,7 +47,7 @@ describe('ResourceBadges.edit', () => { it('should call the correct url with a resource id and badge id', async () => { await service.edit('5', 6); - expect(RequestHelper.put).toBeCalledWith(service, '5/badges/6', undefined); + expect(RequestHelper.put()).toBeCalledWith(service, '5/badges/6', undefined); }); }); @@ -52,7 +55,7 @@ describe('ResourceBadges.preview', () => { it('should call the correct url with a resource id, linkUrl and imageUrl', async () => { await service.preview('5', 'https://url.com', 'https://image.com'); - expect(RequestHelper.get).toBeCalledWith(service, '5/badges/render', { + expect(RequestHelper.get()).toBeCalledWith(service, '5/badges/render', { linkUrl: 'https://url.com', imageUrl: 'https://image.com', }); @@ -63,7 +66,7 @@ describe('ResourceBadges.remove', () => { it('should call the correct url with a resource id and badge id', async () => { await service.remove('5', 6); - expect(RequestHelper.del).toBeCalledWith(service, '5/badges/6', undefined); + expect(RequestHelper.del()).toBeCalledWith(service, '5/badges/6', undefined); }); }); @@ -71,6 +74,6 @@ describe('ResourceBadges.show', () => { it('should call the correct url with a resource id and badge id', async () => { await service.show('5', 6); - expect(RequestHelper.get).toBeCalledWith(service, '5/badges/6', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/badges/6', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceCustomAttributes.ts b/packages/gitbeaker-core/test/unit/templates/ResourceCustomAttributes.ts index e25fba65..8e05a5c3 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceCustomAttributes.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceCustomAttributes.ts @@ -1,7 +1,10 @@ import { ResourceCustomAttributes } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ResourceCustomAttributes; @@ -28,7 +31,7 @@ describe('ResourceCustomAttributes.all', () => { it('should call the correct url with a resource id', async () => { await service.all('5'); - expect(RequestHelper.get).toBeCalledWith(service, '5/custom_attributes', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/custom_attributes', undefined); }); }); @@ -36,7 +39,7 @@ describe('ResourceCustomAttributes.set', () => { it('should call the correct url with a resource id', async () => { await service.set('5', 6, 'on'); - expect(RequestHelper.put).toBeCalledWith(service, '5/custom_attributes/6', { + expect(RequestHelper.put()).toBeCalledWith(service, '5/custom_attributes/6', { value: 'on', }); }); @@ -46,7 +49,7 @@ describe('ResourceCustomAttributes.remove', () => { it('should call the correct url with a resource id and custom attribute id', async () => { await service.remove('5', 6); - expect(RequestHelper.del).toBeCalledWith(service, '5/custom_attributes/6', undefined); + expect(RequestHelper.del()).toBeCalledWith(service, '5/custom_attributes/6', undefined); }); }); @@ -54,6 +57,6 @@ describe('ResourceCustomAttributes.show', () => { it('should call the correct url with a resource id and custom attribute id', async () => { await service.show('5', 6); - expect(RequestHelper.get).toBeCalledWith(service, '5/custom_attributes/6', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/custom_attributes/6', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceDeployTokens.ts b/packages/gitbeaker-core/test/unit/templates/ResourceDeployTokens.ts new file mode 100644 index 00000000..94c9737c --- /dev/null +++ b/packages/gitbeaker-core/test/unit/templates/ResourceDeployTokens.ts @@ -0,0 +1,73 @@ +import { ResourceDeployTokens } from '../../../src/templates'; +import { RequestHelper } from '../../../src/infrastructure'; + +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); + +let service: ResourceDeployTokens; + +beforeEach(() => { + service = new ResourceDeployTokens('resource', { + requesterFn: jest.fn(), + token: 'abcdefg', + }); +}); + +afterEach(() => { + jest.clearAllMocks(); +}); + +describe('Instantiating ResourceDeployTokens service', () => { + it('should create a valid service object', async () => { + expect(service).toBeInstanceOf(ResourceDeployTokens); + expect(service.url).toBeDefined(); + expect(service.url).toContain('resource'); + }); +}); + +describe('ResourceDeployTokens.add', () => { + it('should call the correct url with a resource id, token name and scope', async () => { + await service.add('5', 'token', ['read_repository']); + + expect(RequestHelper.post()).toBeCalledWith(service, '5/deploy_tokens', { + name: 'token', + scopes: ['read_repository'], + }); + }); +}); + +describe('ResourceDeployTokens.all', () => { + it('should request GET /deploy_tokens', async () => { + await service.all(); + + expect(RequestHelper.get()).toBeCalledWith(service, 'deploy_tokens', {}); + }); + + it('should request GET /5/deploy_tokens with resourceId', async () => { + await service.all({ resourceId: 5 }); + + expect(RequestHelper.get()).toBeCalledWith(service, '5/deploy_tokens', {}); + }); + + it('should request GET /5/deploy_tokens with groupId', async () => { + await service.all({ groupId: 5 }); + + expect(RequestHelper.get()).toBeCalledWith(service, '5/deploy_tokens', {}); + }); + + it('should request GET /5/deploy_tokens with projectId', async () => { + await service.all({ projectId: 5 }); + + expect(RequestHelper.get()).toBeCalledWith(service, '5/deploy_tokens', {}); + }); +}); + +describe('ResourceDeployTokens.remove', () => { + it('should request DEL /5/deploy_tokens/6', async () => { + await service.remove('5', 6); + + expect(RequestHelper.del()).toBeCalledWith(service, '5/deploy_tokens/6', undefined); + }); +}); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceDiscussions.ts b/packages/gitbeaker-core/test/unit/templates/ResourceDiscussions.ts index aefbcfd4..be05c3ad 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceDiscussions.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceDiscussions.ts @@ -1,7 +1,10 @@ import { ResourceDiscussions } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ResourceDiscussions; @@ -25,10 +28,14 @@ describe('ResourceDiscussions.addNote', () => { it('should call the correct url', async () => { await service.addNote(1, 2, 3, 4, 'test'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, '1/resource2/2/discussions/3/notes', { - noteId: '4', - body: 'test', - }); + expect(RequestHelper.post()).toHaveBeenCalledWith( + service, + '1/resource2/2/discussions/3/notes', + { + noteId: '4', + body: 'test', + }, + ); }); }); @@ -36,7 +43,7 @@ describe('ResourceCustomAttributes.all', () => { it('should call the correct url with a resource id', async () => { await service.all(1, 2); - expect(RequestHelper.get).toBeCalledWith(service, '1/resource2/2/discussions', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '1/resource2/2/discussions', undefined); }); }); @@ -44,7 +51,7 @@ describe('ResourceDiscussions.create', () => { it('should call the correct url', async () => { await service.create(1, 2, 'test'); - expect(RequestHelper.post).toHaveBeenCalledWith(service, '1/resource2/2/discussions', { + expect(RequestHelper.post()).toHaveBeenCalledWith(service, '1/resource2/2/discussions', { body: 'test', }); }); @@ -54,9 +61,13 @@ describe('ResourceDiscussions.editNote', () => { it('should call the correct url', async () => { await service.editNote(1, 2, 3, 4, 'test'); - expect(RequestHelper.put).toHaveBeenCalledWith(service, '1/resource2/2/discussions/3/notes/4', { - body: 'test', - }); + expect(RequestHelper.put()).toHaveBeenCalledWith( + service, + '1/resource2/2/discussions/3/notes/4', + { + body: 'test', + }, + ); }); }); @@ -64,7 +75,7 @@ describe('ResourceDiscussions.removeNote', () => { it('should call the correct url', async () => { await service.removeNote(1, 2, 3, 4); - expect(RequestHelper.del).toHaveBeenCalledWith( + expect(RequestHelper.del()).toHaveBeenCalledWith( service, '1/resource2/2/discussions/3/notes/4', undefined, @@ -76,7 +87,7 @@ describe('ResourceDiscussions.show', () => { it('should call the correct url', async () => { await service.show(1, 2, 3); - expect(RequestHelper.get).toHaveBeenCalledWith( + expect(RequestHelper.get()).toHaveBeenCalledWith( service, '1/resource2/2/discussions/3', undefined, diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceIssueBoards.ts b/packages/gitbeaker-core/test/unit/templates/ResourceIssueBoards.ts index 8c4adde8..f844a84d 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceIssueBoards.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceIssueBoards.ts @@ -1,7 +1,10 @@ import { ResourceIssueBoards } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ResourceIssueBoards; @@ -28,7 +31,7 @@ describe('ResourceIssueBoards.all', () => { it('should call the correct url with a resource id', async () => { await service.all('5'); - expect(RequestHelper.get).toBeCalledWith(service, '5/boards', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/boards', undefined); }); }); @@ -36,7 +39,7 @@ describe('ResourceIssueBoards.create', () => { it('should call the correct url with a resource id when given new board name', async () => { await service.create('5', 'todo'); - expect(RequestHelper.post).toBeCalledWith(service, '5/boards', { + expect(RequestHelper.post()).toBeCalledWith(service, '5/boards', { name: 'todo', }); }); @@ -46,7 +49,7 @@ describe('ResourceIssueBoards.createList', () => { it('should call the correct url with a resource id, board id and label id', async () => { await service.createList('5', 6, 1); - expect(RequestHelper.post).toBeCalledWith(service, '5/boards/6/lists', { + expect(RequestHelper.post()).toBeCalledWith(service, '5/boards/6/lists', { labelId: 1, }); }); @@ -56,7 +59,7 @@ describe('ResourceIssueBoards.edit', () => { it('should call the correct url with a resource id and board id', async () => { await service.edit('5', 6); - expect(RequestHelper.put).toBeCalledWith(service, '5/boards/6', undefined); + expect(RequestHelper.put()).toBeCalledWith(service, '5/boards/6', undefined); }); }); @@ -64,7 +67,7 @@ describe('ResourceIssueBoards.editList', () => { it('should call the correct url with a resource id, board id, label id and position', async () => { await service.editList('5', 6, 1, 2); - expect(RequestHelper.put).toBeCalledWith(service, '5/boards/6/lists/1', { + expect(RequestHelper.put()).toBeCalledWith(service, '5/boards/6/lists/1', { position: 2, }); }); @@ -74,7 +77,7 @@ describe('ResourceIssueBoards.lists', () => { it('should call the correct url with a resource id and board id', async () => { await service.lists('5', 6); - expect(RequestHelper.get).toBeCalledWith(service, '5/boards/6/lists', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/boards/6/lists', undefined); }); }); @@ -82,7 +85,7 @@ describe('ResourceIssueBoards.remove', () => { it('should call the correct url with a resource id and board id', async () => { await service.remove('5', 6); - expect(RequestHelper.del).toBeCalledWith(service, '5/boards/6', undefined); + expect(RequestHelper.del()).toBeCalledWith(service, '5/boards/6', undefined); }); }); @@ -90,7 +93,7 @@ describe('ResourceIssueBoards.removeList', () => { it('should call the correct url with a resource id, board id and list id', async () => { await service.removeList('5', 6, 7); - expect(RequestHelper.del).toBeCalledWith(service, '5/boards/6/lists/7', undefined); + expect(RequestHelper.del()).toBeCalledWith(service, '5/boards/6/lists/7', undefined); }); }); @@ -98,7 +101,7 @@ describe('ResourceIssueBoards.show', () => { it('should call the correct url with a resource id and board id', async () => { await service.show('5', 6); - expect(RequestHelper.get).toBeCalledWith(service, '5/boards/6', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/boards/6', undefined); }); }); @@ -106,6 +109,6 @@ describe('ResourceIssueBoards.showList', () => { it('should call the correct url with a resource id, board id and list id', async () => { await service.showList('5', 6, 7); - expect(RequestHelper.get).toBeCalledWith(service, '5/boards/6/lists/7', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/boards/6/lists/7', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceLabels.ts b/packages/gitbeaker-core/test/unit/templates/ResourceLabels.ts index 5bb2c521..7e009933 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceLabels.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceLabels.ts @@ -1,7 +1,10 @@ import { ResourceLabels } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ResourceLabels; @@ -28,7 +31,7 @@ describe('ResourceLabels.all', () => { it('should call the correct url with a resource id', async () => { await service.all('5'); - expect(RequestHelper.get).toBeCalledWith(service, '5/labels', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/labels', undefined); }); }); @@ -36,7 +39,7 @@ describe('ResourceLabels.create', () => { it('should call the correct url with a resource id', async () => { await service.create('5', 'review', '#888888'); - expect(RequestHelper.post).toBeCalledWith(service, '5/labels', { + expect(RequestHelper.post()).toBeCalledWith(service, '5/labels', { name: 'review', color: '#888888', }); @@ -47,7 +50,7 @@ describe('ResourceLabels.edit', () => { it('should call the correct url with a resource id and label name', async () => { await service.edit('5', 'review'); - expect(RequestHelper.put).toBeCalledWith(service, '5/labels', { name: 'review' }); + expect(RequestHelper.put()).toBeCalledWith(service, '5/labels/review', undefined); }); }); @@ -55,7 +58,7 @@ describe('ResourceLabels.remove', () => { it('should call the correct url with a resource id and label name', async () => { await service.remove('5', 'review'); - expect(RequestHelper.del).toBeCalledWith(service, '5/labels', { name: 'review' }); + expect(RequestHelper.del()).toBeCalledWith(service, '5/labels/review', undefined); }); }); @@ -63,7 +66,7 @@ describe('ResourceLabels.subscribe', () => { it('should call the correct url with a resource id and label id', async () => { await service.subscribe('5', 6); - expect(RequestHelper.post).toBeCalledWith(service, '5/issues/6/subscribe', undefined); + expect(RequestHelper.post()).toBeCalledWith(service, '5/issues/6/subscribe', undefined); }); }); @@ -71,6 +74,6 @@ describe('ResourceLabels.unsubscribe', () => { it('should call the correct url with a resource id and label id', async () => { await service.unsubscribe('5', 6); - expect(RequestHelper.del).toBeCalledWith(service, '5/issues/6/unsubscribe', undefined); + expect(RequestHelper.del()).toBeCalledWith(service, '5/issues/6/unsubscribe', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceMembers.ts b/packages/gitbeaker-core/test/unit/templates/ResourceMembers.ts index 873492be..0fafd44a 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceMembers.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceMembers.ts @@ -1,7 +1,10 @@ import { ResourceMembers } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ResourceMembers; @@ -28,7 +31,7 @@ describe('ResourceMembers.add', () => { it('should call the correct url for adding a member with a resource id, user id and access level', async () => { await service.add('5', 5, 10); - expect(RequestHelper.post).toBeCalledWith(service, '5/members', { + expect(RequestHelper.post()).toBeCalledWith(service, '5/members', { accessLevel: 10, userId: '5', }); @@ -39,13 +42,13 @@ describe('ResourceMembers.all', () => { it('should call the correct url for getting all members for a resource', async () => { await service.all('5'); - expect(RequestHelper.get).toBeCalledWith(service, '5/members', {}); + expect(RequestHelper.get()).toBeCalledWith(service, '5/members', {}); }); it('should call the correct url for getting all members for a resource including inherited ones', async () => { await service.all('5', { includeInherited: true }); - expect(RequestHelper.get).toBeCalledWith(service, '5/members/all', {}); + expect(RequestHelper.get()).toBeCalledWith(service, '5/members/all', {}); }); }); @@ -53,7 +56,7 @@ describe('ResourceMembers.edit', () => { it('should call the correct url for editing a member with a resource id, user id and access level', async () => { await service.edit('5', 5, 10); - expect(RequestHelper.put).toBeCalledWith(service, '5/members/5', { + expect(RequestHelper.put()).toBeCalledWith(service, '5/members/5', { accessLevel: 10, }); }); @@ -63,13 +66,13 @@ describe('ResourceMembers.show', () => { it('should call the correct url for showing a member with a resource id, and user id', async () => { await service.show('5', 5); - expect(RequestHelper.get).toBeCalledWith(service, '5/members/5', {}); + expect(RequestHelper.get()).toBeCalledWith(service, '5/members/5', {}); }); it('should call the correct url for showing a member with a resource id, and user id, including inherited ones', async () => { await service.show('5', 5, { includeInherited: true }); - expect(RequestHelper.get).toBeCalledWith(service, '5/members/all/5', {}); + expect(RequestHelper.get()).toBeCalledWith(service, '5/members/all/5', {}); }); }); @@ -77,6 +80,6 @@ describe('ResourceMembers.remove', () => { it('should call the correct url for removing a member with a resource id, and user id', async () => { await service.remove('5', 5); - expect(RequestHelper.del).toBeCalledWith(service, '5/members/5', undefined); + expect(RequestHelper.del()).toBeCalledWith(service, '5/members/5', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceMilestones.ts b/packages/gitbeaker-core/test/unit/templates/ResourceMilestones.ts index 91abbeed..a30fe10f 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceMilestones.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceMilestones.ts @@ -1,7 +1,10 @@ import { ResourceMilestones } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ResourceMilestones; @@ -28,7 +31,7 @@ describe('ResourceMilestones.all', () => { it('should call the correct url with a resource id', async () => { await service.all('5'); - expect(RequestHelper.get).toBeCalledWith(service, '5/milestones', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/milestones', undefined); }); }); @@ -36,7 +39,7 @@ describe('ResourceMilestones.create', () => { it('should call the correct url with a resource id', async () => { await service.create('5', 'sprint'); - expect(RequestHelper.post).toBeCalledWith(service, '5/milestones', { title: 'sprint' }); + expect(RequestHelper.post()).toBeCalledWith(service, '5/milestones', { title: 'sprint' }); }); }); @@ -44,7 +47,7 @@ describe('ResourceMilestones.edit', () => { it('should call the correct url with a resource id and milestone id', async () => { await service.edit('5', 6); - expect(RequestHelper.put).toBeCalledWith(service, '5/milestones/6', undefined); + expect(RequestHelper.put()).toBeCalledWith(service, '5/milestones/6', undefined); }); }); @@ -52,7 +55,7 @@ describe('ResourceMilestones.issues', () => { it('should call the correct url with a resource id', async () => { await service.issues('5', 6); - expect(RequestHelper.get).toBeCalledWith(service, '5/milestones/6/issues', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/milestones/6/issues', undefined); }); }); @@ -60,7 +63,7 @@ describe('ResourceMilestones.mergeRequests', () => { it('should call the correct url with a resource id', async () => { await service.mergeRequests('5', 6); - expect(RequestHelper.get).toBeCalledWith(service, '5/milestones/6/merge_requests', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/milestones/6/merge_requests', undefined); }); }); @@ -68,6 +71,6 @@ describe('ResourceMilestones.show', () => { it('should call the correct url with a resource id and milestone id', async () => { await service.show('5', 6); - expect(RequestHelper.get).toBeCalledWith(service, '5/milestones/6', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/milestones/6', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceNoteAwardEmojis.ts b/packages/gitbeaker-core/test/unit/templates/ResourceNoteAwardEmojis.ts new file mode 100644 index 00000000..d964caf9 --- /dev/null +++ b/packages/gitbeaker-core/test/unit/templates/ResourceNoteAwardEmojis.ts @@ -0,0 +1,99 @@ +import { ResourceNoteAwardEmojis } from '../../../src/templates'; +import { RequestHelper } from '../../../src/infrastructure'; + +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); + +let service: ResourceNoteAwardEmojis; + +beforeEach(() => { + service = new ResourceNoteAwardEmojis('resource', { + requesterFn: jest.fn(), + token: 'abcdefg', + }); +}); + +afterEach(() => { + jest.clearAllMocks(); +}); + +describe('Instantiating ResourceNoteAwardEmojis service', () => { + it('should create a valid service object', async () => { + expect(service).toBeInstanceOf(ResourceNoteAwardEmojis); + expect(service.url).toBeDefined(); + expect(service.url).toContain('projects'); + }); +}); + +describe('ResourceNoteAwardEmojis.all', () => { + it('should call the correct url with a project id, resource id, and note id', async () => { + await service.all('5', 6, 7); + + expect(RequestHelper.get()).toBeCalledWith( + service, + '5/resource/6/notes/7/award_emoji', + undefined, + ); + }); +}); + +describe('ResourceAccessRequests.award', () => { + it('should call the correct url with a project id, name, resource id, and note id', async () => { + await service.award('5', 6, 7, 'frank'); + + expect(RequestHelper.post()).toBeCalledWith(service, '5/resource/6/notes/7/award_emoji', { + name: 'frank', + }); + }); + + it('should allow for sudo calls', async () => { + await service.award('5', 6, 7, 'frank', { sudo: 'test' }); + + expect(RequestHelper.post()).toBeCalledWith(service, '5/resource/6/notes/7/award_emoji', { + name: 'frank', + sudo: 'test', + }); + }); +}); + +describe('ResourceAccessRequests.remove', () => { + it('should call the correct url with a project id, resource id, award_id, and note id', async () => { + await service.remove('5', 6, 7, 9); + + expect(RequestHelper.del()).toBeCalledWith( + service, + '5/resource/6/notes/7/award_emoji/9', + undefined, + ); + }); + + it('should allow for sudo calls', async () => { + await service.remove('5', 6, 7, 9, { sudo: 'test' }); + + expect(RequestHelper.del()).toBeCalledWith(service, '5/resource/6/notes/7/award_emoji/9', { + sudo: 'test', + }); + }); +}); + +describe('ResourceAccessRequests.show', () => { + it('should call the correct url with a project id, resource id, award_id, and note id', async () => { + await service.show('5', 6, 7, 9); + + expect(RequestHelper.get()).toBeCalledWith( + service, + '5/resource/6/notes/7/award_emoji/9', + undefined, + ); + }); + + it('should allow for sudo calls', async () => { + await service.show('5', 6, 7, 9, { sudo: 'test' }); + + expect(RequestHelper.get()).toBeCalledWith(service, '5/resource/6/notes/7/award_emoji/9', { + sudo: 'test', + }); + }); +}); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceNotes.ts b/packages/gitbeaker-core/test/unit/templates/ResourceNotes.ts index 4e4485e4..caa46c0e 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceNotes.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceNotes.ts @@ -1,7 +1,10 @@ import { ResourceNotes } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ResourceNotes; @@ -28,7 +31,7 @@ describe('ResourceNotes.all', () => { it('should call the correct url', async () => { await service.all(4, 5); - expect(RequestHelper.get).toBeCalledWith(service, '4/resource2/5/notes', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '4/resource2/5/notes', undefined); }); }); @@ -36,7 +39,7 @@ describe('ResourceNotes.create', () => { it('should call the correct url creating a note', async () => { await service.create(4, 5, 'test'); - expect(RequestHelper.post).toBeCalledWith(service, '4/resource2/5/notes', { + expect(RequestHelper.post()).toBeCalledWith(service, '4/resource2/5/notes', { body: 'test', }); }); @@ -46,7 +49,7 @@ describe('ResourceNotes.edit', () => { it('should call correct url for editing a note', async () => { await service.edit(4, 5, 6, 'test'); - expect(RequestHelper.put).toBeCalledWith(service, '4/resource2/5/notes/6', { + expect(RequestHelper.put()).toBeCalledWith(service, '4/resource2/5/notes/6', { body: 'test', }); }); @@ -56,7 +59,7 @@ describe('ResourceNotes.show', () => { it('should call correct url for showing a note', async () => { await service.show(4, 5, 6); - expect(RequestHelper.get).toBeCalledWith(service, '4/resource2/5/notes/6', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '4/resource2/5/notes/6', undefined); }); }); @@ -64,6 +67,6 @@ describe('ResourceNotes.remove', () => { it('should call correct url for removing a note', async () => { await service.remove(4, 5, 6); - expect(RequestHelper.del).toBeCalledWith(service, '4/resource2/5/notes/6', undefined); + expect(RequestHelper.del()).toBeCalledWith(service, '4/resource2/5/notes/6', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceTemplates.ts b/packages/gitbeaker-core/test/unit/templates/ResourceTemplates.ts index a439954d..2efe0b8d 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceTemplates.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceTemplates.ts @@ -1,7 +1,10 @@ import { ResourceTemplates } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); let service: ResourceTemplates; @@ -28,7 +31,7 @@ describe('ResourceTemplates.all', () => { it('should call the correct url', async () => { await service.all(); - expect(RequestHelper.get).toBeCalledWith(service, '', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '', undefined); }); }); @@ -36,6 +39,6 @@ describe('ResourceTemplates.show', () => { it('should call the correct url with a resource id', async () => { await service.show(6); - expect(RequestHelper.get).toBeCalledWith(service, '6', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '6', undefined); }); }); diff --git a/packages/gitbeaker-core/test/unit/templates/ResourceVariables.ts b/packages/gitbeaker-core/test/unit/templates/ResourceVariables.ts index 4cba4e20..bd63b640 100644 --- a/packages/gitbeaker-core/test/unit/templates/ResourceVariables.ts +++ b/packages/gitbeaker-core/test/unit/templates/ResourceVariables.ts @@ -1,9 +1,12 @@ import { ResourceVariables } from '../../../src/templates'; import { RequestHelper } from '../../../src/infrastructure'; -jest.mock('../../../src/infrastructure/RequestHelper'); +jest.mock( + '../../../src/infrastructure/RequestHelper', + () => require('../../__mocks__/RequestHelper').default, +); -let service: ResourceVariables; +let service: ResourceVariables; beforeEach(() => { service = new ResourceVariables('resource', { @@ -28,7 +31,7 @@ describe('ResourceVariables.all', () => { it('should call the correct url with a resource id', async () => { await service.all('5'); - expect(RequestHelper.get).toBeCalledWith(service, '5/variables', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/variables', undefined); }); }); @@ -36,7 +39,7 @@ describe('ResourceVariables.create', () => { it('should call the correct url with a resource id', async () => { await service.create('5'); - expect(RequestHelper.post).toBeCalledWith(service, '5/variables', undefined); + expect(RequestHelper.post()).toBeCalledWith(service, '5/variables', undefined); }); }); @@ -44,7 +47,7 @@ describe('ResourceVariables.edit', () => { it('should call the correct url with a resource id and key id', async () => { await service.edit('5', '6'); - expect(RequestHelper.put).toBeCalledWith(service, '5/variables/6', undefined); + expect(RequestHelper.put()).toBeCalledWith(service, '5/variables/6', undefined); }); }); @@ -52,7 +55,7 @@ describe('ResourceVariables.remove', () => { it('should call the correct url with a resource id and key id', async () => { await service.remove('5', '6'); - expect(RequestHelper.del).toBeCalledWith(service, '5/variables/6', undefined); + expect(RequestHelper.del()).toBeCalledWith(service, '5/variables/6', undefined); }); }); @@ -60,6 +63,6 @@ describe('ResourceVariables.show', () => { it('should call the correct url with a resource id and key id', async () => { await service.show('5', '6'); - expect(RequestHelper.get).toBeCalledWith(service, '5/variables/6', undefined); + expect(RequestHelper.get()).toBeCalledWith(service, '5/variables/6', undefined); }); }); diff --git a/packages/gitbeaker-node/src/index.ts b/packages/gitbeaker-node/src/index.ts index f0bb3075..be618b3b 100644 --- a/packages/gitbeaker-node/src/index.ts +++ b/packages/gitbeaker-node/src/index.ts @@ -14,7 +14,6 @@ export const { GroupIssueBoards, GroupMembers, GroupMilestones, - GroupProjects, GroupRunners, GroupVariables, GroupLabels, @@ -28,7 +27,7 @@ export const { UserCustomAttributes, UserEmails, UserImpersonationTokens, - UserKeys, + UserSSHKeys, UserGPGKeys, // Projects @@ -43,6 +42,7 @@ export const { Issues, IssuesStatistics, IssueNotes, + IssueNoteAwardEmojis, IssueDiscussions, IssueAwardEmojis, Jobs, @@ -94,7 +94,7 @@ export const { GitLabCIYMLTemplates, Keys, License, - LicenceTemplates, + LicenseTemplates, Lint, Namespaces, NotificationSettings, diff --git a/packages/gitbeaker-node/test/integration/services/Projects.ts b/packages/gitbeaker-node/test/integration/services/Projects.ts index d4547fd2..1ebc57d7 100644 --- a/packages/gitbeaker-node/test/integration/services/Projects.ts +++ b/packages/gitbeaker-node/test/integration/services/Projects.ts @@ -38,22 +38,21 @@ describe.skip('Projects.all', () => { }); }); -describe('Projects.upload', () => { +// TODO: Determine config changes required for this test. +// Local testing works +describe.skip('Projects.upload', () => { it('should upload a text file', async () => { - try { - const project = await service.create({ - name: `Project Upload Integration Test Text File ${TEST_ID}`, - }); - const results = await service.upload(project.id as number, 'TESTING FILE UPLOAD :D', { - metadata: { - filename: 'testfile.txt', - contentType: 'text/plain', - }, - }); + const project = await service.create({ + name: `Project Upload Integration Test Text File ${TEST_ID}`, + }); - expect(results).toContainKeys(['alt', 'url', 'markdown']); - } catch (e) { - console.log(e); - } + const results = await service.upload(project.id, 'TESTING FILE UPLOAD', { + metadata: { + filename: 'testfile.txt', + contentType: 'text/plain', + }, + }); + + expect(results).toContainKeys(['alt', 'url', 'full_path', 'markdown']); }); }); diff --git a/packages/gitbeaker-requester-utils/src/BaseService.ts b/packages/gitbeaker-requester-utils/src/BaseService.ts index d9fdf4a5..7cea34b9 100644 --- a/packages/gitbeaker-requester-utils/src/BaseService.ts +++ b/packages/gitbeaker-requester-utils/src/BaseService.ts @@ -1,6 +1,6 @@ import { RequesterType, DefaultServiceOptions } from './RequesterUtils'; -export interface BaseServiceOptions { +export interface BaseServiceOptions { oauthToken?: string; token?: string; jobToken?: string; @@ -8,7 +8,7 @@ export interface BaseServiceOptions { prefixUrl?: string; version?: 3 | 4; rejectUnauthorized?: boolean; - camelize?: boolean; + camelize?: C; requesterFn?: (serviceOptions: DefaultServiceOptions) => RequesterType; requestTimeout?: number; profileToken?: string; @@ -16,7 +16,7 @@ export interface BaseServiceOptions { profileMode?: 'execution' | 'memory'; } -export class BaseService { +export class BaseService { public readonly url: string; public readonly requester: RequesterType; @@ -25,7 +25,7 @@ export class BaseService { public readonly headers: { [header: string]: string }; - public readonly camelize: boolean; + public readonly camelize: C | undefined; public readonly rejectUnauthorized: boolean; @@ -36,14 +36,14 @@ export class BaseService { sudo, profileToken, requesterFn, + camelize, profileMode = 'execution', host = 'https://gitlab.com', prefixUrl = '', version = 4, - camelize = false, rejectUnauthorized = true, requestTimeout = 300000, - }: BaseServiceOptions = {}) { + }: BaseServiceOptions = {}) { if (!requesterFn) throw new ReferenceError('requesterFn must be passed'); this.url = [host, 'api', `v${version}`, prefixUrl].join('/'); diff --git a/yarn.lock b/yarn.lock index 3ba05a5e..87877177 100644 --- a/yarn.lock +++ b/yarn.lock @@ -186,48 +186,47 @@ dependencies: "@babel/highlight" "^7.12.13" -"@babel/compat-data@^7.13.8": - version "7.13.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.8.tgz#5b783b9808f15cef71547f1b691f34f8ff6003a6" - integrity sha512-EaI33z19T4qN3xLXsGf48M2cDqa6ei9tPZlfLdb2HC+e/cFtREiRd8hdSqDbwdLB0/+gLwqJmCYASH0z2bUdog== +"@babel/compat-data@^7.13.15": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.0.tgz#a901128bce2ad02565df95e6ecbf195cf9465919" + integrity sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q== "@babel/core@^7.1.0", "@babel/core@^7.7.5": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.10.tgz#07de050bbd8193fcd8a3c27918c0890613a94559" - integrity sha512-bfIYcT0BdKeAZrovpMqX2Mx5NrgAckGbwT982AkdS5GNfn3KMGiprlBAtmBcFZRUmpaufS6WZFP8trvx8ptFDw== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.0.tgz#47299ff3ec8d111b493f1a9d04bf88c04e728d88" + integrity sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.9" - "@babel/helper-compilation-targets" "^7.13.10" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helpers" "^7.13.10" - "@babel/parser" "^7.13.10" + "@babel/generator" "^7.14.0" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.0" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.0" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.13.0", "@babel/generator@^7.13.9": - version "7.13.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" - integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== +"@babel/generator@^7.14.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.1.tgz#1f99331babd65700183628da186f36f63d615c93" + integrity sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.14.1" jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-compilation-targets@^7.13.10": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz#1310a1678cb8427c07a753750da4f8ce442bdd0c" - integrity sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA== +"@babel/helper-compilation-targets@^7.13.16": + version "7.13.16" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c" + integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA== dependencies: - "@babel/compat-data" "^7.13.8" + "@babel/compat-data" "^7.13.15" "@babel/helper-validator-option" "^7.12.17" browserslist "^4.14.5" semver "^6.3.0" @@ -248,34 +247,33 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-member-expression-to-functions@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091" - integrity sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ== +"@babel/helper-member-expression-to-functions@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" + integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== dependencies: - "@babel/types" "^7.13.0" + "@babel/types" "^7.13.12" -"@babel/helper-module-imports@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" - integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== +"@babel/helper-module-imports@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" + integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.13.12" -"@babel/helper-module-transforms@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1" - integrity sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw== +"@babel/helper-module-transforms@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz#8fcf78be220156f22633ee204ea81f73f826a8ad" + integrity sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw== dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-simple-access" "^7.13.12" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - lodash "^4.17.19" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" @@ -289,22 +287,22 @@ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== -"@babel/helper-replace-supers@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" - integrity sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw== +"@babel/helper-replace-supers@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804" + integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw== dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.0" + "@babel/helper-member-expression-to-functions" "^7.13.12" "@babel/helper-optimise-call-expression" "^7.12.13" "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/types" "^7.13.12" -"@babel/helper-simple-access@^7.12.13": - version "7.12.13" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" - integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== +"@babel/helper-simple-access@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" + integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== dependencies: - "@babel/types" "^7.12.13" + "@babel/types" "^7.13.12" "@babel/helper-split-export-declaration@^7.12.13": version "7.12.13" @@ -313,38 +311,38 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== "@babel/helper-validator-option@^7.12.17": version "7.12.17" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== -"@babel/helpers@^7.13.10": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.10.tgz#fd8e2ba7488533cdeac45cc158e9ebca5e3c7df8" - integrity sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ== +"@babel/helpers@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" + integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== dependencies: "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" "@babel/highlight@^7.10.4", "@babel/highlight@^7.12.13": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1" - integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" + "@babel/helper-validator-identifier" "^7.14.0" chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.0", "@babel/parser@^7.13.10": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.10.tgz#8f8f9bf7b3afa3eabd061f7a5bcdf4fec3c48409" - integrity sha512-0s7Mlrw9uTWkYua7xWr99Wpk2bnGa0ANleKfksYAES8LpWH4gW1OUr42vqKNf0us5UQNfru2wPqMqRITzq/SIQ== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.0": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.1.tgz#1bd644b5db3f5797c4479d89ec1817fe02b84c47" + integrity sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -431,9 +429,9 @@ "@babel/helper-plugin-utils" "^7.12.13" "@babel/runtime@^7.12.5", "@babel/runtime@^7.7.6": - version "7.13.10" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d" - integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw== + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.14.0.tgz#46794bc20b612c5f75e62dd071e24dfd95f1cbe6" + integrity sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA== dependencies: regenerator-runtime "^0.13.4" @@ -446,28 +444,26 @@ "@babel/parser" "^7.12.13" "@babel/types" "^7.12.13" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" - integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== +"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.0.tgz#cea0dc8ae7e2b1dec65f512f39f3483e8cc95aef" + integrity sha512-dZ/a371EE5XNhTHomvtuLTUyx6UEoJmYX+DT5zBCQN3McHemsuIaKKYqsc/fs26BEkHs/lBZy0J571LP5z9kQA== dependencies: "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.0" + "@babel/generator" "^7.14.0" "@babel/helper-function-name" "^7.12.13" "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.0" - "@babel/types" "^7.13.0" + "@babel/parser" "^7.14.0" + "@babel/types" "^7.14.0" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.13.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" - integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== +"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.1", "@babel/types@^7.3.0", "@babel/types@^7.3.3": + version "7.14.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.1.tgz#095bd12f1c08ab63eff6e8f7745fa7c9cc15a9db" + integrity sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA== dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" + "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1502,9 +1498,9 @@ "@octokit/types" "^6.0.3" "@octokit/core@^3.2.3": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.3.0.tgz#58afc26c302e22cf97491bad9a30b2f33e2bcaed" - integrity sha512-GGMpjaodCBY7JrtOwfolMocwZw9Pj5NxuQqfaJhGau4tkyonm0JRV9D6juQYLMb1Kl261++4Q980o0FlAtg8jg== + version "3.4.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.4.0.tgz#b48aa27d755b339fe7550548b340dcc2b513b742" + integrity sha512-6/vlKPP8NF17cgYXqucdshWqmMZGXkuvtcrWCgU5NOI0Pl2GjlmZyWgBMrU8zJ3v2MJlM6++CiB45VKYmhiWWg== dependencies: "@octokit/auth-token" "^2.4.4" "@octokit/graphql" "^4.5.8" @@ -1537,10 +1533,15 @@ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-5.3.2.tgz#b8ac43c5c3d00aef61a34cf744e315110c78deb4" integrity sha512-NxF1yfYOUO92rCx3dwvA2onF30Vdlg7YUkMVXkeptqpzA3tRLplThhFleV/UKWFgh7rpKu1yYRbvNDUtzSopKA== +"@octokit/openapi-types@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-7.0.0.tgz#0f6992db9854af15eca77d71ab0ec7fad2f20411" + integrity sha512-gV/8DJhAL/04zjTI95a7FhQwS6jlEE0W/7xeYAzuArD0KVAVWDLP2f3vi98hs3HLTczxXdRK/mF0tRoQPpolEw== + "@octokit/plugin-enterprise-compatibility@^1.2.2": - version "1.2.9" - resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-compatibility/-/plugin-enterprise-compatibility-1.2.9.tgz#63e58313fc6f3936fb9a01f8145160fb1d29df96" - integrity sha512-No/4dQ7qPeGCRllaS7DP5wNZDmGbJO8OvQ9qePYHGqacY+fmaj7m95ngxmO1AQ2OcVQmFyV/jBDXB3EfVgWUpg== + version "1.2.11" + resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-compatibility/-/plugin-enterprise-compatibility-1.2.11.tgz#b150aa0104e6e9d963c5ababdcb4c43f22b1752c" + integrity sha512-bFCxP7q1q2bzK/H9C+NW4JNmdlwvjYFh7+J0SEdjklo9Q0K40s9IhKC4+DUaoCYCVSJv8aiiXIp660Hc15SbtA== dependencies: "@octokit/request-error" "^2.0.4" "@octokit/types" "^6.0.3" @@ -1551,9 +1552,9 @@ integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== "@octokit/plugin-paginate-rest@^2.6.2": - version "2.13.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.2.tgz#7b8244a0dd7a31135ba2adc58a533213837bfe87" - integrity sha512-mjfBcla00UNS4EI/NN7toEbUM45ow3kk4go+LxsXAFLQodsrXcIZbftUhXTqi6ZKd+r6bcqMI+Lv4dshLtFjww== + version "2.13.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz#f0f1792230805108762d87906fb02d573b9e070a" + integrity sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg== dependencies: "@octokit/types" "^6.11.0" @@ -1570,6 +1571,14 @@ "@octokit/types" "^6.12.2" deprecation "^2.3.1" +"@octokit/plugin-rest-endpoint-methods@5.0.1": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.0.1.tgz#631b8d4edc6798b03489911252a25f2a4e58c594" + integrity sha512-vvWbPtPqLyIzJ7A4IPdTl+8IeuKAwMJ4LjvmqWOOdfSuqWQYZXq2CEd0hsnkidff2YfKlguzujHs/reBdAx8Sg== + dependencies: + "@octokit/types" "^6.13.1" + deprecation "^2.3.1" + "@octokit/plugin-retry@^3.0.1": version "3.0.7" resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-3.0.7.tgz#174516f2b80b7140aee71ebc2b506db2c5c1d3d6" @@ -1596,20 +1605,28 @@ once "^1.4.0" "@octokit/request@^5.3.0", "@octokit/request@^5.4.12": - version "5.4.14" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.14.tgz#ec5f96f78333bb2af390afa5ff66f114b063bc96" - integrity sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA== + version "5.4.15" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.15.tgz#829da413dc7dd3aa5e2cdbb1c7d0ebe1f146a128" + integrity sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag== dependencies: "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.0.0" "@octokit/types" "^6.7.1" - deprecation "^2.0.0" is-plain-object "^5.0.0" node-fetch "^2.6.1" - once "^1.4.0" universal-user-agent "^6.0.0" -"@octokit/rest@^18.0.0", "@octokit/rest@^18.1.0": +"@octokit/rest@^18.0.0": + version "18.5.3" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.5.3.tgz#6a2e6006a87ebbc34079c419258dd29ec9ff659d" + integrity sha512-KPAsUCr1DOdLVbZJgGNuE/QVLWEaVBpFQwDAz/2Cnya6uW2wJ/P5RVGk0itx7yyN1aGa8uXm2pri4umEqG1JBA== + dependencies: + "@octokit/core" "^3.2.3" + "@octokit/plugin-paginate-rest" "^2.6.2" + "@octokit/plugin-request-log" "^1.0.2" + "@octokit/plugin-rest-endpoint-methods" "5.0.1" + +"@octokit/rest@^18.1.0": version "18.3.5" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.3.5.tgz#a89903d46e0b4273bd3234674ec2777a651d68ab" integrity sha512-ZPeRms3WhWxQBEvoIh0zzf8xdU2FX0Capa7+lTca8YHmRsO3QNJzf1H3PcuKKsfgp91/xVDRtX91sTe1kexlbw== @@ -1619,7 +1636,14 @@ "@octokit/plugin-request-log" "^1.0.2" "@octokit/plugin-rest-endpoint-methods" "4.13.5" -"@octokit/types@^6.0.1", "@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.12.2", "@octokit/types@^6.7.1": +"@octokit/types@^6.0.1", "@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.13.1", "@octokit/types@^6.7.1": + version "6.14.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.14.2.tgz#64c9457f38fb8522bdbba3c8cc814590a2d61bf5" + integrity sha512-wiQtW9ZSy4OvgQ09iQOdyXYNN60GqjCL/UdMsepDr1Gr0QzpW6irIKbH3REuAHXAhxkEk9/F2a3Gcs1P6kW5jA== + dependencies: + "@octokit/openapi-types" "^7.0.0" + +"@octokit/types@^6.12.2": version "6.12.2" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.12.2.tgz#5b44add079a478b8eb27d78cf384cc47e4411362" integrity sha512-kCkiN8scbCmSq+gwdJV0iLgHc0O/GTPY1/cffo9kECu1MvatLPh9E+qFhfRIktKfHEA6ZYvv6S1B4Wnv3bi3pA== @@ -1701,14 +1725,14 @@ integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== "@sindresorhus/is@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4" - integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ== + version "4.0.1" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.1.tgz#d26729db850fa327b7cacc5522252194404226f5" + integrity sha512-Qm9hBEBu18wt1PO2flE7LPb30BHMQt1eQgbV76YntdNk73XZGpn3izvGTYxbGgzXKgbCjiia0uxTd3aTNQrY/g== "@sinonjs/commons@^1.7.0": - version "1.8.2" - resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.2.tgz#858f5c4b48d80778fde4b9d541f27edc0d56488b" - integrity sha512-sruwd86RJHdsVf/AtBoijDmUqJp3B6hF/DGC23C+JaegnDHaZyewCjoVGTdg3J0uz3Zs7NnIT05OBOmML72lQw== + version "1.8.3" + resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ== dependencies: type-detect "4.0.8" @@ -1732,9 +1756,9 @@ integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.12" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.12.tgz#4d8e9e51eb265552a7e4f1ff2219ab6133bdfb2d" - integrity sha512-wMTHiiTiBAAPebqaPiPDLFA4LYPKr6Ph0Xq/6rq1Ur3v66HXyG+clfR9CNETkD7MQS8ZHvpQOtA53DLws5WAEQ== + version "7.1.14" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" + integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -1785,9 +1809,9 @@ integrity sha512-/xUgezxxYePeXhg5S04hUjxG9JZi+rJTs1+4NwpYPfSaS7BeDa6tVJkH6lN9Cb6rl8d24Fi2uX0s0Ngg2JT6gg== "@types/estree@*": - version "0.0.46" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" - integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== + version "0.0.47" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4" + integrity sha512-c5ciR06jK8u9BstrmJyO97m+klJrrhCf9u3rLu3DEAJBirxRqSCvDQoYKmxuYwQI5SZChAWu+tq9oVlGRuzPAg== "@types/estree@0.0.39": version "0.0.39" @@ -1901,9 +1925,9 @@ integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== "@types/prettier@^2.0.0": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.2.tgz#e2280c89ddcbeef340099d6968d8c86ba155fdf6" - integrity sha512-i99hy7Ki19EqVOl77WplDrvgNugHnsSjECVR/wUrzw2TJXz1zlUfT2ngGckR6xN7yFYaijsMAqPkOLx9HgUqHg== + version "2.2.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" + integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== "@types/puppeteer@*", "@types/puppeteer@^5.4.3": version "5.4.3" @@ -1976,7 +2000,7 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@4.22.1", "@typescript-eslint/experimental-utils@^4.0.1": +"@typescript-eslint/experimental-utils@4.22.1": version "4.22.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.1.tgz#3938a5c89b27dc9a39b5de63a62ab1623ab27497" integrity sha512-svYlHecSMCQGDO2qN1v477ax/IDQwWhc7PRBiwAdAMJE7GXk5stF4Z9R/8wbRkuX/5e9dHqbIWxjeOjckK3wLQ== @@ -1988,6 +2012,18 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" +"@typescript-eslint/experimental-utils@^4.0.1": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.23.0.tgz#f2059434cd6e5672bfeab2fb03b7c0a20622266f" + integrity sha512-WAFNiTDnQfrF3Z2fQ05nmCgPsO5o790vOhmWKXbbYQTO9erE1/YsFot5/LnOUizLzU2eeuz6+U/81KV5/hFTGA== + dependencies: + "@types/json-schema" "^7.0.3" + "@typescript-eslint/scope-manager" "4.23.0" + "@typescript-eslint/types" "4.23.0" + "@typescript-eslint/typescript-estree" "4.23.0" + eslint-scope "^5.0.0" + eslint-utils "^2.0.0" + "@typescript-eslint/parser@^4.17.0": version "4.22.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.22.1.tgz#a95bda0fd01d994a15fc3e99dc984294f25c19cc" @@ -2006,11 +2042,24 @@ "@typescript-eslint/types" "4.22.1" "@typescript-eslint/visitor-keys" "4.22.1" +"@typescript-eslint/scope-manager@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.23.0.tgz#8792ef7eacac122e2ec8fa2d30a59b8d9a1f1ce4" + integrity sha512-ZZ21PCFxPhI3n0wuqEJK9omkw51wi2bmeKJvlRZPH5YFkcawKOuRMQMnI8mH6Vo0/DoHSeZJnHiIx84LmVQY+w== + dependencies: + "@typescript-eslint/types" "4.23.0" + "@typescript-eslint/visitor-keys" "4.23.0" + "@typescript-eslint/types@4.22.1": version "4.22.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.22.1.tgz#bf99c6cec0b4a23d53a61894816927f2adad856a" integrity sha512-2HTkbkdAeI3OOcWbqA8hWf/7z9c6gkmnWNGz0dKSLYLWywUlkOAQ2XcjhlKLj5xBFDf8FgAOF5aQbnLRvgNbCw== +"@typescript-eslint/types@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.23.0.tgz#da1654c8a5332f4d1645b2d9a1c64193cae3aa3b" + integrity sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw== + "@typescript-eslint/typescript-estree@4.22.1": version "4.22.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.1.tgz#dca379eead8cdfd4edc04805e83af6d148c164f9" @@ -2024,6 +2073,19 @@ semver "^7.3.2" tsutils "^3.17.1" +"@typescript-eslint/typescript-estree@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.23.0.tgz#0753b292097523852428a6f5a1aa8ccc1aae6cd9" + integrity sha512-5Sty6zPEVZF5fbvrZczfmLCOcby3sfrSPu30qKoY1U3mca5/jvU5cwsPb/CO6Q3ByRjixTMIVsDkqwIxCf/dMw== + dependencies: + "@typescript-eslint/types" "4.23.0" + "@typescript-eslint/visitor-keys" "4.23.0" + debug "^4.1.1" + globby "^11.0.1" + is-glob "^4.0.1" + semver "^7.3.2" + tsutils "^3.17.1" + "@typescript-eslint/visitor-keys@4.22.1": version "4.22.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.1.tgz#6045ae25a11662c671f90b3a403d682dfca0b7a6" @@ -2032,6 +2094,14 @@ "@typescript-eslint/types" "4.22.1" eslint-visitor-keys "^2.0.0" +"@typescript-eslint/visitor-keys@4.23.0": + version "4.23.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz#7215cc977bd3b4ef22467b9023594e32f9e4e455" + integrity sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg== + dependencies: + "@typescript-eslint/types" "4.23.0" + eslint-visitor-keys "^2.0.0" + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -2085,10 +2155,10 @@ acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.5: - version "8.1.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.0.tgz#52311fd7037ae119cbb134309e901aa46295b3fe" - integrity sha512-LWCF/Wn0nfHOmJ9rzQApGnxnvgfROzGilS8936rqN/lfcYkY9MYZzdMqN+2NJ4SlTc+m5HiSa+kNfDtI64dwUA== +acorn@^8.1.0: + version "8.2.4" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.2.4.tgz#caba24b08185c3b56e3168e97d15ed17f4d31fd0" + integrity sha512-Ibt84YwBDDA890eDiDCEqcbwvHlBvzzDkU2cGBBDDI1QWT12jTiXIOn2CIw5KK4i6N5Z2HUxwYjzriDyqaqqZg== add-stream@^1.0.0: version "1.0.0" @@ -2129,10 +2199,10 @@ ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^7.0.2: - version "7.2.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.2.1.tgz#a5ac226171912447683524fa2f1248fcf8bac83d" - integrity sha512-+nu0HDv7kNSOua9apAVc979qd932rrZeb3WOvoiD31A/p1mIE5/9bN2027pE2rOPYEdS3UHzsvof4hY+lM9/WQ== +ajv@^8.0.1: + version "8.3.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.3.0.tgz#25ee7348e32cdc4a1dbb38256bf6bdc451dd577c" + integrity sha512-RYE7B5An83d7eWnDR8kbdaIFqmKCNsP16ay1hDbJEU+sa0e3H9SebskCt0Uufem6cfAVu7Col6ubcn/W+Sm8/Q== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2177,11 +2247,11 @@ ansi-colors@^4.1.1: integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" - integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: - type-fest "^0.11.0" + type-fest "^0.21.3" ansi-regex@^2.0.0: version "2.1.1" @@ -2231,9 +2301,9 @@ anymatch@^2.0.0: normalize-path "^2.1.1" anymatch@^3.0.3, anymatch@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -2538,9 +2608,9 @@ babel-preset-jest@^26.6.2: babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.3.1: version "1.5.1" @@ -2568,9 +2638,9 @@ bcrypt-pbkdf@^1.0.0: tweetnacl "^0.14.3" before-after-hook@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.0.tgz#09c40d92e936c64777aa385c4e9b904f8147eaf0" - integrity sha512-jH6rKQIfroBbhEXVmI7XmXe3ix5S/PgJqpzdDPnR8JGLHWNYLsYZ6tK5iWOF/Ra3oqEX0NobXGlzbiylIzVphQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c" + integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw== bl@^4.0.3, bl@^4.1.0: version "4.1.0" @@ -2708,15 +2778,15 @@ browserify-sign@^4.0.0: safe-buffer "^5.2.0" browserslist@^4.14.5: - version "4.16.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" - integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== dependencies: - caniuse-lite "^1.0.30001181" - colorette "^1.2.1" - electron-to-chromium "^1.3.649" + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" escalade "^3.1.1" - node-releases "^1.1.70" + node-releases "^1.1.71" bs-logger@0.x: version "0.2.6" @@ -2881,10 +2951,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@^1.0.30001181: - version "1.0.30001199" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001199.tgz#062afccaad21023e2e647d767bac4274b8b8fd7f" - integrity sha512-ifbK2eChUCFUwGhlEzIoVwzFt1+iriSjyKKFYNfv6hN34483wyWpLLavYQXhnR036LhkdUYaSDpHg1El++VgHQ== +caniuse-lite@^1.0.30001219: + version "1.0.30001228" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz#bfdc5942cd3326fa51ee0b42fbef4da9d492a7fa" + integrity sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A== capture-exit@^2.0.0: version "2.0.0" @@ -2976,9 +3046,9 @@ cli-cursor@^3.1.0: restore-cursor "^3.1.0" cli-spinners@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047" - integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ== + version "2.6.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" + integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== cli-truncate@^2.1.0: version "2.1.0" @@ -3113,7 +3183,7 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@^1.2.1: +colorette@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== @@ -3750,9 +3820,9 @@ dot-prop@^6.0.1: is-obj "^2.0.0" dotenv@^8.0.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" - integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== + version "8.6.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" + integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== duplexer@^0.1.1: version "0.1.2" @@ -3767,10 +3837,10 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" -electron-to-chromium@^1.3.649: - version "1.3.687" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.687.tgz#c336184b7ab70427ffe2ee79eaeaedbc1ad8c374" - integrity sha512-IpzksdQNl3wdgkzf7dnA7/v10w0Utf1dF2L+B4+gKrloBrxCut+au+kky3PYvle3RMdSxZP+UiCZtLbcYRxSNQ== +electron-to-chromium@^1.3.723: + version "1.3.727" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.727.tgz#857e310ca00f0b75da4e1db6ff0e073cc4a91ddf" + integrity sha512-Mfz4FIB4FSvEwBpDfdipRIrwd6uo8gUDoRDF4QEYb4h4tSuI3ov594OrjU6on042UlFHouIJpClDODGkPcBSbg== elliptic@^6.5.3: version "6.5.4" @@ -4004,9 +4074,9 @@ eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== eslint@^7.22.0: version "7.26.0" @@ -4133,9 +4203,9 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: safe-buffer "^5.1.1" exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== execa@^1.0.0: version "1.0.0" @@ -4526,9 +4596,9 @@ form-data@~2.3.2: mime-types "^2.1.12" fp-ts@^2.5.3: - version "2.9.5" - resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.9.5.tgz#6690cd8b76b84214a38fc77cbbbd04a38f86ea90" - integrity sha512-MiHrA5teO6t8zKArE3DdMPT/Db6v2GUt5yfWnhBTrrsVfeCJUUnV6sgFvjGNBKDmEMqVwRFkEePL7wPwqrLKKA== + version "2.10.5" + resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.10.5.tgz#7c77868fe8bd9b229743303c1bec505b959f631b" + integrity sha512-X2KfTIV0cxIk3d7/2Pvp/pxL/xr2MV1WooyEzKtTWYSc1+52VF4YzjBTXqeOlSiZsPCxIBpDGfT9Dyo7WEY0DQ== fragment-cache@^0.2.1: version "0.2.1" @@ -4794,7 +4864,7 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@^5.1.1: dependencies: is-glob "^4.0.1" -glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -4806,6 +4876,18 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" @@ -4837,13 +4919,25 @@ globals@^12.1.0: type-fest "^0.8.1" globals@^13.6.0: - version "13.6.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.6.0.tgz#d77138e53738567bb96a3916ff6f6b487af20ef7" - integrity sha512-YFKCX0SiPg7l5oKYCJ2zZGxcXprVXHcSnVuvzrT3oSENQonVLqM5pf9fN5dLGZGyCjhw8TN8Btwe/jKnZ0pjvQ== + version "13.8.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.8.0.tgz#3e20f504810ce87a8d72e55aecf8435b50f4c1b3" + integrity sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q== dependencies: type-fest "^0.20.2" -globby@^11.0.1, globby@^11.0.2: +globby@^11.0.1: + version "11.0.3" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" + integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + +globby@^11.0.2: version "11.0.2" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.2.tgz#1af538b766a3b540ebfb58a32b2e2d5897321d83" integrity sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og== @@ -4924,7 +5018,7 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== -has-bigints@^1.0.0: +has-bigints@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== @@ -4939,7 +5033,7 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: +has-symbols@^1.0.1, has-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== @@ -5021,9 +5115,9 @@ homedir-polyfill@^1.0.0: parse-passwd "^1.0.0" hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hosted-git-info@^3.0.6: version "3.0.8" @@ -5032,10 +5126,10 @@ hosted-git-info@^3.0.6: dependencies: lru-cache "^6.0.0" -hosted-git-info@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.0.tgz#9f06639a90beff66cacae6e77f8387b431d61ddc" - integrity sha512-fqhGdjk4av7mT9fU/B01dUtZ+WZSc/XEXMoLXDVZukiQRXxeHSSz3AqbeWRJHtF8EQYHlAgB1NSAHU0Cm7aqZA== +hosted-git-info@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" + integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== dependencies: lru-cache "^6.0.0" @@ -5301,16 +5395,16 @@ is-arrayish@^0.2.1: integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= is-bigint@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" - integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== is-boolean-object@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" - integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.6" @@ -5330,9 +5424,9 @@ is-ci@^2.0.0: ci-info "^2.0.0" is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== dependencies: has "^1.0.3" @@ -5351,9 +5445,9 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== is-descriptor@^0.1.0: version "0.1.6" @@ -5374,9 +5468,9 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: kind-of "^6.0.2" is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + version "2.2.1" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -5450,9 +5544,9 @@ is-negative-zero@^2.0.1: integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== is-number-object@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" - integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== is-number@^3.0.0: version "3.0.0" @@ -5504,9 +5598,9 @@ is-plain-object@^5.0.0: integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== is-potential-custom-element-name@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" - integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== is-reference@^1.2.1: version "1.2.1" @@ -5516,12 +5610,12 @@ is-reference@^1.2.1: "@types/estree" "*" is-regex@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" - integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== dependencies: call-bind "^1.0.2" - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-regexp@^1.0.0: version "1.0.0" @@ -5546,16 +5640,16 @@ is-stream@^2.0.0: integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-text-path@^1.0.1: version "1.0.1" @@ -6186,12 +6280,12 @@ jsbn@~0.1.0: integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= jsdom@^16.4.0: - version "16.5.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.1.tgz#4ced6bbd7b77d67fb980e64d9e3e6fb900f97dd6" - integrity sha512-pF73EOsJgwZekbDHEY5VO/yKXUkab/DuvrQB/ANVizbr6UAHJsDdHXuotZYwkJSGQl1JM+ivXaqY+XBDDL4TiA== + version "16.5.3" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.3.tgz#13a755b3950eb938b4482c407238ddf16f0d2136" + integrity sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA== dependencies: abab "^2.0.5" - acorn "^8.0.5" + acorn "^8.1.0" acorn-globals "^6.0.0" cssom "^0.4.4" cssstyle "^2.3.0" @@ -6213,7 +6307,7 @@ jsdom@^16.4.0: webidl-conversions "^6.1.0" whatwg-encoding "^1.0.5" whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" + whatwg-url "^8.5.0" ws "^7.4.4" xml-name-validator "^3.0.0" @@ -6642,6 +6736,11 @@ lodash.chunk@^4.2.0: resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" integrity sha1-ZuXOH3btJ7QwPYxlEujRIW6BBrw= +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + lodash.get@^4: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" @@ -6652,11 +6751,6 @@ lodash.ismatch@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= - lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -6672,7 +6766,12 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "^3.0.0" -lodash@4.x, lodash@^4.11.2, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" + integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= + +lodash@4.x, lodash@^4.11.2, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6793,9 +6892,9 @@ map-obj@^1.0.0, map-obj@^1.0.1: integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= map-obj@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.0.tgz#0e8bc823e2aaca8a0942567d12ed14f389eec153" - integrity sha512-NAq0fCmZYGz9UFEQyndp7sisrow4GroyGeKluyKC/chuITZsPyOyC1UJZPJlVFImhXdROIP5xqouRLThT3BbpQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.2.1.tgz#e4ea399dbc979ae735c83c863dd31bdf364277b7" + integrity sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ== map-visit@^1.0.0: version "1.0.0" @@ -6905,17 +7004,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" - integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== +mime-db@1.47.0: + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.29" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" - integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: - mime-db "1.46.0" + mime-db "1.47.0" mimic-fn@^2.1.0: version "2.1.0" @@ -7232,7 +7331,7 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" -node-releases@^1.1.70: +node-releases@^1.1.71: version "1.1.71" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== @@ -7263,13 +7362,13 @@ normalize-package-data@^2.0.0, normalize-package-data@^2.3.0, normalize-package- validate-npm-package-license "^3.0.1" normalize-package-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.1.tgz#98dc56dfe6755d99b1c53f046e1e3d2dde55a1c7" - integrity sha512-D/ttLdxo71msR4FF3VgSwK4blHfE3/vGByz1NCeE7/Dh8reQOKNJJjk5L10mLq9jxa+ZHzT1/HLgxljzbXE7Fw== + version "3.0.2" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.2.tgz#cae5c410ae2434f9a6c1baa65d5bc3b9366c8699" + integrity sha512-6CdZocmfGaKnIHPVFhJJZ3GuR8SsLKvDANFp47Jmy51aKIr8akjAWTSxtpI+MBgBFdSMRyo4hMpDlT6dTffgZg== dependencies: - hosted-git-info "^4.0.0" - resolve "^1.17.0" - semver "^7.3.2" + hosted-git-info "^4.0.1" + resolve "^1.20.0" + semver "^7.3.4" validate-npm-package-license "^3.0.1" normalize-path@^2.1.1: @@ -7423,9 +7522,9 @@ object-copy@^0.1.0: kind-of "^3.0.3" object-inspect@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -7590,9 +7689,9 @@ osenv@^0.1.4: os-tmpdir "^1.0.0" p-cancelable@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.0.tgz#4d51c3b91f483d02a0d300765321fca393d758dd" - integrity sha512-HAZyB3ZodPo+BDpb4/Iu7Jv4P6cSazBz9ZM0ChhEXp70scx834aWCEjQRwgt41UzzejUAPdbqqONfRWTPYrPAQ== + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== p-each-series@^2.1.0: version "2.2.0" @@ -7877,9 +7976,9 @@ path-type@^4.0.0: integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== pbkdf2@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" - integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.2.tgz#dd822aa0887580e52f1a039dc3eda108efae3075" + integrity sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA== dependencies: create-hash "^1.1.2" create-hmac "^1.1.4" @@ -7902,12 +8001,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -picomatch@^2.2.3: +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== @@ -8070,15 +8164,7 @@ promise-retry@^2.0.1: err-code "^2.0.2" retry "^0.12.0" -prompts@^2.0.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" - integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prompts@^2.4.1: +prompts@^2.0.1, prompts@^2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== @@ -8172,9 +8258,11 @@ q@^1.5.1: integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= qs@^6.9.4: - version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" - integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== + version "6.10.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== + dependencies: + side-channel "^1.0.4" qs@~6.5.2: version "6.5.2" @@ -8202,9 +8290,9 @@ query-string@^7.0.0: strict-uri-encode "^2.0.0" queue-microtask@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" - integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== quick-lru@^4.0.1: version "4.0.1" @@ -8247,9 +8335,9 @@ react-is@^16.8.4: integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== react-is@^17.0.1: - version "17.0.1" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339" - integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA== + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== read-cmd-shim@^2.0.0: version "2.0.0" @@ -8486,9 +8574,9 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" @@ -8569,9 +8657,9 @@ requireg@^0.2.2: resolve "~1.7.1" resolve-alpn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c" - integrity sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.1.2.tgz#30b60cfbb0c0b8dc897940fe13fe255afcdd4d28" + integrity sha512-8OyfzhAtA32LVUsJSke3auIyINcwdh5l3cvYKdKO0nvsYSKuiLfTM5i78PJswFPT8y6cPW+L1v6/hE95chcpDA== resolve-cwd@^3.0.0: version "3.0.0" @@ -8603,7 +8691,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.20.0, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0: +resolve@1.20.0, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.13.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -8751,14 +8839,7 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.6.0: - version "6.6.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.6.tgz#14d8417aa5a07c5e633995b525e1e3c0dec03b70" - integrity sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg== - dependencies: - tslib "^1.9.0" - -rxjs@^6.6.3, rxjs@^6.6.7: +rxjs@^6.6.0, rxjs@^6.6.3, rxjs@^6.6.7: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== @@ -8819,10 +8900,10 @@ semver-compare@^1.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== +semver@7.x, semver@^7.0.0, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4: + version "7.3.5" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" + integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== dependencies: lru-cache "^6.0.0" @@ -8831,6 +8912,13 @@ semver@^6.0.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.1.1, semver@^7.1.3: + version "7.3.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" + integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== + dependencies: + lru-cache "^6.0.0" + semver@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-2.3.2.tgz#b9848f25d6cf36333073ec9ef8856d42f1233e52" @@ -8921,6 +9009,15 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -9178,9 +9275,9 @@ ssri@^8.0.0, ssri@^8.0.1: minipass "^3.1.1" stack-utils@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.4.tgz#4b600971dcfc6aed0cbdf2a8268177cc916c87c8" - integrity sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w== + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== dependencies: escape-string-regexp "^2.0.0" @@ -9222,9 +9319,9 @@ string-argv@0.3.1: integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== string-length@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" - integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== + version "4.0.2" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== dependencies: char-regex "^1.0.2" strip-ansi "^6.0.0" @@ -9412,9 +9509,9 @@ supports-color@^7.0.0, supports-color@^7.1.0: has-flag "^4.0.0" supports-hyperlinks@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" - integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== dependencies: has-flag "^4.0.0" supports-color "^7.0.0" @@ -9440,14 +9537,16 @@ table-layout@^1.0.1: wordwrapjs "^4.0.0" table@^6.0.4: - version "6.0.7" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.7.tgz#e45897ffbcc1bcf9e8a87bf420f2c9e5a7a52a34" - integrity sha512-rxZevLGTUzWna/qBLObOe16kB2RTnnbhciwgPbMMlazz1yZGVEgnZK762xyVdVznhqxrfCeBMmMkgOOaPwjH7g== + version "6.7.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.7.0.tgz#26274751f0ee099c547f6cb91d3eff0d61d155b2" + integrity sha512-SAM+5p6V99gYiiy2gT5ArdzgM1dLDed0nkrWmG6Fry/bUS/m9x83BwpJUOf1Qj/x2qJd+thL6IkIx7qPGRxqBw== dependencies: - ajv "^7.0.2" - lodash "^4.17.20" + ajv "^8.0.1" + lodash.clonedeep "^4.5.0" + lodash.truncate "^4.4.2" slice-ansi "^4.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" tapable@^2.0.0-beta.2: version "2.2.0" @@ -9536,9 +9635,9 @@ terminal-link@^2.0.0, terminal-link@^2.1.1: supports-hyperlinks "^2.0.0" terser@^5.0.0: - version "5.6.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.6.0.tgz#138cdf21c5e3100b1b3ddfddf720962f88badcd2" - integrity sha512-vyqLMoqadC1uR0vywqOZzriDYzgEkNJFK4q9GeyOBHIbiECHiWLKcWfbQWAUaPfxkjDhapSlZB9f7fkMrvkVjA== + version "5.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.7.0.tgz#a761eeec206bc87b605ab13029876ead938ae693" + integrity sha512-HP5/9hp2UaZt5fYkuhNBR8YyRcT8juw8+uFbAme53iN9hblvKnLUTKkmwJG6ocWpIKf8UK4DoeWG4ty0J6S6/g== dependencies: commander "^2.20.0" source-map "~0.7.2" @@ -9729,7 +9828,7 @@ tslib@1.10.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== -tslib@2.1.0, tslib@^2: +tslib@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== @@ -9739,6 +9838,11 @@ tslib@^1.14.1, tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== +tslib@^2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== + tsutils@^3.17.1: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -9777,11 +9881,6 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" - integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== - type-fest@^0.18.0: version "0.18.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" @@ -9792,7 +9891,7 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^0.21.1: +type-fest@^0.21.1, type-fest@^0.21.3: version "0.21.3" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== @@ -9830,9 +9929,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript-memoize@^1.0.0-alpha.3: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.0.0.tgz#ad3b0e7e5a411ca234be123f913a2a31302b7eb6" - integrity sha512-B1eufjs/mGzHqoGeI1VT/dnSBoZr2v3i3/Wm8NmdxlZflyVdleE8wO0QwUuj4NfundD7T5nU3I7HSKp/5BD9og== + version "1.0.1" + resolved "https://registry.yarnpkg.com/typescript-memoize/-/typescript-memoize-1.0.1.tgz#0a8199aa28f6fe18517f6e9308ef7bfbe9a98d59" + integrity sha512-oJNge1qUrOK37d5Y6Ly2txKeuelYVsFtNF6U9kXIN7juudcQaHJQg2MxLOy0CqtkW65rVDYuTCOjnSIVPd8z3w== typescript@^4.2.3: version "4.2.4" @@ -9850,9 +9949,9 @@ typical@^5.2.0: integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg== uglify-js@^3.1.4: - version "3.13.1" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.1.tgz#2749d4b8b5b7d67460b4a418023ff73c3fefa60a" - integrity sha512-EWhx3fHy3M9JbaeTnO+rEqzCe1wtyQClv6q3YWq0voOj4E+bMZBErVS1GAHPDiRGONYq34M1/d8KuQMgvi6Gjw== + version "3.13.6" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.6.tgz#6815ac7fdd155d03c83e2362bb717e5b39b74013" + integrity sha512-rRprLwl8RVaS+Qvx3Wh5hPfPBn9++G6xkGlUupya0s5aDmNjI7z3lnRLB3u7sN4OmbB0pWgzhM9BEJyiWAwtAA== uid-number@0.0.6: version "0.0.6" @@ -9865,14 +9964,14 @@ umask@^1.1.0: integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= unbox-primitive@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.0.tgz#eeacbc4affa28e9b3d36b5eaeccc50b3251b1d3f" - integrity sha512-P/51NX+JXyxK/aigg1/ZgyccdAxm5K1+n8+tvqSntjOivPt19gvm1VC49RWYetsiub8WViUchdxl/KWHHB0kzA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== dependencies: function-bind "^1.1.1" - has-bigints "^1.0.0" - has-symbols "^1.0.0" - which-boxed-primitive "^1.0.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" unbzip2-stream@^1.3.3: version "1.4.3" @@ -9985,7 +10084,7 @@ uuid@^3.3.2: resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== -uuid@^8.0.0, uuid@^8.3.0: +uuid@^8.0.0, uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -9996,9 +10095,9 @@ v8-compile-cache@^2.0.3: integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== v8-to-istanbul@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.0.tgz#5b95cef45c0f83217ec79f8fc7ee1c8b486aee07" - integrity sha512-uXUVqNUCLa0AH1vuVxzi+MI4RfxEOKt9pBgKwHbgH7st8Kv2P1m+jvWNnektzBh5QShF3ODgKmUFCf38LnVz1g== + version "7.1.2" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.2.tgz#30898d1a7fa0c84d225a2c1434fb958f290883c1" + integrity sha512-TxNb7YEUwkLXCQYeudi6lgQ/SZrzNO4kMdlqVxaZPUIUjCv6iSSypUQX70kNBSERpQ8fk48+d61FXk+tgqcWow== dependencies: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" @@ -10103,7 +10202,16 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^8.0.0, whatwg-url@^8.4.0: +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3" + integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg== + dependencies: + lodash "^4.7.0" + tr46 "^2.0.2" + webidl-conversions "^6.1.0" + +whatwg-url@^8.4.0: version "8.4.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" integrity sha512-vwTUFf6V4zhcPkWp/4CQPr1TW9Ml6SF4lVyaIMBdJw5i6qUUJ1QWM4Z6YYVkfka0OUIzVo/0aNtGVGk256IKWw== @@ -10112,7 +10220,7 @@ whatwg-url@^8.0.0, whatwg-url@^8.4.0: tr46 "^2.0.2" webidl-conversions "^6.1.0" -which-boxed-primitive@^1.0.1: +which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== @@ -10252,9 +10360,9 @@ write-pkg@^4.0.0: write-json-file "^3.2.0" ws@^7.2.3, ws@^7.4.4: - version "7.4.4" - resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.4.tgz#383bc9742cb202292c9077ceab6f6047b17f2d59" - integrity sha512-Qm8k8ojNQIMx7S+Zp8u/uHOx7Qazv3Yv4q68MiWWWOJhiwG5W3x7iqmRtJo8xxrciZUY4vRxUTJCKuRnF28ZZw== + version "7.4.5" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1" + integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g== xcase@^2.0.1: version "2.0.1" @@ -10302,9 +10410,9 @@ xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: version "5.0.5"