Make various typechecking improvements (#505)

* Make various typechecking improvements

* Use `Record<never, never>` to cover `{}`
This commit is contained in:
Andrew Ferrazzutti 2022-09-30 13:50:38 -04:00 committed by GitHub
parent 911a73abba
commit 80a26283e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 19 additions and 16 deletions

1
changelog.d/505.misc Normal file
View File

@ -0,0 +1 @@
Improve some type-checking in the codebase.

View File

@ -1042,7 +1042,7 @@ ${event.release.body}`;
}
}
public getProvisionerDetails() {
public getProvisionerDetails(): GitHubRepoResponseItem {
return {
...GitHubRepoConnection.getProvisionerDetails(this.as.botUserId),
id: this.connectionId,

View File

@ -257,7 +257,7 @@ export class GitLabRepoConnection extends CommandConnection<GitLabRepoConnection
if (client) {
results.push({
name,
} as GitLabRepoConnectionInstanceTarget);
});
}
}
return results;
@ -325,7 +325,7 @@ export class GitLabRepoConnection extends CommandConnection<GitLabRepoConnection
return GitLabRepoConnection.EventTypes.includes(eventType) && this.stateKey === stateKey;
}
public getProvisionerDetails() {
public getProvisionerDetails(): GitLabRepoResponseItem {
return {
...GitLabRepoConnection.getProvisionerDetails(this.as.botUserId),
id: this.connectionId,

View File

@ -234,7 +234,7 @@ export class JiraProjectConnection extends CommandConnection<JiraProjectConnecti
}
}
public getProvisionerDetails() {
public getProvisionerDetails(): JiraProjectResponseItem {
return {
...JiraProjectConnection.getProvisionerDetails(this.as.botUserId),
id: this.connectionId,

View File

@ -156,7 +156,7 @@ export class BridgeWidgetApi {
if (!connection.provisionerUpdateConfig || !connection.getProvisionerDetails) {
throw new ApiError("Connection type does not support updates", ErrCode.UnsupportedOperation);
}
await connection.provisionerUpdateConfig(req.userId, req.body);
connection.provisionerUpdateConfig(req.userId, req.body);
res.send(connection.getProvisionerDetails(true));
}

View File

@ -4,6 +4,7 @@ import { ExchangeOpenAPIRequestBody, ExchangeOpenAPIResponseBody } from "matrix-
import { WidgetApi } from 'matrix-widget-api';
import { ApiError } from '../src/api';
import { FunctionComponent } from 'preact';
import { IConnectionState } from '../src/Connections';
export class BridgeAPIError extends Error {
constructor(msg: string, public readonly body: ApiError) {
super(msg);
@ -116,11 +117,11 @@ export class BridgeAPI {
return this.request('GET', `/widgetapi/v1/${encodeURIComponent(roomId)}/connections/${encodeURIComponent(service)}`);
}
async createConnection(roomId: string, type: string, config: unknown) {
async createConnection(roomId: string, type: string, config: IConnectionState) {
return this.request('POST', `/widgetapi/v1/${encodeURIComponent(roomId)}/connections/${encodeURIComponent(type)}`, config);
}
async updateConnection(roomId: string, connectionId: string, config: unknown) {
async updateConnection(roomId: string, connectionId: string, config: IConnectionState) {
return this.request('PUT', `/widgetapi/v1/${encodeURIComponent(roomId)}/connections/${encodeURIComponent(connectionId)}`, config);
}
@ -128,8 +129,8 @@ export class BridgeAPI {
return this.request('DELETE', `/widgetapi/v1/${encodeURIComponent(roomId)}/connections/${encodeURIComponent(connectionId)}`);
}
getConnectionTargets<R>(type: string, filters?: unknown): Promise<R[]> {
const searchParams = filters && new URLSearchParams(filters as Record<string, string>);
getConnectionTargets<R>(type: string, filters?: Record<never, never>|Record<string, string>): Promise<R[]> {
const searchParams = filters && new URLSearchParams(filters);
return this.request('GET', `/widgetapi/v1/targets/${encodeURIComponent(type)}${searchParams ? `?${searchParams}` : ''}`);
}
}

View File

@ -20,7 +20,7 @@ const ConnectionSearch: FunctionComponent<{api: BridgeAPI, onPicked: (state: Git
try {
const res = await api.getConnectionTargets<GitLabRepoConnectionTarget>(EventType, filter);
if (!filter.instance) {
setInstances(res);
setInstances(res as GitLabRepoConnectionInstanceTarget[]);
if (res[0]) {
setFilter({instance: res[0].name, search: ""});
}
@ -82,12 +82,12 @@ const ConnectionSearch: FunctionComponent<{api: BridgeAPI, onPicked: (state: Git
{instances === null && <p> Loading GitLab instances. </p>}
{instances?.length === 0 && <p> You are not logged into any GitLab instances. </p>}
{searchError && <ErrorPane> {searchError} </ErrorPane> }
<InputField visible={instances ? instances.length > 0 : false} label="GitLab Instance" noPadding={true}>
<InputField visible={!!instances?.length} label="GitLab Instance" noPadding={true}>
<select onChange={onInstancePicked}>
{instanceListResults}
</select>
</InputField>
<InputField visible={instances ? instances.length > 0 : false} label="Project" noPadding={true}>
<InputField visible={!!instances?.length} label="Project" noPadding={true}>
<small>{currentProjectPath ?? ""}</small>
<input onChange={updateSearchFn} value={filter.search} list="gitlab-projects" type="text" />
<datalist id="gitlab-projects">

View File

@ -4,9 +4,10 @@ import { BridgeAPI, BridgeAPIError } from "../../BridgeAPI";
import { ErrorPane, ListItem } from "../elements";
import style from "./RoomConfig.module.scss";
import { GetConnectionsResponseItem } from "../../../src/provisioning/api";
import { IConnectionState } from "../../../src/Connections";
export interface ConnectionConfigurationProps<SConfig, ConnectionType extends GetConnectionsResponseItem, ConnectionState> {
export interface ConnectionConfigurationProps<SConfig, ConnectionType extends GetConnectionsResponseItem, ConnectionState extends IConnectionState> {
serviceConfig: SConfig;
onSave: (newConfig: ConnectionState) => void,
existingConnection?: ConnectionType;
@ -14,7 +15,7 @@ export interface ConnectionConfigurationProps<SConfig, ConnectionType extends Ge
api: BridgeAPI;
}
interface IRoomConfigProps<SConfig, ConnectionType extends GetConnectionsResponseItem, ConnectionState> {
interface IRoomConfigProps<SConfig, ConnectionType extends GetConnectionsResponseItem, ConnectionState extends IConnectionState> {
api: BridgeAPI;
roomId: string;
type: string;
@ -30,7 +31,7 @@ interface IRoomConfigProps<SConfig, ConnectionType extends GetConnectionsRespons
connectionConfigComponent: FunctionComponent<ConnectionConfigurationProps<SConfig, ConnectionType, ConnectionState>>;
}
export const RoomConfig = function<SConfig, ConnectionType extends GetConnectionsResponseItem, ConnectionState>(props: IRoomConfigProps<SConfig, ConnectionType, ConnectionState>) {
export const RoomConfig = function<SConfig, ConnectionType extends GetConnectionsResponseItem, ConnectionState extends IConnectionState>(props: IRoomConfigProps<SConfig, ConnectionType, ConnectionState>) {
const { api, roomId, type, headerImg, text, listItemName, connectionEventType } = props;
const ConnectionConfigComponent = props.connectionConfigComponent;
const [ error, setError ] = useState<null|{header?: string, message: string}>(null);
@ -69,7 +70,7 @@ export const RoomConfig = function<SConfig, ConnectionType extends GetConnection
})
}, [api, type]);
const handleSaveOnCreation = useCallback((config) => {
const handleSaveOnCreation = useCallback((config: ConnectionState) => {
api.createConnection(roomId, connectionEventType, config).then(() => {
// Force reload
incrementConnectionKey(undefined);