diff --git a/command/upgrade/_check_version.ts b/command/upgrade/_check_version.ts index f32093bd..962729d4 100644 --- a/command/upgrade/_check_version.ts +++ b/command/upgrade/_check_version.ts @@ -10,6 +10,11 @@ export async function checkVersion(cmd: Command): Promise { if (!isUpgradeCommand(upgradeCommand)) { return; } + + if (!await upgradeCommand.hasRequiredPermissions()) { + // If not all required permissions were pre-granted, skip the version check to prevent prompting user + return; + } const latestVersion = await upgradeCommand.getLatestVersion(); const currentVersion = mainCommand.getVersion(); @@ -23,9 +28,11 @@ export async function checkVersion(cmd: Command): Promise { } function isUpgradeCommand(command: unknown): command is UpgradeCommandImpl { - return command instanceof Command && "getLatestVersion" in command; + return command instanceof Command && "getLatestVersion" in command && + "hasRequiredPermissions" in command; } interface UpgradeCommandImpl { + hasRequiredPermissions(): Promise; getLatestVersion(): Promise; } diff --git a/command/upgrade/provider.ts b/command/upgrade/provider.ts index 38e09d4f..a4ac5119 100644 --- a/command/upgrade/provider.ts +++ b/command/upgrade/provider.ts @@ -21,6 +21,8 @@ export abstract class Provider { protected readonly maxListSize: number = 25; private maxCols = 8; + abstract hasRequiredPermissions(): Promise; + abstract getVersions(name: string): Promise; abstract getRepositoryUrl(name: string): string; diff --git a/command/upgrade/provider/deno_land.ts b/command/upgrade/provider/deno_land.ts index bd8844e5..4b7e09fe 100644 --- a/command/upgrade/provider/deno_land.ts +++ b/command/upgrade/provider/deno_land.ts @@ -8,6 +8,7 @@ export class DenoLandProvider extends Provider { name = "deno.land"; private readonly repositoryUrl = "https://deno.land/x/"; private readonly registryUrl = "https://deno.land/x/"; + private readonly apiUrl = "https://cdn.deno.land/"; private readonly moduleName?: string; constructor({ name }: DenoLandProviderOptions = {}) { @@ -15,11 +16,20 @@ export class DenoLandProvider extends Provider { this.moduleName = name; } + async hasRequiredPermissions(): Promise { + const apiUrl = new URL(this.apiUrl); + const permissionStatus = await Deno.permissions.query({ + name: "net", + host: apiUrl.host, + }); + return permissionStatus.state === "granted"; + } + async getVersions( name: string, ): Promise { const response = await fetch( - `https://cdn.deno.land/${this.moduleName ?? name}/meta/versions.json`, + `${this.apiUrl}${this.moduleName ?? name}/meta/versions.json`, ); if (!response.ok) { throw new Error( diff --git a/command/upgrade/provider/github.ts b/command/upgrade/provider/github.ts index 0f086d3b..cf2a538c 100644 --- a/command/upgrade/provider/github.ts +++ b/command/upgrade/provider/github.ts @@ -28,6 +28,15 @@ export class GithubProvider extends Provider { this.githubToken = token; } + async hasRequiredPermissions(): Promise { + const apiUrl = new URL(this.apiUrl); + const permissionStatus = await Deno.permissions.query({ + name: "net", + host: apiUrl.host, + }); + return permissionStatus.state === "granted"; + } + async getVersions( _name: string, ): Promise { diff --git a/command/upgrade/provider/nest_land.ts b/command/upgrade/provider/nest_land.ts index 1c54c464..0cf85c97 100644 --- a/command/upgrade/provider/nest_land.ts +++ b/command/upgrade/provider/nest_land.ts @@ -8,6 +8,7 @@ export class NestLandProvider extends Provider { name = "nest.land"; private readonly repositoryUrl = "https://nest.land/package/"; private readonly registryUrl = "https://x.nest.land/"; + private readonly apiUrl = "https://nest.land/api/"; private readonly moduleName?: string; constructor({ name }: NestLandProviderOptions = {}) { @@ -15,10 +16,19 @@ export class NestLandProvider extends Provider { this.moduleName = name; } + async hasRequiredPermissions(): Promise { + const apiUrl = new URL(this.apiUrl); + const permissionStatus = await Deno.permissions.query({ + name: "net", + host: apiUrl.host, + }); + return permissionStatus.state === "granted"; + } + async getVersions( name: string, ): Promise { - const response = await fetch(`https://nest.land/api/package-client`, { + const response = await fetch(`${this.apiUrl}package-client`, { method: "post", body: JSON.stringify({ data: { name: this.moduleName ?? name } }), headers: { "Content-Type": "application/json" }, diff --git a/command/upgrade/upgrade_command.ts b/command/upgrade/upgrade_command.ts index c9878be1..a771429c 100644 --- a/command/upgrade/upgrade_command.ts +++ b/command/upgrade/upgrade_command.ts @@ -89,6 +89,10 @@ export class UpgradeCommand extends Command { return versions; } + public async hasRequiredPermissions(): Promise { + return await this.getProvider().hasRequiredPermissions(); + } + public async getLatestVersion(): Promise { const { latest } = await this.getVersions(); return latest;