blob: 2d4d412d011f7efdcbc439242c6bd5a152f6d63f [file] [log] [blame]
* @license
* Copyright (C) 2019 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
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* See the License for the specific language governing permissions and
* limitations under the License.
import {DiffLayer as DiffLayerApi} from '../api/diff';
import {DiffViewMode, MessageTag, Side} from '../constants/constants';
import {IronA11yAnnouncer} from '@polymer/iron-a11y-announcer/iron-a11y-announcer';
import {FlattenedNodesObserver} from '@polymer/polymer/lib/utils/flattened-nodes-observer';
import {PaperInputElement} from '@polymer/paper-input/paper-input';
import {
} from './common';
import {PolymerSpliceChange} from '@polymer/polymer/interfaces';
import {AuthRequestInit} from '../services/gr-auth/gr-auth';
export function notUndefined<T>(x: T | undefined): x is T {
return x !== undefined;
export interface FixIronA11yAnnouncer extends IronA11yAnnouncer {
requestAvailability(): void;
export interface CommitRange {
baseCommit: CommitId;
commit: CommitId;
export {CoverageRange, CoverageType} from '../api/diff';
export enum ErrorType {
* We would like to access the the typed `nativeInput` of PaperInputElement, so
* we are creating this wrapper.
export type PaperInputElementExt = PaperInputElement & {
$: {nativeInput?: Element};
* If Polymer would have exported DomApiNative from its dom.js utility, then we
* would probably not need this type. We just use it for casting the return
* value of dom(element).
export interface PolymerDomWrapper {
getOwnerRoot(): Node & OwnerRoot;
getEffectiveChildNodes(): Node[];
callback: (p0: {
target: HTMLElement;
addedNodes: Element[];
removedNodes: Element[];
}) => void
): FlattenedNodesObserver;
unobserveNodes(observerHandle: FlattenedNodesObserver): void;
export interface OwnerRoot {
host?: HTMLElement;
* Event type for an event fired by Polymer for an element generated from a
* dom-repeat template.
export interface PolymerDomRepeatEvent<TModel = unknown> extends Event {
model: PolymerDomRepeatEventModel<TModel>;
* Event type for an event fired by Polymer for an element generated from a
* dom-repeat template.
export interface PolymerDomRepeatCustomEvent<
TModel = unknown,
TDetail = unknown
> extends CustomEvent<TDetail> {
model: PolymerDomRepeatEventModel<TModel>;
* Model containing additional information about the dom-repeat element
* that fired an event.
* Note: This interface is valid only if both dom-repeat properties 'as' and
* 'indexAs' have default values ('item' and 'index' correspondingly)
export interface PolymerDomRepeatEventModel<T> {
* The item corresponding to the element in the dom-repeat.
item: T;
* The index of the element in the dom-repeat.
index: number;
get(name: 'item'): T;
// Typed get for item.prop_name
get<K extends keyof T>(name: `item.${K extends string ? K : never}`): T[K];
// Typed get for item.prop_name.nested_prop_name
get<K1 extends keyof T, K2 extends keyof T[K1]>(
name: `item.${K1 extends string ? K1 : never}.${K2 extends string
? K2
: never}`
): T[K1][K2];
// Untyped get for other cases
get(name: string): unknown; // force get(...) as Type for nested properties
set(name: 'item', val: T): void;
// Typed set for item.prop_name
set<K extends keyof T>(
name: `item.${K extends string ? K : never}`,
val: T[K]
): void;
// Typed get for item.prop_name.nested_prop_name
set<K1 extends keyof T, K2 extends keyof T[K1]>(
name: `item.${K1 extends string ? K1 : never}.${K2 extends string
? K2
: never}`,
val: T[K1][K2]
): void;
// Untyped set for other cases
set(name: string, val: unknown): void;
/** */
export interface HighlightJSResult {
value: string;
top: unknown;
/** */
export interface HighlightJS {
configure(options: {classPrefix: string}): void;
getLanguage(languageName: string): unknown | undefined;
languageName: string,
code: string,
ignore_illegals: boolean,
continuation: unknown
): HighlightJSResult;
export type DiffLayerListener = (
start: number,
end: number,
side: Side
) => void;
export interface DiffLayer extends DiffLayerApi {
addListener?(listener: DiffLayerListener): void;
removeListener?(listener: DiffLayerListener): void;
export interface ChangeViewState {
changeNum: NumericChangeId | null;
patchRange: PatchRange | null;
selectedFileIndex: number;
showReplyDialog: boolean;
showDownloadDialog: boolean;
diffMode: DiffViewMode | null;
numFilesShown: number | null;
diffViewMode?: boolean;
export interface ChangeListViewState {
changeNum?: ChangeId;
patchRange?: PatchRange;
// TODO(TS): seems only one of 2 selected... is required
selectedFileIndex?: number;
selectedChangeIndex?: number;
showReplyDialog?: boolean;
showDownloadDialog?: boolean;
diffMode?: DiffViewMode;
numFilesShown?: number;
scrollTop?: number;
query?: string | null;
offset?: number;
export interface DashboardViewState {
[key: string]: number;
export interface ViewState {
changeView: ChangeViewState;
changeListView: ChangeListViewState;
dashboardView: DashboardViewState;
export interface PatchSetFile {
path: string;
basePath?: string;
patchNum?: PatchSetNum;
export interface PatchNumOnly {
patchNum: PatchSetNum;
export function isPatchSetFile(
x: PatchSetFile | PatchNumOnly
): x is PatchSetFile {
return !!(x as PatchSetFile).path;
export interface FileRange {
basePath?: string;
path: string;
export function isPolymerSpliceChange<
U extends Array<{} | null | undefined>
>(x: T | PolymerSpliceChange<U>): x is PolymerSpliceChange<U> {
return (x as PolymerSpliceChange<U>).indexSplices !== undefined;
export interface FetchRequest {
url: string;
fetchOptions?: AuthRequestInit;
anonymizedUrl?: string;
export interface FormattedReviewerUpdateInfo {
author: AccountInfo;
date: Timestamp;
updates: {message: string; reviewers: AccountInfo[]}[];
export interface EditRevisionInfo extends Partial<RevisionInfo> {
// EditRevisionInfo has less required properties then RevisionInfo
_number: PatchSetNum;
basePatchNum: BasePatchSetNum;
commit: CommitInfo;
export interface ParsedChangeInfo
extends Omit<ChangeViewChangeInfo, 'reviewer_updates' | 'revisions'> {
revisions: {[revisionId: string]: RevisionInfo | EditRevisionInfo};
reviewer_updates?: ReviewerUpdateInfo[] | FormattedReviewerUpdateInfo[];