Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 33 additions & 33 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -859,143 +859,143 @@
{
"command": "discloud.apps.backup",
"group": "1",
"when": "view == discloudUserApps && discloudAppLength"
"when": "view == discloudUserApps && discloudUserAppCount"
},
{
"command": "discloud.apps.commit",
"group": "1",
"when": "view == discloudUserApps && discloudAppLength && workspaceFolderCount"
"when": "view == discloudUserApps && discloudUserAppCount && workspaceFolderCount"
},
{
"command": "discloud.apps.copy.id",
"when": "view == discloudUserApps && discloudAppLength"
"when": "view == discloudUserApps && discloudUserAppCount"
},
{
"command": "discloud.apps.delete",
"group": "1",
"when": "view == discloudUserApps && discloudAppLength"
"when": "view == discloudUserApps && discloudUserAppCount"
},
{
"command": "discloud.apps.import",
"group": "1",
"when": "view == discloudUserApps && discloudAppLength"
"when": "view == discloudUserApps && discloudUserAppCount"
},
{
"command": "discloud.apps.import",
"group": "inline",
"when": "view == discloudUserApps && discloudAppLength && viewItem =~ /^TreeItem/"
"when": "view == discloudUserApps && discloudUserAppCount && viewItem =~ /^TreeItem/"
},
{
"command": "discloud.apps.logs",
"when": "view == discloudUserApps && discloudAppLength"
"when": "view == discloudUserApps && discloudUserAppCount"
},
{
"command": "discloud.apps.logs",
"group": "inline",
"when": "view == discloudUserApps && discloudAppLength && viewItem =~ /^TreeItem/"
"when": "view == discloudUserApps && discloudUserAppCount && viewItem =~ /^TreeItem/"
},
{
"submenu": "discloud.apps.mods",
"when": "view == discloudUserApps && discloudAppLength"
"when": "view == discloudUserApps && discloudUserAppCount"
},
{
"command": "discloud.apps.profile.avatar",
"when": "view == discloudUserApps && discloudAppLength"
"when": "view == discloudUserApps && discloudUserAppCount"
},
{
"command": "discloud.apps.profile.name",
"when": "view == discloudUserApps && discloudAppLength"
"when": "view == discloudUserApps && discloudUserAppCount"
},
{
"command": "discloud.apps.ram",
"when": "view == discloudUserApps && discloudAppLength"
"when": "view == discloudUserApps && discloudUserAppCount"
},
{
"command": "discloud.apps.restart",
"group": "0",
"when": "view == discloudUserApps && discloudAppLength"
"when": "view == discloudUserApps && discloudUserAppCount"
},
{
"command": "discloud.apps.start",
"group": "0",
"when": "view == discloudUserApps && discloudAppLength && viewItem =~ /online\":false/"
"when": "view == discloudUserApps && discloudUserAppCount && viewItem =~ /online\":false/"
},
{
"command": "discloud.apps.status",
"group": "inline",
"when": "view == discloudUserApps && discloudAppLength && viewItem =~ /^TreeItem/"
"when": "view == discloudUserApps && discloudUserAppCount && viewItem =~ /^TreeItem/"
},
{
"command": "discloud.apps.stop",
"group": "0",
"when": "view == discloudUserApps && discloudAppLength && viewItem =~ /online\":true/"
"when": "view == discloudUserApps && discloudUserAppCount && viewItem =~ /online\":true/"
},
{
"command": "discloud.apps.terminal",
"group": "1",
"when": "view == discloudUserApps && discloudAppLength && viewItem =~ /online\":true/"
"when": "view == discloudUserApps && discloudUserAppCount && viewItem =~ /online\":true/"
},
{
"command": "discloud.upload",
"group": "inline",
"when": "view == discloudUserApps && !discloudAppLength && workspaceFolderCount"
"when": "view == discloudUserApps && !discloudUserAppCount && workspaceFolderCount"
},
{
"command": "discloud.team.backup",
"group": "1",
"when": "view == discloudTeamApps && discloudTeamAppLength && viewItem =~ /backup_app/"
"when": "view == discloudTeamApps && discloudTeamAppCount && viewItem =~ /backup_app/"
},
{
"command": "discloud.team.commit",
"group": "1",
"when": "view == discloudTeamApps && discloudTeamAppLength && workspaceFolderCount && viewItem =~ /commit_app/"
"when": "view == discloudTeamApps && discloudTeamAppCount && workspaceFolderCount && viewItem =~ /commit_app/"
},
{
"command": "discloud.team.copy.id",
"when": "view == discloudTeamApps && discloudTeamAppLength"
"when": "view == discloudTeamApps && discloudTeamAppCount"
},
{
"command": "discloud.team.import",
"group": "1",
"when": "view == discloudTeamApps && discloudTeamAppLength && viewItem =~ /backup_app/"
"when": "view == discloudTeamApps && discloudTeamAppCount && viewItem =~ /backup_app/"
},
{
"command": "discloud.team.import",
"group": "inline",
"when": "view == discloudTeamApps && discloudTeamAppLength && viewItem =~ /^TreeItem/ && viewItem =~ /backup_app/"
"when": "view == discloudTeamApps && discloudTeamAppCount && viewItem =~ /^TreeItem/ && viewItem =~ /backup_app/"
},
{
"command": "discloud.team.logs",
"when": "view == discloudTeamApps && discloudTeamAppLength && viewItem =~ /logs_app/"
"when": "view == discloudTeamApps && discloudTeamAppCount && viewItem =~ /logs_app/"
},
{
"command": "discloud.team.logs",
"group": "inline",
"when": "view == discloudTeamApps && discloudTeamAppLength && viewItem =~ /^TreeItem/ && viewItem =~ /logs_app/"
"when": "view == discloudTeamApps && discloudTeamAppCount && viewItem =~ /^TreeItem/ && viewItem =~ /logs_app/"
},
{
"command": "discloud.team.ram",
"when": "view == discloudTeamApps && discloudTeamAppLength && viewItem =~ /edit_ram/"
"when": "view == discloudTeamApps && discloudTeamAppCount && viewItem =~ /edit_ram/"
},
{
"command": "discloud.team.restart",
"group": "0",
"when": "view == discloudTeamApps && discloudTeamAppLength && viewItem =~ /restart_app/"
"when": "view == discloudTeamApps && discloudTeamAppCount && viewItem =~ /restart_app/"
},
{
"command": "discloud.team.start",
"group": "0",
"when": "view == discloudTeamApps && discloudTeamAppLength && viewItem =~ /start_app/ && viewItem =~ /online\":false/"
"when": "view == discloudTeamApps && discloudTeamAppCount && viewItem =~ /start_app/ && viewItem =~ /online\":false/"
},
{
"command": "discloud.team.status",
"group": "inline",
"when": "view == discloudTeamApps && discloudTeamAppLength && viewItem =~ /^TreeItem/"
"when": "view == discloudTeamApps && discloudTeamAppCount && viewItem =~ /^TreeItem/"
},
{
"command": "discloud.team.stop",
"group": "0",
"when": "view == discloudTeamApps && discloudTeamAppLength && viewItem =~ /stop_app/ && viewItem =~ /online\":true/"
"when": "view == discloudTeamApps && discloudTeamAppCount && viewItem =~ /stop_app/ && viewItem =~ /online\":true/"
},
{
"command": "discloud.user.copy.id",
Expand Down Expand Up @@ -1325,7 +1325,7 @@
"bytes": "^3.1.2",
"jose": "^6.2.8",
"json-schema-library": "^11.6.2",
"ws": "^8.21.1",
"ws": "^8.21.2",
"yocto-queue": "^1.2.2"
},
"devDependencies": {
Expand All @@ -1335,8 +1335,8 @@
"@types/node": "24",
"@types/vscode": "^1.125.0",
"@types/ws": "^8.18.1",
"@typescript-eslint/eslint-plugin": "^8.65.0",
"@typescript-eslint/parser": "^8.65.0",
"@typescript-eslint/eslint-plugin": "^8.66.0",
"@typescript-eslint/parser": "^8.66.0",
"@vscode/test-cli": "^0.0.15",
"@vscode/test-electron": "^3.1.0",
"esbuild": "^0.28.1",
Expand Down
7 changes: 7 additions & 0 deletions src/@enum/context.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export enum ExtensionContextId {
discloudAuthorized = "discloudAuthorized",
discloudInitialized = "discloudInitialized",
discloudTeamAppCount = "discloudTeamAppCount",
discloudUserAppCount = "discloudUserAppCount",
discloudUnauthorized = "discloudUnauthorized",
}
1 change: 1 addition & 0 deletions src/@enum/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export * from "./api";
export * from "./context";
38 changes: 23 additions & 15 deletions src/authentication/pat/provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,34 +71,42 @@ export default class DiscloudPatAuthenticationProvider implements IPatAuthentica
if (!response.ok)
throw await BaseAuthenticationError.fromStatusCode(response.status);

const body = await response.json() as RESTGetApiUserResult;
const body = await response.json().catch(() => null) as RESTGetApiUserResult | null;

const account: AuthenticationSessionAccountInformation = {
id: body.user.userID ?? defaultSessionAccount.id,
id: body?.user.userID ?? defaultSessionAccount.id,
label:
body.user.username ?? body.user.userID ?? defaultSessionAccount.label,
body?.user.username ?? body?.user.userID ?? defaultSessionAccount.label,
};

const promises = [];

const newSessionId = `${providerId}.${account.id}`;

const oldSessionId = this.storage.get<string>(GlobalStorageKeys.currentSessionId);
if (oldSessionId) {
sessionIdSet.delete(oldSessionId);
await Promise.all([
this.storage.update(oldSessionId, undefined),
this.secrets.delete(oldSessionId),
]);
}

sessionIdSet.add(newSessionId);
if (oldSessionId !== newSessionId) {
sessionIdSet.add(newSessionId);

await Promise.all([
this.storage.update(GlobalStorageKeys.sessionIdList, Array.from(sessionIdSet)),
if (oldSessionId) {
sessionIdSet.delete(oldSessionId);
promises.push(
this.storage.update(oldSessionId, undefined),
this.secrets.delete(oldSessionId),
);
}

promises.push(
this.storage.update(GlobalStorageKeys.sessionIdList, Array.from(sessionIdSet)),
this.storage.update(GlobalStorageKeys.currentSessionId, newSessionId),
);
}

await Promise.all(promises.concat(
this.storage.update(GlobalStorageKeys.currentAutenticationProviderId, providerId),
this.storage.update(GlobalStorageKeys.currentSessionId, newSessionId),
this.storage.update(newSessionId, account),
this.secrets.store(newSessionId, input),
]);
));

const newSession = new DiscloudAuthenticationSession(newSessionId, input, account);

Expand Down
42 changes: 18 additions & 24 deletions src/core/extension.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import { t } from "@vscode/l10n";
import { EventEmitter } from "events";
import { normalize } from "path";
import { type Disposable, type ExtensionContext, type LogOutputChannel, type OutputChannel, type SecretStorage, Uri, window, workspace } from "vscode";
import { commands, type Disposable, type ExtensionContext, type LogOutputChannel, type SecretStorage, Uri, window, workspace } from "vscode";
import { type ExtensionContextId } from "../@enum";
import type { Events, GetWorkspaceFolderOptions, IGlobalStateStorage, TaskData } from "../@types";
import AuthenticationProviderContainer from "../authentication/providers";
import { commandsRegister } from "../commands";
import { loadEvents } from "../events";
import DiscloudLogOutputChannel from "../output/LogOutputChannel";
import DiscloudOutputChannel from "../output/OutputChannel";
import CustomDomainTreeDataProvider from "../providers/CustomDomainTreeDataProvider";
import SubDomainTreeDataProvider from "../providers/SubDomainTreeDataProvider";
import TeamAppTreeDataProvider from "../providers/TeamAppTreeDataProvider";
Expand All @@ -23,6 +25,13 @@ import VSUser from "../structures/VSUser";
import { ConfigKeys } from "../utils/constants";
import FileSystem from "../utils/FileSystem";

const _workspaceIgnoreConfigKeys = Object.freeze([
ConfigKeys.appBackupDir,
ConfigKeys.appImportDir,
ConfigKeys.teamBackupDir,
ConfigKeys.teamImportDir,
]);

export default class ExtensionCore extends EventEmitter<Events> implements Disposable {
constructor() {
super({ captureRejections: true });
Expand All @@ -44,7 +53,6 @@ export default class ExtensionCore extends EventEmitter<Events> implements Dispo
declare readonly userAppTree: UserAppTreeDataProvider;
declare readonly userTree: UserTreeDataProvider;

readonly outputChannels = new Map<string, OutputChannel>();
readonly timers = new TimerMap();
readonly user = new VSUser();

Expand All @@ -70,12 +78,7 @@ export default class ExtensionCore extends EventEmitter<Events> implements Dispo
}

get workspaceIgnoreList() {
return [
ConfigKeys.appBackupDir,
ConfigKeys.appImportDir,
ConfigKeys.teamBackupDir,
ConfigKeys.teamImportDir,
]
return _workspaceIgnoreConfigKeys
.reduce<string[]>((acc, config) => {
const data = this.config.get<string>(config);
if (data) return acc.concat(normalize(data));
Expand All @@ -84,13 +87,16 @@ export default class ExtensionCore extends EventEmitter<Events> implements Dispo
.concat("discloud", `${workspace.name}.zip`);
}

async setContext(contextId: ExtensionContextId, ...values: any[]) {
await commands.executeCommand("setContext", contextId, ...values);
}

debug(...args: Parameters<LogOutputChannel["debug"]>) {
this.emit("debug", this, ...args);
}

dispose() {
this.removeAllListeners();
this.outputChannels.clear();
this.timers.dispose();
}

Expand All @@ -112,16 +118,8 @@ export default class ExtensionCore extends EventEmitter<Events> implements Dispo
return DiscloudLogOutputChannel.getInstance(this.context, name);
}

protected _createOutputChannel(key: string) {
const output = window.createOutputChannel(key);
this.context.subscriptions.push(output);
this.outputChannels.set(key, output);
return output;
}

getOutputChannel(name: string, languageId?: string) {
const key = `${name}${languageId}`;
return this.outputChannels.get(key) ?? this._createOutputChannel(key);
getOutputChannel(name: string) {
return DiscloudOutputChannel.getInstance(this.context, name);
}

async getWorkspaceFolder(options?: GetWorkspaceFolderOptions | null): Promise<Uri | undefined> {
Expand Down Expand Up @@ -151,12 +149,8 @@ export default class ExtensionCore extends EventEmitter<Events> implements Dispo
}
}

setContext(context: ExtensionContext) {
Object.defineProperties(this, { context: { value: context } });
}

async activate(context: ExtensionContext = this.context) {
if (!this.context) this.setContext(context);
Object.defineProperties(this, { context: { value: context } });

this.logger.debug("Activate: begin");

Expand Down
Loading
Loading