Create and move plugin APIs to api/ folder Change-Id: If754f948d6a1595637a1b4a315dae17503e50a0f
diff --git a/polygerrit-ui/app/api/admin.ts b/polygerrit-ui/app/api/admin.ts new file mode 100644 index 0000000..a7b549d --- /dev/null +++ b/polygerrit-ui/app/api/admin.ts
@@ -0,0 +1,29 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** Interface for menu link */ +export interface MenuLink { + text: string; + url: string; + capability: string | null; +} + +export interface AdminPluginApi { + addMenuLink(text: string, url: string, capability?: string): void; + + getMenuLinks(): MenuLink[]; +}
diff --git a/polygerrit-ui/app/api/annotation.ts b/polygerrit-ui/app/api/annotation.ts new file mode 100644 index 0000000..1c10390 --- /dev/null +++ b/polygerrit-ui/app/api/annotation.ts
@@ -0,0 +1,126 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import {CoverageRange, Side} from './diff'; +import {StyleObject} from './styles'; +import {ChangeInfo, NumericChangeId} from '../types/common'; + +export type AddLayerFunc = (ctx: AnnotationContext) => void; + +export type NotifyFunc = ( + path: string, + start: number, + end: number, + side: Side +) => void; + +export type CoverageProvider = ( + changeNum: NumericChangeId, + path: string, + basePatchNum?: number, + patchNum?: number, + change?: ChangeInfo +) => Promise<Array<CoverageRange>>; + +export interface AnnotationContext { + /** + * Method to add annotations to a content line. + * + * @param offset The char offset where the update starts. + * @param length The number of chars that the update covers. + * @param styleObject The style object for the range. + * @param side The side of the update. ('left' or 'right') + */ + annotateRange( + offset: number, + length: number, + styleObject: StyleObject, + side: string + ): void; + + /** + * Method to add a CSS class to the line number TD element. + * + * @param styleObject The style object for the range. + * @param side The side of the update. ('left' or 'right') + */ + annotateLineNumber(styleObject: StyleObject, side: string): void; +} + +export interface AnnotationPluginApi { + /** + * Register a function to call to apply annotations. Plugins should use + * GrAnnotationActionsContext.annotateRange and + * GrAnnotationActionsContext.annotateLineNumber to apply a CSS class to the + * line content or the line number. + * + * @param addLayerFunc The function + * that will be called when the AnnotationLayer is ready to annotate. + */ + addLayer(addLayerFunc: AddLayerFunc): AnnotationPluginApi; + + /** + * The specified function will be called with a notify function for the plugin + * to call when it has all required data for annotation. Optional. + * + * @param notifyFunc See doc of the notify function below to see what it does. + */ + addNotifier(notifyFunc: (n: NotifyFunc) => void): AnnotationPluginApi; + + /** + * The specified function will be called when a gr-diff component is built, + * and feeds the returned coverage data into the diff. Optional. + * + * Be sure to call this only once and only from one plugin. Multiple coverage + * providers are not supported. A second call will just overwrite the + * provider of the first call. + */ + setCoverageProvider(coverageProvider: CoverageProvider): AnnotationPluginApi; + + /** + * Returns a checkbox HTMLElement that can be used to toggle annotations + * on/off. The checkbox will be initially disabled. Plugins should enable it + * when data is ready and should add a click handler to toggle CSS on/off. + * + * Note1: Calling this method from multiple plugins will only work for the + * 1st call. It will print an error message for all subsequent calls + * and will not invoke their onAttached functions. + * Note2: This method will be deprecated and eventually removed when + * https://bugs.chromium.org/p/gerrit/issues/detail?id=8077 is + * implemented. + * + * @param checkboxLabel Will be used as the label for the checkbox. + * Optional. "Enable" is used if this is not specified. + * @param onAttached The function that will be called + * when the checkbox is attached to the page. + */ + enableToggleCheckbox( + checkboxLabel: string, + onAttached: (checkboxEl: Element | null) => void + ): AnnotationPluginApi; + + /** + * The notify function will call the listeners of all required annotation + * layers. Intended to be called by the plugin when all required data for + * annotation is available. + * + * @param path The file path whose listeners should be notified. + * @param start The line where the update starts. + * @param end The line where the update ends. + * @param side The side of the update ('left' or 'right'). + */ + notify(path: string, start: number, end: number, side: Side): void; +}
diff --git a/polygerrit-ui/app/api/attribute-helper.ts b/polygerrit-ui/app/api/attribute-helper.ts new file mode 100644 index 0000000..cd52259 --- /dev/null +++ b/polygerrit-ui/app/api/attribute-helper.ts
@@ -0,0 +1,39 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface AttributeHelperPluginApi { + /** + * Binds callback to property updates. + * + * @param name Property name. + * @return Unbind function. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + bind(name: string, callback: (value: any) => void): () => any; + + /** + * Get value of the property from wrapped object. Waits for the property + * to be initialized if it isn't defined. + */ + get(name: string): Promise<unknown>; + + /** + * Sets value and dispatches event to force notify. + */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any + set(name: string, value: any): void; +}
diff --git a/polygerrit-ui/app/api/change-actions.ts b/polygerrit-ui/app/api/change-actions.ts new file mode 100644 index 0000000..74ca34a --- /dev/null +++ b/polygerrit-ui/app/api/change-actions.ts
@@ -0,0 +1,106 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import {ActionInfo} from '../types/common'; + +export enum ActionType { + CHANGE = 'change', + REVISION = 'revision', +} + +export enum ActionPriority { + CHANGE = 2, + DEFAULT = 0, + PRIMARY = 3, + REVIEW = -3, + REVISION = 1, +} + +export enum ChangeActions { + ABANDON = 'abandon', + DELETE = '/', + DELETE_EDIT = 'deleteEdit', + EDIT = 'edit', + FOLLOW_UP = 'followup', + IGNORE = 'ignore', + MOVE = 'move', + PRIVATE = 'private', + PRIVATE_DELETE = 'private.delete', + PUBLISH_EDIT = 'publishEdit', + REBASE = 'rebase', + REBASE_EDIT = 'rebaseEdit', + READY = 'ready', + RESTORE = 'restore', + REVERT = 'revert', + REVERT_SUBMISSION = 'revert_submission', + REVIEWED = 'reviewed', + STOP_EDIT = 'stopEdit', + SUBMIT = 'submit', + UNIGNORE = 'unignore', + UNREVIEWED = 'unreviewed', + WIP = 'wip', +} + +export enum RevisionActions { + CHERRYPICK = 'cherrypick', + REBASE = 'rebase', + SUBMIT = 'submit', + DOWNLOAD = 'download', +} + +export type PrimaryActionKey = ChangeActions | RevisionActions; + +export interface ChangeActionsPluginApi { + addPrimaryActionKey(key: PrimaryActionKey): void; + + removePrimaryActionKey(key: string): void; + + hideQuickApproveAction(): void; + + setActionOverflow(type: ActionType, key: string, overflow: boolean): void; + + setActionPriority( + type: ActionType, + key: string, + priority: ActionPriority + ): void; + + setActionHidden(type: ActionType, key: string, hidden: boolean): void; + + add(type: ActionType, label: string): string; + + remove(key: string): void; + + addTapListener( + key: string, + handler: EventListenerOrEventListenerObject + ): void; + + removeTapListener( + key: string, + handler: EventListenerOrEventListenerObject + ): void; + + setLabel(key: string, text: string): void; + + setTitle(key: string, text: string): void; + + setEnabled(key: string, enabled: boolean): void; + + setIcon(key: string, icon: string): void; + + getActionDetails(action: string): ActionInfo | undefined; +}
diff --git a/polygerrit-ui/app/api/change-metadata.ts b/polygerrit-ui/app/api/change-metadata.ts new file mode 100644 index 0000000..effe661 --- /dev/null +++ b/polygerrit-ui/app/api/change-metadata.ts
@@ -0,0 +1,20 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface ChangeMetadataPluginApi { + onLabelsChanged(callback: (value: unknown) => void): ChangeMetadataPluginApi; +}
diff --git a/polygerrit-ui/app/api/change-reply.ts b/polygerrit-ui/app/api/change-reply.ts new file mode 100644 index 0000000..37c96ee --- /dev/null +++ b/polygerrit-ui/app/api/change-reply.ts
@@ -0,0 +1,39 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export interface LabelsChangedDetail { + name: string; + value: string; +} +export interface ValueChangedDetail { + value: string; +} +export type ReplyChangedCallback = (text: string) => void; +export type LabelsChangedCallback = (detail: LabelsChangedDetail) => void; + +export interface ChangeReplyPluginApi { + getLabelValue(label: string): string; + + setLabelValue(label: string, value: string): void; + + send(includeComments?: boolean): void; + + addReplyTextChangedCallback(handler: ReplyChangedCallback): void; + + addLabelValuesChangedCallback(handler: LabelsChangedCallback): void; + + showMessage(message: string): void; +}
diff --git a/polygerrit-ui/app/api/checks.ts b/polygerrit-ui/app/api/checks.ts index 87d7a2a..143fbd1 100644 --- a/polygerrit-ui/app/api/checks.ts +++ b/polygerrit-ui/app/api/checks.ts
@@ -20,7 +20,7 @@ // Changes to all type and interfaces are expected. // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -export interface GrChecksApiInterface { +export interface ChecksPluginApi { /** * Must only be called once. You cannot register twice. You cannot unregister. */
diff --git a/polygerrit-ui/app/api/event-helper.ts b/polygerrit-ui/app/api/event-helper.ts new file mode 100644 index 0000000..c4a559b --- /dev/null +++ b/polygerrit-ui/app/api/event-helper.ts
@@ -0,0 +1,49 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export type UnsubscribeCallback = () => void; + +export interface EventHelperPluginApi { + /** + * Add a callback to arbitrary event. + * The callback may return false to prevent event bubbling. + */ + on(event: string, callback: (event: Event) => boolean): UnsubscribeCallback; + + /** + * Alias for @see onClick + */ + onTap(callback: (event: Event) => boolean): UnsubscribeCallback; + + /** + * Add a callback to element click or touch. + * The callback may return false to prevent event bubbling. + */ + onClick(callback: (event: Event) => boolean): UnsubscribeCallback; + + /** + * Alias for @see captureClick + */ + captureTap(callback: (event: Event) => boolean): UnsubscribeCallback; + + /** + * Add a callback to element click or touch ahead of normal flow. + * Callback is installed on parent during capture phase. + * https://www.w3.org/TR/DOM-Level-3-Events/#event-flow + * The callback may return false to cancel regular event listeners. + */ + captureClick(callback: (event: Event) => boolean): UnsubscribeCallback; +}
diff --git a/polygerrit-ui/app/api/hook.ts b/polygerrit-ui/app/api/hook.ts new file mode 100644 index 0000000..ee984d5 --- /dev/null +++ b/polygerrit-ui/app/api/hook.ts
@@ -0,0 +1,49 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import {ConfigInfo} from '../types/common'; + +interface GerritElementExtensions { + content?: HTMLElement & {hidden?: boolean}; + change?: unknown; + revision?: unknown; + token?: string; + repoName?: string; + config?: ConfigInfo; +} + +export type HookCallback = (el: HTMLElement & GerritElementExtensions) => void; + +export interface RegisterOptions { + slot?: string; + replace: unknown; +} + +export interface HookApi { + onAttached(callback: HookCallback): HookApi; + + onDetached(callback: HookCallback): HookApi; + + getAllAttached(): HTMLElement[]; + + getLastAttached(): Promise<HTMLElement>; + + getModuleName(): string; + + handleInstanceDetached(instance: HTMLElement): void; + + handleInstanceAttached(instance: HTMLElement): void; +}
diff --git a/polygerrit-ui/app/api/plugin.ts b/polygerrit-ui/app/api/plugin.ts new file mode 100644 index 0000000..0564b75 --- /dev/null +++ b/polygerrit-ui/app/api/plugin.ts
@@ -0,0 +1,95 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import {ServerInfo} from '../types/common'; + +import {AdminPluginApi} from './admin'; +import {AnnotationPluginApi} from './annotation'; +import {AttributeHelperPluginApi} from './attribute-helper'; +import {ChangeMetadataPluginApi} from './change-metadata'; +import {ChangeReplyPluginApi} from './change-reply'; +import {ChecksPluginApi} from './checks'; +import {EventHelperPluginApi} from './event-helper'; +import {PopupPluginApi} from './popup'; +import {RepoPluginApi} from './repo'; +import {ReportingPluginApi} from './reporting'; +import {SettingsPluginApi} from './settings'; +import {StylesPluginApi} from './styles'; +import {ThemePluginApi} from './theme'; +import {ChangeActionsPluginApi} from './change-actions'; +import {RestPluginApi} from './rest'; +import {HookApi, RegisterOptions} from './hook'; + +export enum TargetElement { + CHANGE_ACTIONS = 'changeactions', + REPLY_DIALOG = 'replydialog', +} + +// Note: for new events, naming convention should be: `a-b` +export enum EventType { + HISTORY = 'history', + LABEL_CHANGE = 'labelchange', + SHOW_CHANGE = 'showchange', + SUBMIT_CHANGE = 'submitchange', + SHOW_REVISION_ACTIONS = 'show-revision-actions', + COMMIT_MSG_EDIT = 'commitmsgedit', + COMMENT = 'comment', + REVERT = 'revert', + REVERT_SUBMISSION = 'revert_submission', + POST_REVERT = 'postrevert', + ANNOTATE_DIFF = 'annotatediff', + ADMIN_MENU_LINKS = 'admin-menu-links', + HIGHLIGHTJS_LOADED = 'highlightjs-loaded', +} + +export interface PluginApi { + _url?: URL; + admin(): AdminPluginApi; + annotationApi(): AnnotationPluginApi; + attributeHelper(element: Element): AttributeHelperPluginApi; + changeActions(): ChangeActionsPluginApi; + changeMetadata(): ChangeMetadataPluginApi; + changeReply(): ChangeReplyPluginApi; + checks(): ChecksPluginApi; + eventHelper(element: Node): EventHelperPluginApi; + getPluginName(): string; + getServerInfo(): Promise<ServerInfo | undefined>; + hook(endpointName: string, opt_options?: RegisterOptions): HookApi; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + on(eventName: EventType, target: any): void; + popup(): Promise<PopupPluginApi>; + popup(moduleName: string): Promise<PopupPluginApi>; + popup(moduleName?: string): Promise<PopupPluginApi | null>; + project(): RepoPluginApi; + registerCustomComponent( + endpointName: string, + moduleName?: string, + options?: RegisterOptions + ): HookApi; + registerDynamicCustomComponent( + endpointName: string, + moduleName?: string, + options?: RegisterOptions + ): HookApi; + registerStyleModule(endpoint: string, moduleName: string): void; + reporting(): ReportingPluginApi; + restApi(): RestPluginApi; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + screen(screenName: string, moduleName?: string): any; + settings(): SettingsPluginApi; + styles(): StylesPluginApi; + theme(): ThemePluginApi; +}
diff --git a/polygerrit-ui/app/api/popup.ts b/polygerrit-ui/app/api/popup.ts new file mode 100644 index 0000000..60772cc --- /dev/null +++ b/polygerrit-ui/app/api/popup.ts
@@ -0,0 +1,30 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface PopupPluginApi { + /** + * Opens the popup, inserts it into DOM over current UI. + * Creates the popup if not previously created. Creates popup content element, + * if it was provided with constructor. + */ + open(): Promise<PopupPluginApi>; + + /** + * Hides the popup. + */ + close(): void; +}
diff --git a/polygerrit-ui/app/api/repo.ts b/polygerrit-ui/app/api/repo.ts new file mode 100644 index 0000000..eda9f7d --- /dev/null +++ b/polygerrit-ui/app/api/repo.ts
@@ -0,0 +1,28 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import {ConfigInfo} from '../types/common'; + +export type RepoCommandCallback = ( + repo?: string, + config?: ConfigInfo +) => boolean; + +export interface RepoPluginApi { + createCommand(title: string, callback: RepoCommandCallback): RepoPluginApi; + + onTap(callback: (event: Event) => boolean): RepoPluginApi; +}
diff --git a/polygerrit-ui/app/api/reporting.ts b/polygerrit-ui/app/api/reporting.ts new file mode 100644 index 0000000..65bdc3f --- /dev/null +++ b/polygerrit-ui/app/api/reporting.ts
@@ -0,0 +1,25 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type EventDetails = any; + +export interface ReportingPluginApi { + reportInteraction(eventName: string, details?: EventDetails): void; + + reportLifeCycle(eventName: string, details?: EventDetails): void; +}
diff --git a/polygerrit-ui/app/api/rest.ts b/polygerrit-ui/app/api/rest.ts new file mode 100644 index 0000000..01d966d --- /dev/null +++ b/polygerrit-ui/app/api/rest.ts
@@ -0,0 +1,113 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import {HttpMethod} from '../constants/constants'; +import { + AccountCapabilityInfo, + AccountDetailInfo, + ParsedJSON, + ProjectInfoWithName, + RequestPayload, + ServerInfo, +} from '../types/common'; + +export type ErrorCallback = (response?: Response | null, err?: Error) => void; + +export interface RestPluginApi { + getLoggedIn(): Promise<boolean>; + + getVersion(): Promise<string | undefined>; + + getConfig(): Promise<ServerInfo | undefined>; + + invalidateReposCache(): void; + + getAccount(): Promise<AccountDetailInfo | undefined>; + + getAccountCapabilities( + capabilities: string[] + ): Promise<AccountCapabilityInfo | undefined>; + + getRepos( + filter: string, + reposPerPage: number, + offset?: number + ): Promise<ProjectInfoWithName[] | undefined>; + + fetch( + method: HttpMethod, + url: string, + payload?: RequestPayload, + errFn?: undefined, + contentType?: string + ): Promise<Response>; + + fetch( + method: HttpMethod, + url: string, + payload: RequestPayload | undefined, + errFn: ErrorCallback, + contentType?: string + ): Promise<Response | void>; + + fetch( + method: HttpMethod, + url: string, + payload: RequestPayload | undefined, + errFn?: ErrorCallback, + contentType?: string + ): Promise<Response | void>; + + /** + * Fetch and return native browser REST API Response. + */ + fetch( + method: HttpMethod, + url: string, + payload?: RequestPayload, + errFn?: ErrorCallback, + contentType?: string + ): Promise<Response | void>; + + /** + * Fetch and parse REST API response, if request succeeds. + */ + send( + method: HttpMethod, + url: string, + payload?: RequestPayload, + errFn?: ErrorCallback, + contentType?: string + ): Promise<ParsedJSON>; + + get(url: string): Promise<ParsedJSON>; + + post( + url: string, + payload?: RequestPayload, + errFn?: ErrorCallback, + contentType?: string + ): Promise<ParsedJSON>; + + put( + url: string, + payload?: RequestPayload, + errFn?: ErrorCallback, + contentType?: string + ): Promise<ParsedJSON>; + + delete(url: string): Promise<Response>; +}
diff --git a/polygerrit-ui/app/api/settings.ts b/polygerrit-ui/app/api/settings.ts new file mode 100644 index 0000000..03cf474 --- /dev/null +++ b/polygerrit-ui/app/api/settings.ts
@@ -0,0 +1,27 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import {HookApi} from './hook'; + +export interface SettingsPluginApi { + title(newTitle: string): SettingsPluginApi; + + token(newToken: string): SettingsPluginApi; + + module(newModuleName: string): SettingsPluginApi; + + build(): HookApi; +}
diff --git a/polygerrit-ui/app/api/styles.ts b/polygerrit-ui/app/api/styles.ts new file mode 100644 index 0000000..233c3e2 --- /dev/null +++ b/polygerrit-ui/app/api/styles.ts
@@ -0,0 +1,35 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface StyleObject { + /** + * Creates a new unique CSS class and injects it in a root node of the element + * if it hasn't been added yet. A root node is an document or is the + * associated shadowRoot. This class can be added to any element with the same + * root node. + */ + getClassName(element: Element): string; + + /** + * Apply shared style to the element. + */ + apply(element: Element): void; +} + +export interface StylesPluginApi { + css(ruleStr: string): StyleObject; +}
diff --git a/polygerrit-ui/app/api/theme.ts b/polygerrit-ui/app/api/theme.ts new file mode 100644 index 0000000..70ffcb3 --- /dev/null +++ b/polygerrit-ui/app/api/theme.ts
@@ -0,0 +1,20 @@ +/** + * @license + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface ThemePluginApi { + setHeaderLogoAndTitle(logoUrl: string, title: string): void; +}
diff --git a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.ts b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.ts index 3aeea3b..bc4750f 100644 --- a/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.ts +++ b/polygerrit-ui/app/elements/admin/gr-group-audit-log/gr-group-audit-log.ts
@@ -26,7 +26,6 @@ import {ListViewMixin} from '../../../mixins/gr-list-view-mixin/gr-list-view-mixin'; import {GerritNav} from '../../core/gr-navigation/gr-navigation'; import {customElement, property} from '@polymer/decorators'; -import {ErrorCallback} from '../../../services/gr-rest-api/gr-rest-api'; import { GroupInfo, AccountInfo, @@ -35,6 +34,7 @@ } from '../../../types/common'; import {firePageError, fireTitleChange} from '../../../utils/event-util'; import {appContext} from '../../../services/app-context'; +import {ErrorCallback} from '../../../api/rest'; const GROUP_EVENTS = ['ADD_GROUP', 'REMOVE_GROUP'];
diff --git a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.ts b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.ts index f5602a3..451139c 100644 --- a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.ts +++ b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.ts
@@ -30,7 +30,6 @@ import {htmlTemplate} from './gr-group-members_html'; import {getBaseUrl} from '../../../utils/url-util'; import {customElement, property} from '@polymer/decorators'; -import {ErrorCallback} from '../../../services/gr-rest-api/gr-rest-api'; import {GrOverlay} from '../../shared/gr-overlay/gr-overlay'; import { GroupId, @@ -50,6 +49,7 @@ fireTitleChange, } from '../../../utils/event-util'; import {appContext} from '../../../services/app-context'; +import {ErrorCallback} from '../../../api/rest'; const SUGGESTIONS_LIMIT = 15; const SAVING_ERROR_TEXT =
diff --git a/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts b/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts index 058f86b..6f00445 100644 --- a/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts +++ b/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
@@ -32,13 +32,13 @@ AutocompleteQuery, } from '../../shared/gr-autocomplete/gr-autocomplete'; import {GroupId, GroupInfo, GroupName} from '../../../types/common'; -import {ErrorCallback} from '../../../services/gr-rest-api/gr-rest-api'; import { fireEvent, firePageError, fireTitleChange, } from '../../../utils/event-util'; import {appContext} from '../../../services/app-context'; +import {ErrorCallback} from '../../../api/rest'; const INTERNAL_GROUP_REGEX = /^[\da-f]{40}$/;
diff --git a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.ts b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.ts index ceb08b6..fc1ceee 100644 --- a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.ts +++ b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.ts
@@ -26,11 +26,11 @@ ListViewParams, } from '../../../mixins/gr-list-view-mixin/gr-list-view-mixin'; import {customElement, property} from '@polymer/decorators'; -import {ErrorCallback} from '../../../services/gr-rest-api/gr-rest-api'; import {PluginInfo} from '../../../types/common'; import {firePageError} from '../../../utils/event-util'; import {fireTitleChange} from '../../../utils/event-util'; import {appContext} from '../../../services/app-context'; +import {ErrorCallback} from '../../../api/rest'; interface PluginInfoWithName extends PluginInfo { name: string;
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.ts b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.ts index 9bc0466..14cf234 100644 --- a/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.ts +++ b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.ts
@@ -29,7 +29,6 @@ import {htmlTemplate} from './gr-repo-commands_html'; import {GerritNav} from '../../core/gr-navigation/gr-navigation'; import {customElement, property} from '@polymer/decorators'; -import {ErrorCallback} from '../../../services/gr-rest-api/gr-rest-api'; import { BranchName, ConfigInfo, @@ -44,6 +43,7 @@ fireTitleChange, } from '../../../utils/event-util'; import {appContext} from '../../../services/app-context'; +import {ErrorCallback} from '../../../api/rest'; const GC_MESSAGE = 'Garbage collection completed successfully.'; const CONFIG_BRANCH = 'refs/meta/config' as BranchName;
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.ts b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.ts index b30d1f4..5f6cd29 100644 --- a/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.ts +++ b/polygerrit-ui/app/elements/admin/gr-repo-dashboards/gr-repo-dashboards.ts
@@ -24,9 +24,9 @@ import {GerritNav} from '../../core/gr-navigation/gr-navigation'; import {customElement, property} from '@polymer/decorators'; import {RepoName, DashboardId, DashboardInfo} from '../../../types/common'; -import {ErrorCallback} from '../../../services/gr-rest-api/gr-rest-api'; import {firePageError} from '../../../utils/event-util'; import {appContext} from '../../../services/app-context'; +import {ErrorCallback} from '../../../api/rest'; interface DashboardRef { section: string;
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.ts b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.ts index 5325dc7..a486e27 100644 --- a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.ts +++ b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.ts
@@ -35,7 +35,6 @@ import {ListViewMixin} from '../../../mixins/gr-list-view-mixin/gr-list-view-mixin'; import {encodeURL} from '../../../utils/url-util'; import {customElement, property} from '@polymer/decorators'; -import {ErrorCallback} from '../../../services/gr-rest-api/gr-rest-api'; import {GrOverlay} from '../../shared/gr-overlay/gr-overlay'; import {GrCreatePointerDialog} from '../gr-create-pointer-dialog/gr-create-pointer-dialog'; import { @@ -51,6 +50,7 @@ import {RepoDetailView} from '../../core/gr-navigation/gr-navigation'; import {firePageError} from '../../../utils/event-util'; import {appContext} from '../../../services/app-context'; +import {ErrorCallback} from '../../../api/rest'; const PGP_START = '-----BEGIN PGP SIGNATURE-----';
diff --git a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts index 3543e3b..bcc6039 100644 --- a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts +++ b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts
@@ -30,7 +30,6 @@ import {htmlTemplate} from './gr-repo_html'; import {GerritNav} from '../../core/gr-navigation/gr-navigation'; import {customElement, property, observe} from '@polymer/decorators'; -import {ErrorCallback} from '../../../services/gr-rest-api/gr-rest-api'; import { ConfigInfo, RepoName, @@ -47,6 +46,7 @@ import {firePageError, fireTitleChange} from '../../../utils/event-util'; import {appContext} from '../../../services/app-context'; import {WebLinkInfo} from '../../../types/diff'; +import {ErrorCallback} from '../../../api/rest'; const STATES = { active: {value: ProjectState.ACTIVE, label: 'Active'},
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts index 903afaa..89ca4ef 100644 --- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts +++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts
@@ -50,17 +50,9 @@ HttpMethod, NotifyType, } from '../../../constants/constants'; -import { - EventType as PluginEventType, - TargetElement, -} from '../../plugins/gr-plugin-types'; +import {EventType as PluginEventType, TargetElement} from '../../../api/plugin'; import {customElement, observe, property} from '@polymer/decorators'; import { - ActionPriority, - ActionType, - ErrorCallback, -} from '../../../services/gr-rest-api/gr-rest-api'; -import { AccountInfo, ActionInfo, ActionNameToActionInfoMap, @@ -102,10 +94,7 @@ import {PolymerDeepPropertyChange} from '@polymer/polymer/interfaces'; import {GrButton} from '../../shared/gr-button/gr-button'; import { - ChangeActions, GrChangeActionsElement, - PrimaryActionKey, - RevisionActions, UIActionInfo, } from '../../shared/gr-js-api-interface/gr-change-actions-js-api'; import {fireAlert} from '../../../utils/event-util'; @@ -116,6 +105,14 @@ } from '../../../utils/label-util'; import {CommentThread} from '../../../utils/comment-util'; import {ShowAlertEventDetail} from '../../../types/events'; +import { + ActionPriority, + ActionType, + ChangeActions, + PrimaryActionKey, + RevisionActions, +} from '../../../api/change-actions'; +import {ErrorCallback} from '../../../api/rest'; const ERR_BRANCH_EMPTY = 'The destination branch can’t be empty.'; const ERR_COMMIT_EMPTY = 'The commit message can’t be empty.';
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts index 11f1050..59287b2 100644 --- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts +++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.ts
@@ -61,7 +61,7 @@ import {RestApiService} from '../../../services/gr-rest-api/gr-rest-api'; import {tap} from '@polymer/iron-test-helpers/mock-interactions'; import {GrEditableLabel} from '../../shared/gr-editable-label/gr-editable-label'; -import {PluginApi} from '../../plugins/gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; import {GrEndpointDecorator} from '../../plugins/gr-endpoint-decorator/gr-endpoint-decorator'; import {stubRestApi} from '../../../test/test-utils.js'; import {ParsedChangeInfo} from '../../../types/types';
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts index 5afcafc..61006f9 100644 --- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts +++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.ts
@@ -78,7 +78,7 @@ PatchSet, } from '../../../utils/patch-set-util'; import {changeStatuses, changeStatusString} from '../../../utils/change-util'; -import {EventType as PluginEventType} from '../../plugins/gr-plugin-types'; +import {EventType as PluginEventType} from '../../../api/plugin'; import {customElement, property, observe} from '@polymer/decorators'; import {GrApplyFixDialog} from '../../diff/gr-apply-fix-dialog/gr-apply-fix-dialog'; import {GrFileListHeader} from '../gr-file-list-header/gr-file-list-header';
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts index b9e925c..99e5356 100644 --- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts +++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view_test.ts
@@ -33,7 +33,7 @@ import {GerritNav} from '../../core/gr-navigation/gr-navigation'; import {getPluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader'; import {_testOnly_initGerritPluginApi} from '../../shared/gr-js-api-interface/gr-gerrit'; -import {EventType, PluginApi} from '../../plugins/gr-plugin-types'; +import {EventType, PluginApi} from '../../../api/plugin'; import 'lodash/lodash'; import {
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.ts b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.ts index e5396c3..95a6af9 100644 --- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.ts +++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.ts
@@ -46,9 +46,8 @@ import {accountKey, removeServiceUsers} from '../../../utils/account-util'; import {getDisplayName} from '../../../utils/display-name-util'; import {IronA11yAnnouncer} from '@polymer/iron-a11y-announcer/iron-a11y-announcer'; -import {TargetElement} from '../../plugins/gr-plugin-types'; +import {TargetElement} from '../../../api/plugin'; import {customElement, observe, property} from '@polymer/decorators'; -import {ErrorCallback} from '../../../services/gr-rest-api/gr-rest-api'; import {FixIronA11yAnnouncer} from '../../../types/types'; import { AccountAddition, @@ -110,6 +109,7 @@ import {isUnresolved} from '../../../utils/comment-util'; import {pluralize} from '../../../utils/string-util'; import {fireAlert, fireEvent, fireServerError} from '../../../utils/event-util'; +import {ErrorCallback} from '../../../api/rest'; const STORAGE_DEBOUNCE_INTERVAL_MS = 400;
diff --git a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.ts b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.ts index e9637af..f6f4395 100644 --- a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.ts +++ b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.ts
@@ -32,7 +32,6 @@ } from '../../core/gr-navigation/gr-navigation'; import {computeTruncatedPath} from '../../../utils/path-list-util'; import {customElement, property} from '@polymer/decorators'; -import {ErrorCallback} from '../../../services/gr-rest-api/gr-rest-api'; import { ChangeInfo, PatchSetNum, @@ -45,6 +44,7 @@ import {HttpMethod, NotifyType} from '../../../constants/constants'; import {fireAlert, fireTitleChange} from '../../../utils/event-util'; import {appContext} from '../../../services/app-context'; +import {ErrorCallback} from '../../../api/rest'; const RESTORED_MESSAGE = 'Content restored from a previous edit.'; const SAVING_MESSAGE = 'Saving changes...';
diff --git a/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api.ts b/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api.ts index 1332118..897be67 100644 --- a/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api.ts +++ b/polygerrit-ui/app/elements/plugins/gr-admin-api/gr-admin-api.ts
@@ -14,27 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import {PluginApi} from '../gr-plugin-types'; - -/** Interface for menu link */ -export interface MenuLink { - text: string; - url: string; - capability: string | null; -} +import {EventType, PluginApi} from '../../../api/plugin'; +import {AdminPluginApi, MenuLink} from '../../../api/admin'; /** * GrAdminApi class. * * Defines common methods to register / retrieve menu links. */ -export class GrAdminApi { +export class GrAdminApi implements AdminPluginApi { // TODO(TS): maybe define as enum if its a limited set private menuLinks: MenuLink[] = []; constructor(private readonly plugin: PluginApi) { - this.plugin.on('admin-menu-links', this); + this.plugin.on(EventType.ADMIN_MENU_LINKS, this); } addMenuLink(text: string, url: string, capability?: string) {
diff --git a/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.ts b/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.ts index 0641b49..e0b4ee9 100644 --- a/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.ts +++ b/polygerrit-ui/app/elements/plugins/gr-attribute-helper/gr-attribute-helper.ts
@@ -14,8 +14,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import {AttributeHelperPluginApi} from '../../../api/attribute-helper'; -export class GrAttributeHelper { +export class GrAttributeHelper implements AttributeHelperPluginApi { // eslint-disable-next-line @typescript-eslint/no-explicit-any private readonly _promises = new Map<string, Promise<any>>();
diff --git a/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.ts b/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.ts index 322d32e..3a61bce 100644 --- a/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.ts +++ b/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.ts
@@ -14,9 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {HookApi, PluginApi} from '../gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; +import {ChangeMetadataPluginApi} from '../../../api/change-metadata'; +import {HookApi} from '../../../api/hook'; -export class GrChangeMetadataApi { +export class GrChangeMetadataApi implements ChangeMetadataPluginApi { private _hook: HookApi | null; public plugin: PluginApi;
diff --git a/polygerrit-ui/app/elements/plugins/gr-checks-api/gr-checks-api.ts b/polygerrit-ui/app/elements/plugins/gr-checks-api/gr-checks-api.ts index 82c1087..404fc71 100644 --- a/polygerrit-ui/app/elements/plugins/gr-checks-api/gr-checks-api.ts +++ b/polygerrit-ui/app/elements/plugins/gr-checks-api/gr-checks-api.ts
@@ -14,11 +14,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {PluginApi} from '../gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; import { ChecksApiConfig, ChecksProvider, - GrChecksApiInterface, + ChecksPluginApi, } from '../../../api/checks'; import {appContext} from '../../../services/app-context'; @@ -38,7 +38,7 @@ * Plugins normally just call register() once at startup and then wait for * fetch() being called on the provider interface. */ -export class GrChecksApi implements GrChecksApiInterface { +export class GrChecksApi implements ChecksPluginApi { private state = State.NOT_REGISTERED; private readonly checksService = appContext.checksService;
diff --git a/polygerrit-ui/app/elements/plugins/gr-checks-api/gr-checks-api_test.ts b/polygerrit-ui/app/elements/plugins/gr-checks-api/gr-checks-api_test.ts index 45cbb47..3ab3efb 100644 --- a/polygerrit-ui/app/elements/plugins/gr-checks-api/gr-checks-api_test.ts +++ b/polygerrit-ui/app/elements/plugins/gr-checks-api/gr-checks-api_test.ts
@@ -18,13 +18,13 @@ import '../../../test/common-test-setup-karma.js'; import {getPluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader.js'; import {_testOnly_initGerritPluginApi} from '../../shared/gr-js-api-interface/gr-gerrit.js'; -import {GrChecksApi} from './gr-checks-api'; -import {PluginApi} from '../gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; +import {ChecksPluginApi} from '../../../api/checks'; const gerritPluginApi = _testOnly_initGerritPluginApi(); suite('gr-settings-api tests', () => { - let checksApi: GrChecksApi | undefined; + let checksApi: ChecksPluginApi | undefined; setup(() => { let pluginApi: PluginApi | undefined = undefined;
diff --git a/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.ts b/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.ts index dd76be4..d2568ad 100644 --- a/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.ts +++ b/polygerrit-ui/app/elements/plugins/gr-dom-hooks/gr-dom-hooks.ts
@@ -15,7 +15,8 @@ * limitations under the License. */ import {PolymerElement} from '@polymer/polymer/polymer-element'; -import {HookApi, HookCallback, PluginApi} from '../gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; +import {HookApi, HookCallback} from '../../../api/hook'; export class GrDomHooksManager { private _hooks: Record<string, GrDomHook>;
diff --git a/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.ts b/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.ts index 12863fd..423cff9 100644 --- a/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.ts +++ b/polygerrit-ui/app/elements/plugins/gr-endpoint-decorator/gr-endpoint-decorator.ts
@@ -24,7 +24,8 @@ } from '../../shared/gr-js-api-interface/gr-plugin-endpoints'; import {getPluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader'; import {customElement, property} from '@polymer/decorators'; -import {HookApi, PluginApi} from '../gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; +import {HookApi} from '../../../api/hook'; const INIT_PROPERTIES_TIMEOUT_MS = 10000;
diff --git a/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.ts b/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.ts index 5a4d2ae..4b34d56 100644 --- a/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.ts +++ b/polygerrit-ui/app/elements/plugins/gr-event-helper/gr-event-helper.ts
@@ -14,13 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { + EventHelperPluginApi, + UnsubscribeCallback, +} from '../../../api/event-helper'; export interface ListenOptions { event?: string; capture?: boolean; } -export class GrEventHelper { +export class GrEventHelper implements EventHelperPluginApi { constructor(readonly element: HTMLElement) {} /** @@ -50,7 +54,7 @@ * Alias for @see captureClick */ captureTap(callback: (event: Event) => boolean) { - this.captureClick(callback); + return this.captureClick(callback); } /** @@ -68,7 +72,7 @@ container: HTMLElement, callback: (event: Event) => boolean, options?: ListenOptions | null - ) { + ): UnsubscribeCallback { const capture = options?.capture; const event = options?.event || 'click'; const handler = (e: Event) => {
diff --git a/polygerrit-ui/app/elements/plugins/gr-plugin-types.ts b/polygerrit-ui/app/elements/plugins/gr-plugin-types.ts deleted file mode 100644 index 2cd0f78..0000000 --- a/polygerrit-ui/app/elements/plugins/gr-plugin-types.ts +++ /dev/null
@@ -1,105 +0,0 @@ -/** - * @license - * Copyright (C) 2020 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import {GrAttributeHelper} from './gr-attribute-helper/gr-attribute-helper'; -import {GrPluginRestApi} from '../shared/gr-js-api-interface/gr-plugin-rest-api'; -import {GrEventHelper} from './gr-event-helper/gr-event-helper'; -import {GrPopupInterface} from './gr-popup-interface/gr-popup-interface'; -import {ConfigInfo} from '../../types/common'; -import {GrChecksApi} from './gr-checks-api/gr-checks-api'; - -interface GerritElementExtensions { - content?: HTMLElement & {hidden?: boolean}; - change?: unknown; - revision?: unknown; - token?: string; - repoName?: string; - config?: ConfigInfo; -} -export type HookCallback = (el: HTMLElement & GerritElementExtensions) => void; - -export interface HookApi { - onAttached(callback: HookCallback): HookApi; - onDetached(callback: HookCallback): HookApi; - getAllAttached(): HTMLElement[]; - getLastAttached(): Promise<HTMLElement>; - getModuleName(): string; - handleInstanceDetached(instance: HTMLElement): void; - handleInstanceAttached(instance: HTMLElement): void; -} - -export enum TargetElement { - CHANGE_ACTIONS = 'changeactions', - REPLY_DIALOG = 'replydialog', -} - -// Note: for new events, naming convention should be: `a-b` -export enum EventType { - HISTORY = 'history', - LABEL_CHANGE = 'labelchange', - SHOW_CHANGE = 'showchange', - SUBMIT_CHANGE = 'submitchange', - SHOW_REVISION_ACTIONS = 'show-revision-actions', - COMMIT_MSG_EDIT = 'commitmsgedit', - COMMENT = 'comment', - REVERT = 'revert', - REVERT_SUBMISSION = 'revert_submission', - POST_REVERT = 'postrevert', - ANNOTATE_DIFF = 'annotatediff', - ADMIN_MENU_LINKS = 'admin-menu-links', - HIGHLIGHTJS_LOADED = 'highlightjs-loaded', -} - -export interface RegisterOptions { - slot?: string; - replace: unknown; -} - -export interface PanelInfo { - body: Element; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - p: {[key: string]: any}; - onUnload: () => void; -} - -export interface SettingsInfo { - body: Element; - token?: string; - onUnload: () => void; - setTitle: () => void; - setWindowTitle: () => void; - show: () => void; -} - -export interface PluginApi { - _url?: URL; - popup(): Promise<GrPopupInterface>; - popup(moduleName: string): Promise<GrPopupInterface>; - popup(moduleName?: string): Promise<GrPopupInterface | null>; - hook(endpointName: string, opt_options?: RegisterOptions): HookApi; - getPluginName(): string; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - on(eventName: string, target: any): void; - attributeHelper(element: Element): GrAttributeHelper; - checks(): GrChecksApi; - restApi(): GrPluginRestApi; - eventHelper(element: Node): GrEventHelper; - registerDynamicCustomComponent( - endpointName: string, - moduleName?: string, - options?: RegisterOptions - ): HookApi; -}
diff --git a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.ts b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.ts index d45c263..07d11ec 100644 --- a/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.ts +++ b/polygerrit-ui/app/elements/plugins/gr-popup-interface/gr-popup-interface.ts
@@ -17,7 +17,8 @@ import './gr-plugin-popup'; import {dom, flush} from '@polymer/polymer/lib/legacy/polymer.dom'; import {GrPluginPopup} from './gr-plugin-popup'; -import {PluginApi} from '../gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; +import {PopupPluginApi} from '../../../api/popup'; interface CustomPolymerPluginEl extends HTMLElement { plugin: PluginApi; @@ -29,7 +30,7 @@ * opt_moduleName is a name of custom element that will be automatically * inserted on popup opening. */ -export class GrPopupInterface { +export class GrPopupInterface implements PopupPluginApi { private _openingPromise: Promise<GrPopupInterface> | null = null; private _popup: GrPluginPopup | null = null; @@ -50,7 +51,7 @@ * Creates the popup if not previously created. Creates popup content element, * if it was provided with constructor. */ - open(): Promise<GrPopupInterface> { + open(): Promise<PopupPluginApi> { if (!this._openingPromise) { this._openingPromise = this.plugin .hook('plugin-overlay')
diff --git a/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api.ts b/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api.ts index 701a560..e42ca08 100644 --- a/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api.ts +++ b/polygerrit-ui/app/elements/plugins/gr-repo-api/gr-repo-api.ts
@@ -16,9 +16,9 @@ */ import './gr-plugin-repo-command'; import {ConfigInfo} from '../../../types/common'; -import {HookApi, PluginApi} from '../gr-plugin-types'; - -type RepoCommandCallback = (repo?: string, config?: ConfigInfo) => boolean; +import {PluginApi} from '../../../api/plugin'; +import {RepoCommandCallback, RepoPluginApi} from '../../../api/repo'; +import {HookApi} from '../../../api/hook'; /** * Parameters provided on repo-command endpoint @@ -28,7 +28,7 @@ config: ConfigInfo; } -export class GrRepoApi { +export class GrRepoApi implements RepoPluginApi { private _hook?: HookApi; constructor(readonly plugin: PluginApi) {} @@ -45,7 +45,7 @@ createCommand(title: string, callback: RepoCommandCallback) { if (this._hook) { console.warn('Already set up.'); - return this._hook; + return this; } this._hook = this._createHook(title); this._hook.onAttached(element => {
diff --git a/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api.ts b/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api.ts index c7f1ecd..4bdd40e 100644 --- a/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api.ts +++ b/polygerrit-ui/app/elements/plugins/gr-settings-api/gr-settings-api.ts
@@ -16,9 +16,10 @@ */ import '../../settings/gr-settings-view/gr-settings-item'; import '../../settings/gr-settings-view/gr-settings-menu-item'; -import {PluginApi} from '../gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; +import {SettingsPluginApi} from '../../../api/settings'; -export class GrSettingsApi { +export class GrSettingsApi implements SettingsPluginApi { private _token: string; private _title = '(no title)';
diff --git a/polygerrit-ui/app/elements/plugins/gr-styles-api/gr-styles-api.ts b/polygerrit-ui/app/elements/plugins/gr-styles-api/gr-styles-api.ts index 5c57208..a91b8d3 100644 --- a/polygerrit-ui/app/elements/plugins/gr-styles-api/gr-styles-api.ts +++ b/polygerrit-ui/app/elements/plugins/gr-styles-api/gr-styles-api.ts
@@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import {StyleObject, StylesPluginApi} from '../../../api/styles'; /** * @fileoverview We should consider dropping support for this API: @@ -30,7 +31,7 @@ }; } -export class GrStyleObject { +export class GrStyleObject implements StyleObject { private className = ''; constructor(private readonly rulesStr: string) { @@ -66,7 +67,6 @@ /** * Apply shared style to the element. - * */ apply(element: Element) { element.classList.add(this.getClassName(element)); @@ -76,7 +76,7 @@ /** * TODO(TS): move to util */ -export class GrStylesApi { +export class GrStylesApi implements StylesPluginApi { /** * Creates a new GrStyleObject with specified style properties. */
diff --git a/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.ts b/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.ts index 821e4bf..894ec6c 100644 --- a/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.ts +++ b/polygerrit-ui/app/elements/plugins/gr-theme-api/gr-theme-api.ts
@@ -16,12 +16,13 @@ */ import './gr-custom-plugin-header'; import {GrCustomPluginHeader} from './gr-custom-plugin-header'; -import {PluginApi} from '../gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; +import {ThemePluginApi} from '../../../api/theme'; /** * Defines api for theme, can be used to set header logo and title. */ -export class GrThemeApi { +export class GrThemeApi implements ThemePluginApi { constructor(private readonly plugin: PluginApi) {} setHeaderLogoAndTitle(logoUrl: string, title: string) {
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-context.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-context.ts index a493e51..6a4da7b 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-context.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-context.ts
@@ -19,6 +19,7 @@ import {GrStyleObject} from '../../plugins/gr-styles-api/gr-styles-api'; import {GrDiffLine} from '../../diff/gr-diff/gr-diff-line'; import {appContext} from '../../../services/app-context'; +import {AnnotationContext} from '../../../api/annotation'; /** * Used to create a context for GrAnnotationActionsInterface. @@ -32,7 +33,7 @@ * @param changeNum The Gerrit change number. * @param patchNum The Gerrit patch number. */ -export class GrAnnotationActionsContext { +export class GrAnnotationActionsContext implements AnnotationContext { private _contentEl: HTMLElement; private _lineNumberEl: HTMLElement;
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api.ts index f160807..4abc6e1 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-annotation-actions-js-api.ts
@@ -16,34 +16,18 @@ */ import {GrAnnotationActionsContext} from './gr-annotation-actions-context'; import {GrDiffLine} from '../../diff/gr-diff/gr-diff-line'; -import { - CoverageRange, - DiffLayer, - DiffLayerListener, -} from '../../../types/types'; +import {DiffLayer, DiffLayerListener} from '../../../types/types'; import {Side} from '../../../constants/constants'; -import {PluginApi} from '../../plugins/gr-plugin-types'; -import {ChangeInfo, NumericChangeId} from '../../../types/common'; +import {EventType, PluginApi} from '../../../api/plugin'; import {appContext} from '../../../services/app-context'; +import { + AddLayerFunc, + AnnotationPluginApi, + CoverageProvider, + NotifyFunc, +} from '../../../api/annotation'; -type AddLayerFunc = (ctx: GrAnnotationActionsContext) => void; - -type NotifyFunc = ( - path: string, - start: number, - end: number, - side: Side -) => void; - -export type CoverageProvider = ( - changeNum: NumericChangeId, - path: string, - basePatchNum?: number, - patchNum?: number, - change?: ChangeInfo -) => Promise<Array<CoverageRange>>; - -export class GrAnnotationActionsInterface { +export class GrAnnotationActionsInterface implements AnnotationPluginApi { // Collect all annotation layers instantiated by getLayer. Will be used when // notifying their listeners in the notify function. private annotationLayers: AnnotationLayer[] = []; @@ -57,7 +41,7 @@ constructor(private readonly plugin: PluginApi) { // Return this instance when there is an annotatediff event. - plugin.on('annotatediff', this); + plugin.on(EventType.ANNOTATE_DIFF, this); } /**
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api.ts index 9ae2900..2f2b5ce 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-actions-js-api.ts
@@ -14,47 +14,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { - ActionType, - ActionPriority, -} from '../../../services/gr-rest-api/gr-rest-api'; -import {PluginApi, TargetElement} from '../../plugins/gr-plugin-types'; +import {PluginApi, TargetElement} from '../../../api/plugin'; import {ActionInfo, RequireProperties} from '../../../types/common'; import {appContext} from '../../../services/app-context'; - -export enum ChangeActions { - ABANDON = 'abandon', - DELETE = '/', - DELETE_EDIT = 'deleteEdit', - EDIT = 'edit', - FOLLOW_UP = 'followup', - IGNORE = 'ignore', - MOVE = 'move', - PRIVATE = 'private', - PRIVATE_DELETE = 'private.delete', - PUBLISH_EDIT = 'publishEdit', - REBASE = 'rebase', - REBASE_EDIT = 'rebaseEdit', - READY = 'ready', - RESTORE = 'restore', - REVERT = 'revert', - REVERT_SUBMISSION = 'revert_submission', - REVIEWED = 'reviewed', - STOP_EDIT = 'stopEdit', - SUBMIT = 'submit', - UNIGNORE = 'unignore', - UNREVIEWED = 'unreviewed', - WIP = 'wip', -} - -export enum RevisionActions { - CHERRYPICK = 'cherrypick', - REBASE = 'rebase', - SUBMIT = 'submit', - DOWNLOAD = 'download', -} - -export type PrimaryActionKey = ChangeActions | RevisionActions; +import { + ActionPriority, + ActionType, + ChangeActions, + ChangeActionsPluginApi, + PrimaryActionKey, + RevisionActions, +} from '../../../api/change-actions'; export interface UIActionInfo extends RequireProperties<ActionInfo, 'label'> { __key: string; @@ -89,7 +59,7 @@ getActionDetails(actionName: string): ActionInfo | undefined; } -export class GrChangeActionsInterface { +export class GrChangeActionsInterface implements ChangeActionsPluginApi { private _el?: GrChangeActionsElement; RevisionActions = RevisionActions;
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api.ts index 74130af..effebe1 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-change-reply-js-api.ts
@@ -16,25 +16,20 @@ */ import {GrReplyDialog} from '../../../services/gr-rest-api/gr-rest-api'; -import {PluginApi, TargetElement} from '../../plugins/gr-plugin-types'; +import {PluginApi, TargetElement} from '../../../api/plugin'; import {JsApiService} from './gr-js-api-types'; - -// TODO(TS): maybe move interfaces\types to other files when convertion complete -interface LabelsChangedDetail { - name: string; - value: string; -} -interface ValueChangedDetail { - value: string; -} - -type ReplyChangedCallback = (text: string) => void; -type LabelsChangedCallback = (detail: LabelsChangedDetail) => void; +import { + ChangeReplyPluginApi, + LabelsChangedCallback, + LabelsChangedDetail, + ReplyChangedCallback, + ValueChangedDetail, +} from '../../../api/change-reply'; /** * GrChangeReplyInterface, provides a set of handy methods on reply dialog. */ -export class GrChangeReplyInterface { +export class GrChangeReplyInterface implements ChangeReplyPluginApi { constructor( readonly plugin: PluginApi, readonly sharedApiElement: JsApiService @@ -46,7 +41,7 @@ ) as unknown) as GrReplyDialog; } - getLabelValue(label: string) { + getLabelValue(label: string): string { return this._el.getLabelValue(label); } @@ -100,6 +95,6 @@ } showMessage(message: string) { - return this._el.setPluginMessage(message); + this._el.setPluginMessage(message); } }
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit.ts index 32a9238..27bc591 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-gerrit.ts
@@ -26,7 +26,7 @@ } from './gr-plugin-loader'; import {send} from './gr-api-utils'; import {appContext} from '../../../services/app-context'; -import {PluginApi} from '../../plugins/gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; import {HttpMethod} from '../../../constants/constants'; import {RequestPayload} from '../../../types/common'; import {
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface-element.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface-element.ts index 412165d..830fb92 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface-element.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface-element.ts
@@ -23,16 +23,17 @@ RevisionInfo, } from '../../../types/common'; import {GrAnnotationActionsInterface} from './gr-annotation-actions-js-api'; -import {GrAdminApi, MenuLink} from '../../plugins/gr-admin-api/gr-admin-api'; +import {GrAdminApi} from '../../plugins/gr-admin-api/gr-admin-api'; import { JsApiService, EventCallback, ShowChangeDetail, ShowRevisionActionsDetail, } from './gr-js-api-types'; -import {EventType, TargetElement} from '../../plugins/gr-plugin-types'; +import {EventType, TargetElement} from '../../../api/plugin'; import {DiffLayer, HighlightJS, ParsedChangeInfo} from '../../../types/types'; import {appContext} from '../../../services/app-context'; +import {MenuLink} from '../../../api/admin'; const elements: {[key: string]: HTMLElement} = {}; const eventCallbacks: {[key: string]: EventCallback[]} = {};
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.js index 47b6006..6a8a0dd 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.js +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface_test.js
@@ -19,7 +19,7 @@ import './gr-js-api-interface.js'; import {GrPopupInterface} from '../../plugins/gr-popup-interface/gr-popup-interface.js'; import {GrSettingsApi} from '../../plugins/gr-settings-api/gr-settings-api.js'; -import {EventType} from '../../plugins/gr-plugin-types.js'; +import {EventType} from '../../../api/plugin.js'; import {PLUGIN_LOADING_TIMEOUT_MS} from './gr-api-utils.js'; import {getPluginLoader} from './gr-plugin-loader.js'; import {_testOnly_initGerritPluginApi} from './gr-gerrit.js';
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-types.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-types.ts index 37db662..0b28c5e 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-types.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-types.ts
@@ -21,10 +21,10 @@ ReviewInput, RevisionInfo, } from '../../../types/common'; -import {EventType, TargetElement} from '../../plugins/gr-plugin-types'; +import {EventType, TargetElement} from '../../../api/plugin'; import {DiffLayer, ParsedChangeInfo} from '../../../types/types'; import {GrAnnotationActionsInterface} from './gr-annotation-actions-js-api'; -import {MenuLink} from '../../plugins/gr-admin-api/gr-admin-api'; +import {MenuLink} from '../../../api/admin'; export interface ShowChangeDetail { change: ChangeInfo;
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context.ts index d4a2bd6..21e4876 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-action-context.ts
@@ -17,20 +17,18 @@ import {RevisionInfo, ChangeInfo, RequestPayload} from '../../../types/common'; import {ShowAlertEventDetail} from '../../../types/events'; -import {PluginApi} from '../../plugins/gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; import {UIActionInfo} from './gr-change-actions-js-api'; import {windowLocationReload} from '../../../utils/dom-util'; - -interface GrPopupInterface { - close(): void; -} +import {PopupPluginApi} from '../../../api/popup'; +import {GrPopupInterface} from '../../plugins/gr-popup-interface/gr-popup-interface'; interface ButtonCallBacks { onclick: (event: Event) => boolean; } export class GrPluginActionContext { - private _popups: GrPopupInterface[] = []; + private _popups: PopupPluginApi[] = []; constructor( public readonly plugin: PluginApi, @@ -41,7 +39,7 @@ popup(element: Node) { this.plugin.popup().then(popApi => { - const popupEl = popApi._getElement(); + const popupEl = (popApi as GrPopupInterface)._getElement(); if (!popupEl) { throw new Error('Popup element not found'); }
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.ts index da19e5b..2752c74 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-endpoints.ts
@@ -16,8 +16,9 @@ */ import {importHref} from '../../../scripts/import-href'; -import {HookApi, PluginApi} from '../../plugins/gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; import {notUndefined} from '../../../types/types'; +import {HookApi} from '../../../api/hook'; // eslint-disable-next-line @typescript-eslint/no-explicit-any type Callback = (value: any) => void;
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader.ts index aacef0e..8c0fce26 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-loader.ts
@@ -24,7 +24,7 @@ import {Plugin} from './gr-public-js-api'; import {getBaseUrl} from '../../../utils/url-util'; import {getPluginEndpoints} from './gr-plugin-endpoints'; -import {PluginApi} from '../../plugins/gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; import {ReportingService} from '../../../services/gr-reporting/gr-reporting'; import {hasOwnProperty} from '../../../utils/common-util'; import {ShowAlertEventDetail} from '../../../types/events';
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.ts index e640ba1..cd35d4e 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-plugin-rest-api.ts
@@ -14,10 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {ErrorCallback} from '../../../services/gr-rest-api/gr-rest-api'; import {HttpMethod} from '../../../constants/constants'; import {RequestPayload} from '../../../types/common'; import {appContext} from '../../../services/app-context'; +import {ErrorCallback, RestPluginApi} from '../../../api/rest'; async function getErrorMessage(response: Response): Promise<string> { const text = await response.text(); @@ -33,7 +33,7 @@ } } -export class GrPluginRestApi { +export class GrPluginRestApi implements RestPluginApi { private readonly restApi = appContext.restApiService; constructor(private readonly prefix = '') {}
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.ts index f21ddc6..45ffdcd9 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.ts
@@ -32,20 +32,28 @@ import {GrStylesApi} from '../../plugins/gr-styles-api/gr-styles-api'; import {getPluginEndpoints} from './gr-plugin-endpoints'; -import {PRELOADED_PROTOCOL, getPluginNameFromUrl, send} from './gr-api-utils'; +import {getPluginNameFromUrl, PRELOADED_PROTOCOL, send} from './gr-api-utils'; import {GrReportingJsApi} from './gr-reporting-js-api'; -import { - EventType, - HookApi, - PluginApi, - RegisterOptions, - TargetElement, -} from '../../plugins/gr-plugin-types'; +import {EventType, PluginApi, TargetElement} from '../../../api/plugin'; import {RequestPayload} from '../../../types/common'; import {HttpMethod} from '../../../constants/constants'; import {GrChangeActions} from '../../change/gr-change-actions/gr-change-actions'; import {GrChecksApi} from '../../plugins/gr-checks-api/gr-checks-api'; import {appContext} from '../../../services/app-context'; +import {AdminPluginApi} from '../../../api/admin'; +import {AnnotationPluginApi} from '../../../api/annotation'; +import {StylesPluginApi} from '../../../api/styles'; +import {ThemePluginApi} from '../../../api/theme'; +import {EventHelperPluginApi} from '../../../api/event-helper'; +import {PopupPluginApi} from '../../../api/popup'; +import {SettingsPluginApi} from '../../../api/settings'; +import {ReportingPluginApi} from '../../../api/reporting'; +import {ChangeActionsPluginApi} from '../../../api/change-actions'; +import {ChangeMetadataPluginApi} from '../../../api/change-metadata'; +import {RepoPluginApi} from '../../../api/repo'; +import {ChangeReplyPluginApi} from '../../../api/change-reply'; +import {RestPluginApi} from '../../../api/rest'; +import {HookApi, RegisterOptions} from '../../../api/hook'; /** * Plugin-provided custom components can affect content in extension @@ -232,11 +240,11 @@ }); } - annotationApi() { + annotationApi(): AnnotationPluginApi { return new GrAnnotationActionsInterface(this); } - changeActions() { + changeActions(): ChangeActionsPluginApi { return new GrChangeActionsInterface( this, (this.jsApi.getElement( @@ -245,7 +253,7 @@ ); } - changeReply() { + changeReply(): ChangeReplyPluginApi { return new GrChangeReplyInterface(this, this.jsApi); } @@ -253,42 +261,35 @@ return new GrChecksApi(this); } - reporting() { + reporting(): ReportingPluginApi { return new GrReportingJsApi(this); } - theme() { + theme(): ThemePluginApi { return new GrThemeApi(this); } - project() { + project(): RepoPluginApi { return new GrRepoApi(this); } - changeMetadata() { + changeMetadata(): ChangeMetadataPluginApi { return new GrChangeMetadataApi(this); } - admin() { + admin(): AdminPluginApi { return new GrAdminApi(this); } - settings() { + settings(): SettingsPluginApi { return new GrSettingsApi(this); } - styles() { + styles(): StylesPluginApi { return new GrStylesApi(); } - /** - * To make REST requests for plugin-provided endpoints, use - * - * @example - * const pluginRestApi = plugin.restApi(plugin.url()); - * @param prefix url for subsequent .get(), .post() etc requests. - */ - restApi(prefix?: string) { + restApi(prefix?: string): RestPluginApi { return new GrPluginRestApi(prefix); } @@ -296,15 +297,15 @@ return new GrAttributeHelper(element); } - eventHelper(element: HTMLElement) { + eventHelper(element: HTMLElement): EventHelperPluginApi { return new GrEventHelper(element); } - popup(): Promise<GrPopupInterface>; + popup(): Promise<PopupPluginApi>; - popup(moduleName: string): Promise<GrPopupInterface>; + popup(moduleName: string): Promise<PopupPluginApi>; - popup(moduleName?: string): Promise<GrPopupInterface | null> { + popup(moduleName?: string): Promise<PopupPluginApi | null> { if (moduleName !== undefined && typeof moduleName !== 'string') { console.error('.popup(element) deprecated, use .popup(moduleName)!'); return Promise.resolve(null);
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-reporting-js-api.ts b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-reporting-js-api.ts index 87b320c4..d4b51a8 100644 --- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-reporting-js-api.ts +++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-reporting-js-api.ts
@@ -16,26 +16,26 @@ */ import {appContext} from '../../../services/app-context'; -import {EventDetails} from '../../../services/gr-reporting/gr-reporting'; -import {PluginApi} from '../../plugins/gr-plugin-types'; +import {PluginApi} from '../../../api/plugin'; +import {EventDetails, ReportingPluginApi} from '../../../api/reporting'; /** * Defines all methods that will be exported to plugin from reporting service. */ -export class GrReportingJsApi { +export class GrReportingJsApi implements ReportingPluginApi { private readonly reporting = appContext.reportingService; constructor(private readonly plugin: PluginApi) {} reportInteraction(eventName: string, details?: EventDetails) { - return this.reporting.reportInteraction( + this.reporting.reportInteraction( `${this.plugin.getPluginName()}-${eventName}`, details ); } reportLifeCycle(eventName: string, details?: EventDetails) { - return this.reporting.reportLifeCycle( + this.reporting.reportLifeCycle( `${this.plugin.getPluginName()}-${eventName}`, details );
diff --git a/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.ts b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.ts index 329cc7e..655acde 100644 --- a/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.ts +++ b/polygerrit-ui/app/elements/shared/gr-lib-loader/gr-lib-loader.ts
@@ -15,7 +15,7 @@ * limitations under the License. */ import '../gr-js-api-interface/gr-js-api-interface'; -import {EventType} from '../../plugins/gr-plugin-types'; +import {EventType} from '../../../api/plugin'; import {HighlightJS} from '../../../types/types'; import {appContext} from '../../../services/app-context';
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts index 84d84b1..6e17c75 100644 --- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts +++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-api-interface.ts
@@ -139,7 +139,6 @@ } from '../../../types/diff'; import { CancelConditionCallback, - ErrorCallback, GetDiffCommentsOutput, GetDiffRobotCommentsOutput, RestApiService, @@ -155,6 +154,7 @@ } from '../../../constants/constants'; import {firePageError, fireServerError} from '../../../utils/event-util'; import {ParsedChangeInfo} from '../../../types/types'; +import {ErrorCallback} from '../../../api/rest'; const MAX_PROJECT_RESULTS = 25; // This value is somewhat arbitrary and not based on research or calculations.
diff --git a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts index 710445c..fa2a28e 100644 --- a/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts +++ b/polygerrit-ui/app/elements/shared/gr-rest-api-interface/gr-rest-apis/gr-rest-api-helper.ts
@@ -15,10 +15,7 @@ * limitations under the License. */ import {getBaseUrl} from '../../../../utils/url-util'; -import { - CancelConditionCallback, - ErrorCallback, -} from '../../../../services/gr-rest-api/gr-rest-api'; +import {CancelConditionCallback} from '../../../../services/gr-rest-api/gr-rest-api'; import { AuthRequestInit, AuthService, @@ -33,6 +30,7 @@ import {RpcLogEventDetail} from '../../../../types/events'; import {fireNetworkError, fireServerError} from '../../../../utils/event-util'; import {FetchRequest} from '../../../../types/types'; +import {ErrorCallback} from '../../../../api/rest'; export const JSON_PREFIX = ")]}'";
diff --git a/polygerrit-ui/app/services/gr-reporting/gr-reporting.ts b/polygerrit-ui/app/services/gr-reporting/gr-reporting.ts index 7035f26..4ca983a 100644 --- a/polygerrit-ui/app/services/gr-reporting/gr-reporting.ts +++ b/polygerrit-ui/app/services/gr-reporting/gr-reporting.ts
@@ -16,13 +16,10 @@ */ import {NumericChangeId} from '../../types/common'; +import {EventDetails} from '../../api/reporting'; export type EventValue = string | number | {error?: Error}; -// TODO(dmfilippov): TS-fix-any use more specific type instead if possible -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export type EventDetails = any; - export interface Timer { reset(): this; end(): this;
diff --git a/polygerrit-ui/app/services/gr-reporting/gr-reporting_impl.ts b/polygerrit-ui/app/services/gr-reporting/gr-reporting_impl.ts index 657a3f4..f80cb75 100644 --- a/polygerrit-ui/app/services/gr-reporting/gr-reporting_impl.ts +++ b/polygerrit-ui/app/services/gr-reporting/gr-reporting_impl.ts
@@ -16,14 +16,10 @@ */ import {AppContext} from '../app-context'; import {FlagsService} from '../flags/flags'; -import { - EventDetails, - EventValue, - ReportingService, - Timer, -} from './gr-reporting'; +import {EventValue, ReportingService, Timer} from './gr-reporting'; import {hasOwnProperty} from '../../utils/common-util'; import {NumericChangeId} from '../../types/common'; +import {EventDetails} from '../../api/reporting'; // Latency reporting constants.
diff --git a/polygerrit-ui/app/services/gr-reporting/gr-reporting_mock.ts b/polygerrit-ui/app/services/gr-reporting/gr-reporting_mock.ts index 2b42a6b..484ce45 100644 --- a/polygerrit-ui/app/services/gr-reporting/gr-reporting_mock.ts +++ b/polygerrit-ui/app/services/gr-reporting/gr-reporting_mock.ts
@@ -14,7 +14,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import {EventDetails, ReportingService, Timer} from './gr-reporting'; +import {ReportingService, Timer} from './gr-reporting'; +import {EventDetails} from '../../api/reporting'; export class MockTimer implements Timer { end(): this {
diff --git a/polygerrit-ui/app/services/gr-rest-api/gr-rest-api.ts b/polygerrit-ui/app/services/gr-rest-api/gr-rest-api.ts index 6fec5f0..4742e65 100644 --- a/polygerrit-ui/app/services/gr-rest-api/gr-rest-api.ts +++ b/polygerrit-ui/app/services/gr-rest-api/gr-rest-api.ts
@@ -17,88 +17,88 @@ import {HttpMethod} from '../../constants/constants'; import { + AccountCapabilityInfo, AccountDetailInfo, AccountExternalIdInfo, + AccountId, AccountInfo, - NumericChangeId, - ServerInfo, - ProjectInfo, - AccountCapabilityInfo, - SuggestedReviewerInfo, - GroupNameToGroupInfoMap, - ParsedJSON, - PatchSetNum, - RequestPayload, - PreferencesInput, - EditPreferencesInfo, - DiffPreferenceInput, - SshKeyInfo, - RepoName, - BranchName, - BranchInput, - TagInput, - GpgKeysInput, - GpgKeyId, - GpgKeyInfo, - PreferencesInfo, - EmailInfo, - ProjectAccessInfo, - CapabilityInfoMap, - ProjectAccessInput, - ChangeInfo, - ProjectInfoWithName, - GroupId, - GroupInfo, - GroupOptionsInput, + ActionNameToActionInfoMap, + Base64FileContent, + BlameInfo, BranchInfo, - ConfigInfo, - ReviewInput, - EditInfo, + BranchInput, + BranchName, + CapabilityInfoMap, ChangeId, - DashboardInfo, - ProjectAccessInfoMap, - IncludedInInfo, - RobotCommentInfo, + ChangeInfo, + ChangeMessageId, CommentInfo, - PathToCommentsInfoMap, - PathToRobotCommentsInfoMap, CommentInput, - GroupInput, - PluginInfo, - DocResult, + CommitInfo, + ConfigInfo, + ConfigInput, ContributorAgreementInfo, ContributorAgreementInput, - Password, - ProjectWatchInfo, - NameToProjectInfoMap, - ProjectInput, - AccountId, - ChangeMessageId, - GroupAuditEventInfo, - EncodedGroupId, - Base64FileContent, - UrlEncodedCommentId, - TagInfo, - GitRef, - ConfigInput, - RelatedChangesInfo, - SubmittedTogetherInfo, - EmailAddress, - FixId, - FilePathToDiffInfoMap, - BlameInfo, - PatchRange, - ImagesForDiff, - ActionNameToActionInfoMap, - RevisionId, - GroupName, DashboardId, - HashtagsInput, - Hashtag, + DashboardInfo, + DiffPreferenceInput, + DocResult, + EditInfo, + EditPreferencesInfo, + EmailAddress, + EmailInfo, + EncodedGroupId, FileNameToFileInfoMap, - TopMenuEntryInfo, + FilePathToDiffInfoMap, + FixId, + GitRef, + GpgKeyId, + GpgKeyInfo, + GpgKeysInput, + GroupAuditEventInfo, + GroupId, + GroupInfo, + GroupInput, + GroupName, + GroupNameToGroupInfoMap, + GroupOptionsInput, + Hashtag, + HashtagsInput, + ImagesForDiff, + IncludedInInfo, MergeableInfo, - CommitInfo, + NameToProjectInfoMap, + NumericChangeId, + ParsedJSON, + Password, + PatchRange, + PatchSetNum, + PathToCommentsInfoMap, + PathToRobotCommentsInfoMap, + PluginInfo, + PreferencesInfo, + PreferencesInput, + ProjectAccessInfo, + ProjectAccessInfoMap, + ProjectAccessInput, + ProjectInfo, + ProjectInfoWithName, + ProjectInput, + ProjectWatchInfo, + RelatedChangesInfo, + RepoName, + RequestPayload, + ReviewInput, + RevisionId, + RobotCommentInfo, + ServerInfo, + SshKeyInfo, + SubmittedTogetherInfo, + SuggestedReviewerInfo, + TagInfo, + TagInput, + TopMenuEntryInfo, + UrlEncodedCommentId, } from '../../types/common'; import { DiffInfo, @@ -106,8 +106,8 @@ IgnoreWhitespaceType, } from '../../types/diff'; import {ParsedChangeInfo} from '../../types/types'; +import {ErrorCallback} from '../../api/rest'; -export type ErrorCallback = (response?: Response | null, err?: Error) => void; export type CancelConditionCallback = () => boolean; // TODO(TS): remove when GrReplyDialog converted to typescript @@ -118,21 +118,6 @@ setPluginMessage(message: string): void; } -// Copied from gr-change-actions.js -export enum ActionType { - CHANGE = 'change', - REVISION = 'revision', -} - -// Copied from gr-change-actions.js -export enum ActionPriority { - CHANGE = 2, - DEFAULT = 0, - PRIMARY = 3, - REVIEW = -3, - REVISION = 1, -} - export interface GetDiffCommentsOutput { baseComments: CommentInfo[]; comments: CommentInfo[];
diff --git a/polygerrit-ui/app/utils/admin-nav-util.ts b/polygerrit-ui/app/utils/admin-nav-util.ts index b144313..275f9e6 100644 --- a/polygerrit-ui/app/utils/admin-nav-util.ts +++ b/polygerrit-ui/app/utils/admin-nav-util.ts
@@ -25,9 +25,9 @@ AccountDetailInfo, AccountCapabilityInfo, } from '../types/common'; -import {MenuLink} from '../elements/plugins/gr-admin-api/gr-admin-api'; import {hasOwnProperty} from './common-util'; import {GerritView} from '../services/router/router-model'; +import {MenuLink} from '../api/admin'; const ADMIN_LINKS: NavLink[] = [ {