From 354b63570105bd89c396c90682925553d14b6acd Mon Sep 17 00:00:00 2001 From: Alex Weininger Date: Fri, 30 Apr 2021 02:53:24 -0700 Subject: [PATCH] Refresh tree after adding or removing project (#7) * refresh tree after adding or removing project * Always check if client is defined * fix lint errors * remove extra nodejs versions from pipeline --- .eslintrc.json | 24 ++++++++++++++- .github/workflows/ciBuild.yml | 2 +- src/appwrite/Database.ts | 8 ++--- src/appwrite/Health.ts | 7 ++--- src/appwrite/Storage.ts | 8 ++--- src/appwrite/Users.ts | 9 +++--- src/client.ts | 29 +++++++++++++------ src/commands/connectAppwrite.ts | 6 ++-- src/commands/database/createCollection.ts | 12 +++++--- src/commands/database/createRule.ts | 5 ++++ src/commands/database/deleteCollection.ts | 3 ++ src/commands/database/deleteDocument.ts | 5 +++- .../database/permissions/createPermission.ts | 10 +++---- .../database/permissions/deletePermission.ts | 3 ++ .../database/permissions/editPermission.ts | 9 ++++-- src/commands/database/refreshCollection.ts | 2 +- src/commands/database/removeRule.ts | 3 ++ src/commands/project/addProject.ts | 6 ++-- src/commands/project/removeProject.ts | 11 +++---- src/commands/project/setActiveProject.ts | 4 +-- src/commands/registerCommands.ts | 10 +++---- src/commands/users/createUser.ts | 3 ++ src/commands/users/deleteUser.ts | 3 ++ src/commands/users/getUserLogs.ts | 3 ++ src/commands/users/openUserInConsole.ts | 2 +- src/commands/users/refreshUsersList.ts | 2 +- src/commands/users/viewUserPrefs.ts | 2 +- src/constants.ts | 1 + src/extension.ts | 15 ++++------ src/extensionVariables.ts | 2 +- src/settings.ts | 13 ++------- src/tree/CollapsableTreeItem.ts | 3 +- src/tree/database/CollectionTreeItem.ts | 19 +++++++----- src/tree/database/DatabaseTreeItemProvider.ts | 6 ++-- src/tree/database/DocumentTreeItem.ts | 1 + src/tree/database/DocumentsTreeItem.ts | 3 +- .../database/settings/PermissionTreeItem.ts | 1 - src/tree/database/settings/RuleTreeItem.ts | 1 - src/tree/health/HealthTreeItem.ts | 2 +- src/tree/health/HealthTreeItemProvider.ts | 5 ---- src/tree/projects/ProjectsTreeItemProvider.ts | 14 ++++++--- src/tree/storage/StorageTreeItemProvider.ts | 4 +-- src/tree/users/UserTreeItemProvider.ts | 7 ++--- src/ui/AppwriteOutputChannel.ts | 6 ++-- src/ui/AppwriteTreeItemBase.ts | 2 +- src/ui/BaseEditor.ts | 2 +- src/ui/createRuleWizard.ts | 1 - src/utils/refreshTree.ts | 4 +-- 48 files changed, 171 insertions(+), 132 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 3fb5522..77d55a8 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -8,13 +8,35 @@ "plugins": [ "@typescript-eslint" ], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended" + ], "rules": { "@typescript-eslint/naming-convention": "off", "@typescript-eslint/semi": "warn", "curly": "warn", "eqeqeq": "warn", "no-throw-literal": "warn", - "semi": "off" + "semi": "off", + "@typescript-eslint/no-unused-vars": [ + "error", + { + "argsIgnorePattern": "^_" + } + ], + "no-unused-vars": "off", + "no-useless-escape": "off", + "no-inner-declarations": "off", + "no-case-declarations": "off", + "@typescript-eslint/prefer-regexp-exec": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/unbound-method": "off", + "@typescript-eslint/no-unnecessary-type-assertion": "off", + "@typescript-eslint/restrict-template-expressions": "off", + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/no-explicit-any": "off" }, "ignorePatterns": [ "**/*.d.ts" diff --git a/.github/workflows/ciBuild.yml b/.github/workflows/ciBuild.yml index d1f0deb..2de44c4 100644 --- a/.github/workflows/ciBuild.yml +++ b/.github/workflows/ciBuild.yml @@ -16,7 +16,7 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x, 14.x, 15.x] + node-version: [12.x, 14.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: diff --git a/src/appwrite/Database.ts b/src/appwrite/Database.ts index 908fe87..7d5be16 100644 --- a/src/appwrite/Database.ts +++ b/src/appwrite/Database.ts @@ -1,14 +1,12 @@ -import { Client, Collection, CreatedCollection, CreatedRule, DatabaseClient, Rule, SDK } from "../appwrite"; -import { CreateRuleWizardContext } from "../ui/createRuleWizard"; +import { Client, Collection, CreatedCollection, CreatedRule, DatabaseClient, Rule } from "../appwrite"; +import { AppwriteSDK } from '../constants'; import AppwriteCall from "../utils/AppwriteCall"; -const sdk: SDK = require("node-appwrite"); - export class Database { private readonly database: DatabaseClient; constructor(client: Client) { - this.database = new sdk.Database(client); + this.database = new AppwriteSDK.Database(client); } public async getCollection(collectionId: string): Promise { diff --git a/src/appwrite/Health.ts b/src/appwrite/Health.ts index 9792868..27cbc9b 100644 --- a/src/appwrite/Health.ts +++ b/src/appwrite/Health.ts @@ -1,12 +1,11 @@ import { MarkdownString } from 'vscode'; -import { AppwriteHealth, Client, HealthClient, SDK } from "../appwrite"; -const sdk: SDK = require("node-appwrite"); - +import { AppwriteHealth, Client, HealthClient } from "../appwrite"; +import { AppwriteSDK } from '../constants'; export class Health { private readonly health: HealthClient; constructor(client: Client) { - this.health = new sdk.Health(client); + this.health = new AppwriteSDK.Health(client); } /** diff --git a/src/appwrite/Storage.ts b/src/appwrite/Storage.ts index d987958..4ecb95d 100644 --- a/src/appwrite/Storage.ts +++ b/src/appwrite/Storage.ts @@ -1,14 +1,12 @@ -import { Client, Collection, CreatedCollection, CreatedRule, DatabaseClient, File, FilesList, Rule, SDK, StorageClient } from "../appwrite"; -import { CreateRuleWizardContext } from "../ui/createRuleWizard"; +import { Client, FilesList, StorageClient } from "../appwrite"; +import { AppwriteSDK } from '../constants'; import AppwriteCall from "../utils/AppwriteCall"; -const sdk: SDK = require("node-appwrite"); - export class Storage { private readonly storage: StorageClient; constructor(client: Client) { - this.storage = new sdk.Storage(client); + this.storage = new AppwriteSDK.Storage(client); } public async listFiles(): Promise { diff --git a/src/appwrite/Users.ts b/src/appwrite/Users.ts index 368c356..d178fc4 100644 --- a/src/appwrite/Users.ts +++ b/src/appwrite/Users.ts @@ -1,14 +1,13 @@ import { window } from "vscode"; -import { Client, Log, SDK, User, UsersClient } from "../appwrite"; -import { ext } from "../extensionVariables"; +import { Client, Log, User, UsersClient } from "../appwrite"; +import { AppwriteSDK } from "../constants"; import AppwriteCall from "../utils/AppwriteCall"; -const sdk: SDK = require("node-appwrite"); export class Users { private readonly users: UsersClient; constructor(client: Client) { - this.users = new sdk.Users(client); + this.users = new AppwriteSDK.Users(client); } public async createNewUser(context: CreateUserContext): Promise { await AppwriteCall(this.users.create(context.email, context.password, context.name), (user) => { @@ -23,7 +22,7 @@ export class Users { } public async getLogs(userId: string): Promise { - return await AppwriteCall(this.users.getLogs(userId)) ?? []; + return (await AppwriteCall(this.users.getLogs(userId))) ?? []; } } diff --git a/src/client.ts b/src/client.ts index 2dd16bd..3313fcb 100644 --- a/src/client.ts +++ b/src/client.ts @@ -1,21 +1,20 @@ -import { Client, SDK } from "./appwrite"; +import { Client } from "./appwrite"; import { Database } from "./appwrite/Database"; import { Health } from "./appwrite/Health"; import { Storage } from "./appwrite/Storage"; import { Users } from "./appwrite/Users"; +import { AppwriteSDK } from "./constants"; import { AppwriteProjectConfiguration } from "./settings"; -const sdk: SDK = require("node-appwrite"); - export let client: Client; export let clientConfig: { endpoint: string; projectId: string; secret: string }; -export let usersClient: Users; -export let healthClient: Health; -export let databaseClient: Database; -export let storageClient: Storage; +export let usersClient: Users | undefined; +export let healthClient: Health | undefined; +export let databaseClient: Database | undefined; +export let storageClient: Storage | undefined; -export function initAppwriteClient({ endpoint, projectId, secret }: AppwriteProjectConfiguration) { - client = new sdk.Client(); +function initAppwriteClient({ endpoint, projectId, secret }: AppwriteProjectConfiguration) { + client = new AppwriteSDK.Client(); clientConfig = { endpoint, projectId, secret }; client.setEndpoint(endpoint).setProject(projectId).setKey(secret); @@ -26,3 +25,15 @@ export function initAppwriteClient({ endpoint, projectId, secret }: AppwriteProj return client; } + +export function createAppwriteClient(config?: AppwriteProjectConfiguration): void { + if (config) { + initAppwriteClient(config); + return; + } + + usersClient = undefined; + healthClient = undefined; + databaseClient = undefined; + storageClient = undefined; +} diff --git a/src/commands/connectAppwrite.ts b/src/commands/connectAppwrite.ts index 20ed863..ee5b2df 100644 --- a/src/commands/connectAppwrite.ts +++ b/src/commands/connectAppwrite.ts @@ -1,13 +1,13 @@ -import { initAppwriteClient } from "../client"; +import { createAppwriteClient } from "../client"; import { addProjectConfiguration } from '../settings'; import { addProjectWizard } from "../ui/AddProjectWizard"; import { refreshTree } from '../utils/refreshTree'; -export async function connectAppwrite() { +export async function connectAppwrite(): Promise { const projectConfiguration = await addProjectWizard(); if (projectConfiguration) { addProjectConfiguration(projectConfiguration); - initAppwriteClient(projectConfiguration); + createAppwriteClient(projectConfiguration); refreshTree(); } } diff --git a/src/commands/database/createCollection.ts b/src/commands/database/createCollection.ts index 180b84c..4973b37 100644 --- a/src/commands/database/createCollection.ts +++ b/src/commands/database/createCollection.ts @@ -1,13 +1,17 @@ -import { window } from 'vscode'; -import { databaseClient } from '../../client'; +import { window } from "vscode"; +import { databaseClient } from "../../client"; export async function createCollection(): Promise { + if (!databaseClient) { + return; + } + const name = await window.showInputBox({ - prompt: 'Collection name' + prompt: "Collection name", }); if (name && name.length > 0) { - await databaseClient.createCollection({name}); + await databaseClient.createCollection({ name }); window.showInformationMessage(`Created collection "${name}".`); } } diff --git a/src/commands/database/createRule.ts b/src/commands/database/createRule.ts index 640a284..f6dc0bc 100644 --- a/src/commands/database/createRule.ts +++ b/src/commands/database/createRule.ts @@ -5,6 +5,11 @@ import { createRuleWizard } from "../../ui/createRuleWizard"; import { refreshTree } from '../../utils/refreshTree'; export async function createRule(rulesTreeItem: RulesTreeItem): Promise { + + if (!databaseClient) { + return; + } + const ruleContext = await createRuleWizard(); const collection = rulesTreeItem.parent.collection; diff --git a/src/commands/database/deleteCollection.ts b/src/commands/database/deleteCollection.ts index 68c1e4f..fe1458f 100644 --- a/src/commands/database/deleteCollection.ts +++ b/src/commands/database/deleteCollection.ts @@ -4,6 +4,9 @@ import { CollectionTreeItem } from "../../tree/database/CollectionTreeItem"; import { confirmDialog } from "../../ui/confirmDialog"; export async function deleteCollection(collectionTreeItem: CollectionTreeItem): Promise { + if (!databaseClient) { + return; + } const collection = collectionTreeItem.collection; try { const shouldDelete = await confirmDialog(`Delete collection "${collection.name}"?`); diff --git a/src/commands/database/deleteDocument.ts b/src/commands/database/deleteDocument.ts index a572c68..996f72f 100644 --- a/src/commands/database/deleteDocument.ts +++ b/src/commands/database/deleteDocument.ts @@ -4,13 +4,16 @@ import { DocumentTreeItem } from "../../tree/database/DocumentTreeItem"; import { confirmDialog } from "../../ui/confirmDialog"; export async function deleteDocument(documentTreeItem: DocumentTreeItem): Promise { + if (!databaseClient) { + return; + } const document = documentTreeItem.document; const collection = documentTreeItem.parent.parent.collection; try { const shouldDelete = await confirmDialog(`Delete document "${document["$id"]}" from ${collection.name}?`); if (shouldDelete) { await databaseClient.deleteDocument(collection.$id, document["$id"]); - documentTreeItem.parent.window.showInformationMessage(`Deleted document "${document["$id"]}" from ${collection.name}.`); + window.showInformationMessage(`Deleted document "${document["$id"]}" from ${collection.name}.`); } } catch (e) { window.showErrorMessage(e); diff --git a/src/commands/database/permissions/createPermission.ts b/src/commands/database/permissions/createPermission.ts index 0502151..bd0929b 100644 --- a/src/commands/database/permissions/createPermission.ts +++ b/src/commands/database/permissions/createPermission.ts @@ -1,8 +1,6 @@ import { window } from "vscode"; -import { databaseClient } from '../../../client'; -import { CollapsableTreeItem } from '../../../tree/CollapsableTreeItem'; +import { databaseClient } from "../../../client"; import { PermissionsTreeItem } from "../../../tree/database/settings/PermissionsTreeItem"; -import { PermissionTreeItem } from "../../../tree/database/settings/PermissionTreeItem"; export type CreatePermissionWizardContext = { kind: "read" | "write"; @@ -25,7 +23,9 @@ export async function createPermissionWizard(kind?: "read" | "write"): Promise { - + if (!databaseClient) { + return; + } const collection = treeItem.parent.collection; const context = await createPermissionWizard(undefined); @@ -37,7 +37,7 @@ export async function createPermission(treeItem: PermissionsTreeItem): Promise { + if (!databaseClient) { + return; + } const collection = treeItem.parent.parent.collection; const kind = treeItem.kind; diff --git a/src/commands/database/permissions/editPermission.ts b/src/commands/database/permissions/editPermission.ts index 757ed92..81f5aa1 100644 --- a/src/commands/database/permissions/editPermission.ts +++ b/src/commands/database/permissions/editPermission.ts @@ -1,8 +1,11 @@ -import { window } from 'vscode'; -import { databaseClient } from '../../../client'; -import { PermissionTreeItem } from '../../../tree/database/settings/PermissionTreeItem'; +import { window } from "vscode"; +import { databaseClient } from "../../../client"; +import { PermissionTreeItem } from "../../../tree/database/settings/PermissionTreeItem"; export async function editPermission(treeItem: PermissionTreeItem): Promise { + if (!databaseClient) { + return; + } const editedPermission = await window.showInputBox({ value: treeItem.permission, }); diff --git a/src/commands/database/refreshCollection.ts b/src/commands/database/refreshCollection.ts index cc9aa34..6bf831f 100644 --- a/src/commands/database/refreshCollection.ts +++ b/src/commands/database/refreshCollection.ts @@ -1,5 +1,5 @@ import { CollectionTreeItem } from "../../tree/database/CollectionTreeItem"; -export async function refreshCollection(collectionTreeItem: CollectionTreeItem) { +export async function refreshCollection(collectionTreeItem: CollectionTreeItem): Promise { await collectionTreeItem.refresh(); } diff --git a/src/commands/database/removeRule.ts b/src/commands/database/removeRule.ts index d69a1cf..5c455d5 100644 --- a/src/commands/database/removeRule.ts +++ b/src/commands/database/removeRule.ts @@ -3,6 +3,9 @@ import { RuleTreeItem } from '../../tree/database/settings/RuleTreeItem'; import { refreshTree } from '../../utils/refreshTree'; export async function removeRule(ruleItem: RuleTreeItem): Promise { + if (!databaseClient) { + return; + } const rule = ruleItem.rule; const collection = ruleItem.parent.parent.collection; await databaseClient.removeRule(collection, rule); diff --git a/src/commands/project/addProject.ts b/src/commands/project/addProject.ts index 5b22e76..e024b97 100644 --- a/src/commands/project/addProject.ts +++ b/src/commands/project/addProject.ts @@ -1,12 +1,12 @@ import { window } from "vscode"; -import { initAppwriteClient } from "../../client"; +import { createAppwriteClient } from '../../client'; import { addProjectWizard } from "../../ui/AddProjectWizard"; -export async function addProject() { +export async function addProject(): Promise { const projectConfiguration = await addProjectWizard(); if (projectConfiguration) { - initAppwriteClient(projectConfiguration); + createAppwriteClient(projectConfiguration); } window.showInformationMessage("Connected to Appwrite project."); diff --git a/src/commands/project/removeProject.ts b/src/commands/project/removeProject.ts index 77c875e..026cdd2 100644 --- a/src/commands/project/removeProject.ts +++ b/src/commands/project/removeProject.ts @@ -1,11 +1,8 @@ -import { window } from "vscode"; -import { initAppwriteClient } from "../../client"; -import { removeProjectConfig } from '../../settings'; -import { ProjectTreeItem } from '../../tree/projects/ProjectTreeItem'; -import { addProjectWizard } from "../../ui/AddProjectWizard"; +import { removeProjectConfig } from "../../settings"; +import { ProjectTreeItem } from "../../tree/projects/ProjectTreeItem"; -export async function removeProject(project: ProjectTreeItem | string) { - if (typeof project === 'string') { +export async function removeProject(project: ProjectTreeItem | string): Promise { + if (typeof project === "string") { await removeProjectConfig(project); return; } diff --git a/src/commands/project/setActiveProject.ts b/src/commands/project/setActiveProject.ts index fcf4d76..e485efe 100644 --- a/src/commands/project/setActiveProject.ts +++ b/src/commands/project/setActiveProject.ts @@ -1,9 +1,7 @@ -import { window } from "vscode"; -import { initAppwriteClient } from "../../client"; import { setActiveProjectId } from '../../settings'; import { ProjectTreeItem } from "../../tree/projects/ProjectTreeItem"; -export async function setActiveProject(treeItem: ProjectTreeItem) { +export async function setActiveProject(treeItem: ProjectTreeItem): Promise { if (treeItem === undefined) { return; } diff --git a/src/commands/registerCommands.ts b/src/commands/registerCommands.ts index 462cc85..624c50f 100644 --- a/src/commands/registerCommands.ts +++ b/src/commands/registerCommands.ts @@ -1,5 +1,5 @@ import { commands, ExtensionContext } from "vscode"; -import { AppwriteTree, ext } from "../extensionVariables"; +import { AppwriteTree } from "../extensionVariables"; import { refreshAllViews, refreshTree } from "../utils/refreshTree"; import { connectAppwrite } from "./connectAppwrite"; import { createCollection } from "./database/createCollection"; @@ -24,7 +24,7 @@ import { refreshUsersList } from "./users/refreshUsersList"; import { viewUserPrefs } from "./users/viewUserPrefs"; import { editPermission } from "./database/permissions/editPermission"; import { setActiveProject } from "./project/setActiveProject"; -import { removeProject } from './project/removeProject'; +import { removeProject } from "./project/removeProject"; class CommandRegistrar { constructor(private readonly context: ExtensionContext) {} @@ -57,7 +57,7 @@ export function registerCommands(context: ExtensionContext): void { }; /** General **/ - registerCommand("Connect", connectAppwrite); + registerCommand("Connect", connectAppwrite, "all"); /** Users **/ registerCommand("openUserInConsole", openUserInConsole); @@ -86,11 +86,11 @@ export function registerCommands(context: ExtensionContext): void { registerCommand("editPermission", editPermission, "database"); /** Health **/ - registerCommand("refreshHealth", () => {}, "health"); + registerCommand("refreshHealth", undefined, "health"); registerCommand("openHealthDocumentation", () => openDocumentation("health")); /** Storage **/ - registerCommand("refreshStorage", () => {}, "storage"); + registerCommand("refreshStorage", undefined, "storage"); registerCommand("openStorageDocumentation", () => openDocumentation("storage")); /** Projects **/ diff --git a/src/commands/users/createUser.ts b/src/commands/users/createUser.ts index 55dbdf9..38fc112 100644 --- a/src/commands/users/createUser.ts +++ b/src/commands/users/createUser.ts @@ -3,6 +3,9 @@ import { usersClient } from '../../client'; import { ext } from '../../extensionVariables'; export async function createUser(): Promise { + if (!usersClient) { + return; + } const email = await window.showInputBox({ ignoreFocusOut: true, placeHolder: "jane.doe@hotmail.com", diff --git a/src/commands/users/deleteUser.ts b/src/commands/users/deleteUser.ts index bbf7ea5..3c17a64 100644 --- a/src/commands/users/deleteUser.ts +++ b/src/commands/users/deleteUser.ts @@ -5,6 +5,9 @@ import { DialogResponses } from "../../ui/DialogResponses"; import { refreshTree } from "../../utils/refreshTree"; export async function deleteUser(userTreeItem: UserTreeItem): Promise { + if (!usersClient) { + return; + } const user = userTreeItem.user; const userId = user.$id; const shouldDeleteUser = await window.showWarningMessage( diff --git a/src/commands/users/getUserLogs.ts b/src/commands/users/getUserLogs.ts index ff0f1ab..93a4f46 100644 --- a/src/commands/users/getUserLogs.ts +++ b/src/commands/users/getUserLogs.ts @@ -3,6 +3,9 @@ import { UserTreeItem } from "../../tree/users/UserTreeItem"; import { openReadOnlyJson } from '../../ui/openReadonlyContent'; export async function getUserLogs(treeItem: UserTreeItem): Promise { + if (!usersClient) { + return; + } const userId = treeItem.user.$id; const logs = await usersClient.getLogs(userId); diff --git a/src/commands/users/openUserInConsole.ts b/src/commands/users/openUserInConsole.ts index b081e0f..7f2df30 100644 --- a/src/commands/users/openUserInConsole.ts +++ b/src/commands/users/openUserInConsole.ts @@ -12,7 +12,7 @@ function getUserUrl(userId: string, endpoint: string, projectId: string): string return `${getConsoleUrlFromEndpoint(endpoint)}/users/user?id=${userId}&project=${projectId}`; } -export async function openUserInConsole(item: UserTreeItem) { +export async function openUserInConsole(item: UserTreeItem): Promise { const url = getUserUrl(item.user.$id, clientConfig.endpoint, clientConfig.projectId); await commands.executeCommand("vscode.open", Uri.parse(url)); diff --git a/src/commands/users/refreshUsersList.ts b/src/commands/users/refreshUsersList.ts index 2352698..41b2822 100644 --- a/src/commands/users/refreshUsersList.ts +++ b/src/commands/users/refreshUsersList.ts @@ -1,5 +1,5 @@ import { ext } from "../../extensionVariables"; -export async function refreshUsersList() { +export async function refreshUsersList(): Promise { ext.tree?.users?.refresh(); } diff --git a/src/commands/users/viewUserPrefs.ts b/src/commands/users/viewUserPrefs.ts index b666c53..9bee815 100644 --- a/src/commands/users/viewUserPrefs.ts +++ b/src/commands/users/viewUserPrefs.ts @@ -2,7 +2,7 @@ import { UserPrefsTreeItem } from "../../tree/users/properties/UserPrefsTreeItem import { UserTreeItem } from '../../tree/users/UserTreeItem'; import { openReadOnlyJson } from "../../ui/openReadonlyContent"; -export async function viewUserPrefs(item: UserPrefsTreeItem | UserTreeItem) { +export async function viewUserPrefs(item: UserPrefsTreeItem | UserTreeItem): Promise { const userItem = item instanceof UserPrefsTreeItem ? item.parent : item; const prefs = userItem.user.prefs; diff --git a/src/constants.ts b/src/constants.ts index a057c27..34e9127 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,3 +1,4 @@ import type { SDK } from './appwrite'; +// eslint-disable-next-line @typescript-eslint/no-var-requires export const AppwriteSDK: SDK = require('node-appwrite') as SDK; diff --git a/src/extension.ts b/src/extension.ts index 3bd7da2..50a0a39 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,12 +1,11 @@ import * as vscode from "vscode"; -import { workspace } from 'vscode'; -import { initAppwriteClient } from "./client"; +import { createAppwriteClient } from "./client"; import { registerCommands } from "./commands/registerCommands"; import { ext } from "./extensionVariables"; -import { getActiveProjectConfiguration, getActiveProjectId, getDefaultProject } from "./settings"; +import { getActiveProjectConfiguration } from "./settings"; import { DatabaseTreeItemProvider } from "./tree/database/DatabaseTreeItemProvider"; import { HealthTreeItemProvider } from "./tree/health/HealthTreeItemProvider"; -import { ProjectsTreeItemProvider } from './tree/projects/ProjectsTreeItemProvider'; +import { ProjectsTreeItemProvider } from "./tree/projects/ProjectsTreeItemProvider"; import { StorageTreeItemProvider } from "./tree/storage/StorageTreeItemProvider"; import { UserTreeItemProvider } from "./tree/users/UserTreeItemProvider"; import { createAppwriteOutputChannel } from "./ui/AppwriteOutputChannel"; @@ -25,9 +24,7 @@ export async function activate(context: vscode.ExtensionContext): Promise vscode.window.registerTreeDataProvider("Projects", projectsTreeItemProvider); const activeProject = await getActiveProjectConfiguration(); - if (activeProject) { - initAppwriteClient(activeProject); - } + createAppwriteClient(activeProject); ext.context = context; ext.outputChannel = createAppwriteOutputChannel("Appwrite", "appwrite"); @@ -37,10 +34,8 @@ export async function activate(context: vscode.ExtensionContext): Promise health: healthTreeItemProvider, database: databaseTreeItemProvider, storage: storageTreeItemProvider, - projects: projectsTreeItemProvider + projects: projectsTreeItemProvider, }; registerCommands(context); } - -export function deactivate() {} diff --git a/src/extensionVariables.ts b/src/extensionVariables.ts index f647c09..b212359 100644 --- a/src/extensionVariables.ts +++ b/src/extensionVariables.ts @@ -1,4 +1,4 @@ -import { ExtensionContext, OutputChannel } from "vscode"; +import { ExtensionContext } from "vscode"; import { DatabaseTreeItemProvider } from './tree/database/DatabaseTreeItemProvider'; import { HealthTreeItemProvider } from './tree/health/HealthTreeItemProvider'; import { ProjectsTreeItemProvider } from './tree/projects/ProjectsTreeItemProvider'; diff --git a/src/settings.ts b/src/settings.ts index 100d600..55bd14b 100644 --- a/src/settings.ts +++ b/src/settings.ts @@ -1,5 +1,5 @@ import { workspace } from "vscode"; -import { initAppwriteClient } from "./client"; +import { createAppwriteClient } from "./client"; export type AppwriteProjectConfiguration = { nickname?: string; @@ -64,9 +64,7 @@ export async function setActiveProjectId(projectId: string): Promise { const configuration = workspace.getConfiguration("appwrite"); await configuration.update("activeProjectId", projectId, true); const active = await getActiveProjectConfiguration(); - if (active) { - initAppwriteClient(active); - } + createAppwriteClient(active); } export async function updateActiveProjectId(): Promise { @@ -75,17 +73,12 @@ export async function updateActiveProjectId(): Promise { const configuration = workspace.getConfiguration("appwrite"); await configuration.update("activeProjectId", projects[0].projectId, true); const active = await getActiveProjectConfiguration(); - if (active) { - initAppwriteClient(active); - } + createAppwriteClient(active); } } export async function removeProjectConfig(projectId: string): Promise { const projects = await getAppwriteProjects(); - - const activeProjectId = await getActiveProjectId(); - const updatedProjects = projects.filter((project) => project.projectId !== projectId); const configuration = workspace.getConfiguration("appwrite"); await configuration.update("projects", updatedProjects, true); diff --git a/src/tree/CollapsableTreeItem.ts b/src/tree/CollapsableTreeItem.ts index d2e7bd5..6eeeb7b 100644 --- a/src/tree/CollapsableTreeItem.ts +++ b/src/tree/CollapsableTreeItem.ts @@ -1,6 +1,5 @@ -import { ThemeIcon, TreeItem, TreeItemCollapsibleState } from "vscode"; +import { TreeItem, TreeItemCollapsibleState } from "vscode"; import { AppwriteTreeItemBase } from "../ui/AppwriteTreeItemBase"; -import { ChildTreeItem } from "./ChildTreeItem"; export class CollapsableTreeItem extends AppwriteTreeItemBase { constructor(parent: Parent, item: Partial & { label: string }, private readonly children: TreeItem[], public readonly brand?: string) { diff --git a/src/tree/database/CollectionTreeItem.ts b/src/tree/database/CollectionTreeItem.ts index c8ff6fc..22c3a02 100644 --- a/src/tree/database/CollectionTreeItem.ts +++ b/src/tree/database/CollectionTreeItem.ts @@ -1,11 +1,11 @@ import { ThemeIcon, TreeItem, TreeItemCollapsibleState } from "vscode"; import { Collection } from "../../appwrite"; -import { databaseClient } from '../../client'; -import { AppwriteTreeItemBase } from '../../ui/AppwriteTreeItemBase'; -import { DatabaseTreeItemProvider } from './DatabaseTreeItemProvider'; -import { DocumentsTreeItem } from './DocumentsTreeItem'; -import { PermissionsTreeItem } from './settings/PermissionsTreeItem'; -import { RulesTreeItem } from './settings/RulesTreeItem'; +import { databaseClient } from "../../client"; +import { AppwriteTreeItemBase } from "../../ui/AppwriteTreeItemBase"; +import { DatabaseTreeItemProvider } from "./DatabaseTreeItemProvider"; +import { DocumentsTreeItem } from "./DocumentsTreeItem"; +import { PermissionsTreeItem } from "./settings/PermissionsTreeItem"; +import { RulesTreeItem } from "./settings/RulesTreeItem"; export class CollectionTreeItem extends AppwriteTreeItemBase { constructor(public collection: Collection, public readonly provider: DatabaseTreeItemProvider) { @@ -17,7 +17,10 @@ export class CollectionTreeItem extends AppwriteTreeItemBase { } public async refresh(): Promise { - this.collection = await databaseClient.getCollection(this.collection.$id) ?? this.collection; + if (!databaseClient) { + return; + } + this.collection = (await databaseClient.getCollection(this.collection.$id)) ?? this.collection; this.provider.refreshChild(this); } @@ -25,5 +28,5 @@ export class CollectionTreeItem extends AppwriteTreeItemBase { contextValue = "collection"; - iconPath = new ThemeIcon('folder'); + iconPath = new ThemeIcon("folder"); } diff --git a/src/tree/database/DatabaseTreeItemProvider.ts b/src/tree/database/DatabaseTreeItemProvider.ts index 46bbb0c..35dacff 100644 --- a/src/tree/database/DatabaseTreeItemProvider.ts +++ b/src/tree/database/DatabaseTreeItemProvider.ts @@ -1,7 +1,7 @@ import * as vscode from "vscode"; import { client } from "../../client"; import AppwriteCall from "../../utils/AppwriteCall"; -import { Collection, CollectionsList, DocumentsList } from "../../appwrite"; +import { Collection, CollectionsList } from "../../appwrite"; import { CollectionTreeItem } from "./CollectionTreeItem"; import { AppwriteSDK } from "../../constants"; import { AppwriteTreeItemBase } from "../../ui/AppwriteTreeItemBase"; @@ -14,8 +14,6 @@ export class DatabaseTreeItemProvider implements vscode.TreeDataProvider = this._onDidChangeTreeData.event; - constructor() {} - refresh(): void { ext.outputChannel?.appendLine('refresh database'); this._onDidChangeTreeData.fire(); @@ -39,7 +37,7 @@ export class DatabaseTreeItemProvider implements vscode.TreeDataProvider(databaseSdk.listCollections()); if (collectionsList) { diff --git a/src/tree/database/DocumentTreeItem.ts b/src/tree/database/DocumentTreeItem.ts index 3382ce6..fe420ee 100644 --- a/src/tree/database/DocumentTreeItem.ts +++ b/src/tree/database/DocumentTreeItem.ts @@ -3,6 +3,7 @@ import { ChildTreeItem } from '../ChildTreeItem'; import { DocumentsTreeItem } from './DocumentsTreeItem'; export class DocumentTreeItem extends ChildTreeItem { + // eslint-disable-next-line @typescript-eslint/no-explicit-any constructor(parent: DocumentsTreeItem, public readonly document: Record) { super(parent, { label: document['$id'], diff --git a/src/tree/database/DocumentsTreeItem.ts b/src/tree/database/DocumentsTreeItem.ts index 5fcfbd8..314c58c 100644 --- a/src/tree/database/DocumentsTreeItem.ts +++ b/src/tree/database/DocumentsTreeItem.ts @@ -9,13 +9,12 @@ import { CollectionTreeItem } from "./CollectionTreeItem"; import { DocumentTreeItem } from "./DocumentTreeItem"; export class DocumentsTreeItem extends AppwriteTreeItemBase { - window: any; constructor(parent: CollectionTreeItem) { super(parent, "Documents"); } public async getChildren(): Promise { - let databaseSdk = new AppwriteSDK.Database(client); + const databaseSdk = new AppwriteSDK.Database(client); const documentList = await AppwriteCall(databaseSdk.listDocuments(this.parent.collection.$id)); if (documentList === undefined) { return []; diff --git a/src/tree/database/settings/PermissionTreeItem.ts b/src/tree/database/settings/PermissionTreeItem.ts index 35ebfe1..d4c76a5 100644 --- a/src/tree/database/settings/PermissionTreeItem.ts +++ b/src/tree/database/settings/PermissionTreeItem.ts @@ -1,4 +1,3 @@ -import { AppwriteTreeItemBase } from "../../../ui/AppwriteTreeItemBase"; import { ChildTreeItem } from "../../ChildTreeItem"; import { PermissionsTreeItem } from "./PermissionsTreeItem"; diff --git a/src/tree/database/settings/RuleTreeItem.ts b/src/tree/database/settings/RuleTreeItem.ts index de58d36..7d635ac 100644 --- a/src/tree/database/settings/RuleTreeItem.ts +++ b/src/tree/database/settings/RuleTreeItem.ts @@ -1,4 +1,3 @@ -import { TreeItem } from "vscode"; import { Rule } from "../../../appwrite"; import { ChildTreeItem } from "../../ChildTreeItem"; import { RulesTreeItem } from "./RulesTreeItem"; diff --git a/src/tree/health/HealthTreeItem.ts b/src/tree/health/HealthTreeItem.ts index fb42c96..db9a53a 100644 --- a/src/tree/health/HealthTreeItem.ts +++ b/src/tree/health/HealthTreeItem.ts @@ -2,7 +2,7 @@ import * as vscode from "vscode"; import { MarkdownString } from 'vscode'; export class HealthTreeItem extends vscode.TreeItem { - constructor(public readonly label: string, status: any, tooltip?: string | MarkdownString | undefined) { + constructor(public readonly label: string, status: "check" | "error" | any, tooltip?: string | MarkdownString | undefined) { super(label); console.log(status); this.label = label; diff --git a/src/tree/health/HealthTreeItemProvider.ts b/src/tree/health/HealthTreeItemProvider.ts index 7752ce3..95970b3 100644 --- a/src/tree/health/HealthTreeItemProvider.ts +++ b/src/tree/health/HealthTreeItemProvider.ts @@ -3,15 +3,12 @@ import { healthClient } from "../../client"; import { ext } from "../../extensionVariables"; import { HealthTreeItem } from "./HealthTreeItem"; import * as dayjs from "dayjs"; -import * as relativeTime from "dayjs/plugin/relativeTime"; import * as localizedFormat from "dayjs/plugin/localizedFormat"; import { healthTooltips } from "../../appwrite/Health"; import { AppwriteHealth } from "../../appwrite"; // dayjs.extend(relativeTime); dayjs.extend(localizedFormat); -type PartialRecord = { [P in K]?: T }; - export class HealthTreeItemProvider implements vscode.TreeDataProvider { private _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter< HealthTreeItem | undefined | void @@ -21,8 +18,6 @@ export class HealthTreeItemProvider implements vscode.TreeDataProvider = this._onDidChangeTreeData.event; - constructor() {} - refresh(): void { this._onDidChangeTreeData.fire(); } diff --git a/src/tree/projects/ProjectsTreeItemProvider.ts b/src/tree/projects/ProjectsTreeItemProvider.ts index 1e4ff91..b6922d7 100644 --- a/src/tree/projects/ProjectsTreeItemProvider.ts +++ b/src/tree/projects/ProjectsTreeItemProvider.ts @@ -1,6 +1,6 @@ import * as vscode from "vscode"; -import { getActiveProjectId, getAppwriteProjects } from '../../settings'; -import { ProjectTreeItem } from './ProjectTreeItem'; +import { getActiveProjectId, getAppwriteProjects } from "../../settings"; +import { ProjectTreeItem } from "./ProjectTreeItem"; export class ProjectsTreeItemProvider implements vscode.TreeDataProvider { private _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter< @@ -9,7 +9,13 @@ export class ProjectsTreeItemProvider implements vscode.TreeDataProvider = this._onDidChangeTreeData.event; - constructor() {} + constructor() { + vscode.workspace.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration("appwrite")) { + this.refresh(); + } + }); + } refresh(): void { this._onDidChangeTreeData.fire(); @@ -19,7 +25,7 @@ export class ProjectsTreeItemProvider implements vscode.TreeDataProvider { + async getChildren(_element?: vscode.TreeItem): Promise { const configs = await getAppwriteProjects(); if (configs === undefined || configs.length === 0) { return []; diff --git a/src/tree/storage/StorageTreeItemProvider.ts b/src/tree/storage/StorageTreeItemProvider.ts index 14a6dbf..42877c0 100644 --- a/src/tree/storage/StorageTreeItemProvider.ts +++ b/src/tree/storage/StorageTreeItemProvider.ts @@ -9,8 +9,6 @@ export class StorageTreeItemProvider implements vscode.TreeDataProvider = this._onDidChangeTreeData.event; - constructor() {} - refresh(): void { this._onDidChangeTreeData.fire(); } @@ -19,7 +17,7 @@ export class StorageTreeItemProvider implements vscode.TreeDataProvider { + async getChildren(_element?: vscode.TreeItem): Promise { if (storageClient === undefined) { return []; } diff --git a/src/tree/users/UserTreeItemProvider.ts b/src/tree/users/UserTreeItemProvider.ts index 799db46..f2d73ff 100644 --- a/src/tree/users/UserTreeItemProvider.ts +++ b/src/tree/users/UserTreeItemProvider.ts @@ -6,6 +6,7 @@ import { ThemeIcon } from "vscode"; import { UserPrefsTreeItem } from "./properties/UserPrefsTreeItem"; import { ChildTreeItem } from "../ChildTreeItem"; import { UserTreeItem } from "./UserTreeItem"; +// eslint-disable-next-line @typescript-eslint/no-var-requires const sdk = require("node-appwrite"); export class UserTreeItemProvider implements vscode.TreeDataProvider { @@ -15,8 +16,6 @@ export class UserTreeItemProvider implements vscode.TreeDataProvider = this._onDidChangeTreeData.event; - constructor() {} - refresh(): void { this._onDidChangeTreeData.fire(); } @@ -63,10 +62,10 @@ export class UserTreeItemProvider implements vscode.TreeDataProvider(usersSdk.list()); if (usersList) { - const userTreeItems = usersList.users.map((user: any) => new UserTreeItem(user)) ?? []; + const userTreeItems = usersList.users.map((user: User) => new UserTreeItem(user)) ?? []; const headerItem: vscode.TreeItem = { label: `Total users: ${usersList.sum}`, }; diff --git a/src/ui/AppwriteOutputChannel.ts b/src/ui/AppwriteOutputChannel.ts index 7d84cae..7437925 100644 --- a/src/ui/AppwriteOutputChannel.ts +++ b/src/ui/AppwriteOutputChannel.ts @@ -6,7 +6,7 @@ import { OutputChannel, ViewColumn, window, workspace, WorkspaceConfiguration } from "vscode"; // tslint:disable-next-line: export-name -export function createAppwriteOutputChannel(name: string, extensionPrefix: string) { +export function createAppwriteOutputChannel(name: string, extensionPrefix: string): AppwriteOutputChannel { return new AppwriteOutputChannel(name, extensionPrefix); } @@ -50,8 +50,8 @@ export class AppwriteOutputChannel { public show(preserveFocus?: boolean | undefined): void; public show(column?: ViewColumn | undefined, preserveFocus?: boolean | undefined): void; - // tslint:disable-next-line: no-any - public show(_column?: any, preserveFocus?: boolean | undefined): void { + // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types + public show(_column?: unknown, preserveFocus?: boolean | undefined): void { this._outputChannel.show(preserveFocus); } diff --git a/src/ui/AppwriteTreeItemBase.ts b/src/ui/AppwriteTreeItemBase.ts index b78e118..00fd410 100644 --- a/src/ui/AppwriteTreeItemBase.ts +++ b/src/ui/AppwriteTreeItemBase.ts @@ -1,4 +1,4 @@ -import { TreeDataProvider, TreeItem } from "vscode"; +import { TreeItem } from "vscode"; export abstract class AppwriteTreeItemBase extends TreeItem { constructor(public readonly parent: Parent, label: string) { diff --git a/src/ui/BaseEditor.ts b/src/ui/BaseEditor.ts index 70dee73..ee60000 100644 --- a/src/ui/BaseEditor.ts +++ b/src/ui/BaseEditor.ts @@ -93,7 +93,7 @@ export abstract class BaseEditor implements vscode.Disposable { } private async updateEditor(data: string, textEditor?: vscode.TextEditor): Promise { - if (!!textEditor) { + if (textEditor) { await BaseEditor.writeToEditor(textEditor, data); this.ignoreSave = true; try { diff --git a/src/ui/createRuleWizard.ts b/src/ui/createRuleWizard.ts index bb3638d..3df637a 100644 --- a/src/ui/createRuleWizard.ts +++ b/src/ui/createRuleWizard.ts @@ -1,5 +1,4 @@ import { QuickPickItem, window } from "vscode"; -import { AppwriteProjectConfiguration } from "../settings"; export type CreateRuleWizardContext = { label: string; diff --git a/src/utils/refreshTree.ts b/src/utils/refreshTree.ts index 44be769..b54d098 100644 --- a/src/utils/refreshTree.ts +++ b/src/utils/refreshTree.ts @@ -8,8 +8,8 @@ export function refreshTree(...trees: (keyof AppwriteTree)[]): void { export function refreshAllViews(): void { if (ext.tree) { - Object.keys(ext.tree).forEach((tree) => { + for (const tree in ext.tree) { refreshTree(tree as keyof AppwriteTree); - }); + } } }