From 0140208753970b1dba470e6ff65293a1b12f8d87 Mon Sep 17 00:00:00 2001 From: Balu Babu Date: Mon, 5 Aug 2024 15:31:59 +0530 Subject: [PATCH 001/159] chore: user management api additions (#4231) * feat: added route to delete users in user management api's * chore: added lastLoggedOn and lastActiveOn fields to user response type * chore: changed return type * chore: changed target to prod for hopp-old-backend service --- .../src/admin/admin.service.ts | 2 +- .../src/infra-token/infra-token.controller.ts | 30 +++++++++++++++++++ .../src/infra-token/request-response.dto.ts | 15 ++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/packages/hoppscotch-backend/src/admin/admin.service.ts b/packages/hoppscotch-backend/src/admin/admin.service.ts index a55524a87..db0fba1c1 100644 --- a/packages/hoppscotch-backend/src/admin/admin.service.ts +++ b/packages/hoppscotch-backend/src/admin/admin.service.ts @@ -427,7 +427,7 @@ export class AdminService { * Remove a user account by UID * @param userUid User UID * @returns an Either of boolean or error - * @deprecated use removeUserAccounts instead + * */ async removeUserAccount(userUid: string) { const user = await this.userService.findUserById(userUid); diff --git a/packages/hoppscotch-backend/src/infra-token/infra-token.controller.ts b/packages/hoppscotch-backend/src/infra-token/infra-token.controller.ts index 67b12e5c9..77ddbc025 100644 --- a/packages/hoppscotch-backend/src/infra-token/infra-token.controller.ts +++ b/packages/hoppscotch-backend/src/infra-token/infra-token.controller.ts @@ -27,6 +27,7 @@ import { UpdateUserAdminStatusResponse, CreateUserInvitationRequest, CreateUserInvitationResponse, + DeleteUserResponse, } from './request-response.dto'; import * as E from 'fp-ts/Either'; import * as O from 'fp-ts/Option'; @@ -208,6 +209,35 @@ export class InfraTokensController { }); } + @Delete('users/:uid') + @ApiOkResponse({ + description: 'Delete a user from the instance', + type: DeleteUserResponse, + }) + @ApiBadRequestResponse({ type: ExceptionResponse }) + @ApiNotFoundResponse({ type: ExceptionResponse }) + async deleteUser(@Param('uid') uid: string) { + const deletedUser = await this.adminService.removeUserAccount(uid); + + if (E.isLeft(deletedUser)) { + const statusCode = + (deletedUser.left as string) === USER_NOT_FOUND + ? HttpStatus.NOT_FOUND + : HttpStatus.BAD_REQUEST; + + throwHTTPErr({ message: deletedUser.left, statusCode }); + } + + return plainToInstance( + DeleteUserResponse, + { message: deletedUser.right }, + { + excludeExtraneousValues: true, + enableImplicitConversion: true, + }, + ); + } + @Patch('users/:uid/admin-status') @ApiOkResponse({ description: 'Update user admin status', diff --git a/packages/hoppscotch-backend/src/infra-token/request-response.dto.ts b/packages/hoppscotch-backend/src/infra-token/request-response.dto.ts index 9bacfbf12..8e71b0e61 100644 --- a/packages/hoppscotch-backend/src/infra-token/request-response.dto.ts +++ b/packages/hoppscotch-backend/src/infra-token/request-response.dto.ts @@ -79,6 +79,14 @@ export class GetUserResponse { @ApiProperty() @Expose() isAdmin: boolean; + + @ApiProperty() + @Expose() + lastLoggedOn: Date; + + @ApiProperty() + @Expose() + lastActiveOn: Date; } // PATCH v1/infra/users/:uid @@ -113,3 +121,10 @@ export class ExceptionResponse { @Expose() statusCode: number; } + +// Delete v1/infra/users/:uid +export class DeleteUserResponse { + @ApiProperty() + @Expose() + message: string; +} From 5bccab0aa0e8ecb04a88f574057f8eed1dbb3601 Mon Sep 17 00:00:00 2001 From: Muhammed Ajmal M <55492635+ajmalmohad@users.noreply.github.com> Date: Tue, 6 Aug 2024 15:18:14 +0530 Subject: [PATCH 002/159] fix: add to parameters regex (#4238) --- .../src/services/context-menu/menu/parameter.menu.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hoppscotch-common/src/services/context-menu/menu/parameter.menu.ts b/packages/hoppscotch-common/src/services/context-menu/menu/parameter.menu.ts index 53f77afa4..211a5a02b 100644 --- a/packages/hoppscotch-common/src/services/context-menu/menu/parameter.menu.ts +++ b/packages/hoppscotch-common/src/services/context-menu/menu/parameter.menu.ts @@ -61,7 +61,7 @@ export class ParameterMenuService extends Service implements ContextMenu { text = url.search.slice(1) } - const regex = /(\w+)=(\w+)/g + const regex = /([^&=]+)=([^&]+)/g const matches = text.matchAll(regex) const params: Param = {} From f05966b3357dce5731b2bb6f6d00ec9bc89799bf Mon Sep 17 00:00:00 2001 From: artu-ole Date: Tue, 6 Aug 2024 15:05:50 +0300 Subject: [PATCH 003/159] fix: path not taken into account for socket.io connection without token auth (#4226) fix: path not taken into account for socket.io connection --- packages/hoppscotch-common/src/helpers/realtime/SIOClients.ts | 2 +- .../hoppscotch-common/src/helpers/realtime/SIOConnection.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/hoppscotch-common/src/helpers/realtime/SIOClients.ts b/packages/hoppscotch-common/src/helpers/realtime/SIOClients.ts index 83f3b25e8..abb4b059d 100644 --- a/packages/hoppscotch-common/src/helpers/realtime/SIOClients.ts +++ b/packages/hoppscotch-common/src/helpers/realtime/SIOClients.ts @@ -5,7 +5,7 @@ import { io as ClientV3, Socket as SocketV3 } from "socket.io-client-v3" type Options = { path: string - auth: { + auth?: { token: string | undefined } } diff --git a/packages/hoppscotch-common/src/helpers/realtime/SIOConnection.ts b/packages/hoppscotch-common/src/helpers/realtime/SIOConnection.ts index 5aeed9bc6..f010705d6 100644 --- a/packages/hoppscotch-common/src/helpers/realtime/SIOConnection.ts +++ b/packages/hoppscotch-common/src/helpers/realtime/SIOConnection.ts @@ -69,7 +69,7 @@ export class SIOConnection { }, }) } else { - this.socket.connect(url) + this.socket.connect(url, { path }) } this.socket.on("connect", () => { From 8e58b58b6f448bbdb9efc23996c1273a1c77e379 Mon Sep 17 00:00:00 2001 From: Paul Vogel Date: Tue, 6 Aug 2024 14:09:54 +0200 Subject: [PATCH 004/159] i18n: Add german translations for section "access token" (#4241) Add german translations for the access token section --- packages/hoppscotch-common/locales/de.json | 38 +++++++++++----------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/packages/hoppscotch-common/locales/de.json b/packages/hoppscotch-common/locales/de.json index a4380339d..f2c0172d4 100644 --- a/packages/hoppscotch-common/locales/de.json +++ b/packages/hoppscotch-common/locales/de.json @@ -1059,25 +1059,25 @@ }, "access_tokens": { "tab_title": "Tokens", - "section_title": "Personal Access Tokens", - "section_description": "Personal access tokens currently helps you connect the CLI to your Hoppscotch account", - "last_used_on": "Last used on", - "expires_on": "Expires on", - "no_expiration": "No expiration", - "expired": "Expired", - "copy_token_warning": "Make sure to copy your personal access token now. You won't be able to see it again!", - "token_purpose": "What's this token for?", - "expiration_label": "Expiration", - "scope_label": "Scope", - "workspace_read_only_access": "Read-only access to workspace data.", - "personal_workspace_access_limitation": "Personal Access Tokens can't access your personal workspace.", - "generate_token": "Generate Token", - "invalid_label": "Please provide a label for the token", - "no_expiration_verbose": "This token will never expire!", - "token_expires_on": "This token will expire on", - "generate_new_token": "Generate new token", - "generate_modal_title": "New Personal Access Token", - "deletion_success": "The access token {label} has been deleted" + "section_title": "Persönliche Zugangstoken", + "section_description": "Persönliche Zugangstoken helfen dir derzeit, das CLI mit deinem Hoppscotch-Konto zu verbinden", + "last_used_on": "Zuletzt verwendet am", + "expires_on": "Läuft ab am", + "no_expiration": "Kein Ablaufdatum", + "expired": "Abgelaufen", + "copy_token_warning": "Stelle sicher, dass du dein persönliches Zugangs-Token jetzt kopierst. Du wirst es nicht mehr sehen können!", + "token_purpose": "Wofür ist dieses Token?", + "expiration_label": "Ablaufdatum", + "scope_label": "Geltungsbereich", + "workspace_read_only_access": "Lesezugriff auf Arbeitsbereichsdaten.", + "personal_workspace_access_limitation": "Persönliche Zugangstoken können nicht auf deinen persönlichen Arbeitsbereich zugreifen.", + "generate_token": "Token generieren", + "invalid_label": "Bitte gib eine Bezeichnung für das Token an", + "no_expiration_verbose": "Dieses Token wird nie ablaufen!", + "token_expires_on": "Dieses Token verfällt am", + "generate_new_token": "Neues Token generieren", + "generate_modal_title": "Neues persönliches Zugangstoken", + "deletion_success": "Das persönliche Zugriffstoken {label} wurde gelöscht" }, "collection_runner": { "collection_id": "Collection ID", From 19086252971b48d075155ace043ed1d816bccb90 Mon Sep 17 00:00:00 2001 From: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com> Date: Tue, 6 Aug 2024 23:11:48 +0530 Subject: [PATCH 005/159] fix: use correct callback URL for GitHub provider infra config --- .../hoppscotch-sh-admin/src/composables/useConfigHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hoppscotch-sh-admin/src/composables/useConfigHandler.ts b/packages/hoppscotch-sh-admin/src/composables/useConfigHandler.ts index a01c5f210..81ff83b45 100644 --- a/packages/hoppscotch-sh-admin/src/composables/useConfigHandler.ts +++ b/packages/hoppscotch-sh-admin/src/composables/useConfigHandler.ts @@ -97,7 +97,7 @@ export function useConfigHandler(updatedConfigs?: ServerConfigs) { fields: { client_id: getFieldValue(InfraConfigEnum.GithubClientId), client_secret: getFieldValue(InfraConfigEnum.GithubClientSecret), - callback_url: getFieldValue(InfraConfigEnum.GoogleCallbackUrl), + callback_url: getFieldValue(InfraConfigEnum.GithubCallbackUrl), scope: getFieldValue(InfraConfigEnum.GithubScope), }, }, From 1fdb0f2d049c7d499a866e8524b86cec0e837877 Mon Sep 17 00:00:00 2001 From: James George <25279263+jamesgeorge007@users.noreply.github.com> Date: Wed, 7 Aug 2024 09:12:37 -0700 Subject: [PATCH 006/159] chore: hide duplicate `Global environment` action for a team workspace (#4245) --- .../src/components/environments/index.vue | 7 ++- .../environments/my/Environment.vue | 63 +++++++++++-------- 2 files changed, 42 insertions(+), 28 deletions(-) diff --git a/packages/hoppscotch-common/src/components/environments/index.vue b/packages/hoppscotch-common/src/components/environments/index.vue index 78aa25f1c..cc239d7d6 100644 --- a/packages/hoppscotch-common/src/components/environments/index.vue +++ b/packages/hoppscotch-common/src/components/environments/index.vue @@ -7,11 +7,12 @@ - + ({ variables: globalEnv.value, })) +const isPersonalEnvironmentType = computed( + () => environmentType.value.type === "my-environments" +) + const currentUser = useReadonlyStream( platform.auth.getCurrentUserStream(), platform.auth.getCurrentUser() diff --git a/packages/hoppscotch-common/src/components/environments/my/Environment.vue b/packages/hoppscotch-common/src/components/environments/my/Environment.vue index e5f8a80ea..0a1189a51 100644 --- a/packages/hoppscotch-common/src/components/environments/my/Environment.vue +++ b/packages/hoppscotch-common/src/components/environments/my/Environment.vue @@ -1,7 +1,7 @@ @@ -134,8 +142,10 @@ import IconWrapText from "~icons/lucide/wrap-text" import jsonToLanguage from "~/helpers/utils/json-to-language" import { watch } from "vue" import { GQLTabService } from "~/services/tab/graphql" +import { useColorMode } from "~/composables/theming" const t = useI18n() +const colorMode = useColorMode() defineProps<{ show: boolean @@ -189,7 +199,10 @@ const errorState = ref(false) const interfaceCode = ref("") const setInterfaceCode = async () => { - const res = await jsonToLanguage(selectedInterface.value, response.value) + const res = await jsonToLanguage( + selectedInterface.value, + response.value || "{}" + ) // to avoid possible errors empty object is passed interfaceCode.value = res.lines.join("\n") } diff --git a/packages/hoppscotch-common/src/helpers/RequestRunner.ts b/packages/hoppscotch-common/src/helpers/RequestRunner.ts index 685c6d0f1..6ac2ac8d7 100644 --- a/packages/hoppscotch-common/src/helpers/RequestRunner.ts +++ b/packages/hoppscotch-common/src/helpers/RequestRunner.ts @@ -247,7 +247,7 @@ export function runRESTRequest$( combineEnvVariables(finalEnvs) ) - const effectiveRequest = getEffectiveRESTRequest(finalRequest, { + const effectiveRequest = await getEffectiveRESTRequest(finalRequest, { id: "env-id", v: 1, name: "Env", @@ -321,7 +321,7 @@ export function runRESTRequest$( { name: env.name, v: 1, - id: env.id ?? "", + id: "id" in env ? env.id : "", variables: updatedRunResult.envs.selected, } ) diff --git a/packages/hoppscotch-common/src/helpers/utils/EffectiveURL.ts b/packages/hoppscotch-common/src/helpers/utils/EffectiveURL.ts index 1b1bcaf03..c1cc5a258 100644 --- a/packages/hoppscotch-common/src/helpers/utils/EffectiveURL.ts +++ b/packages/hoppscotch-common/src/helpers/utils/EffectiveURL.ts @@ -1,30 +1,32 @@ +import { + Environment, + FormDataKeyValue, + HoppRESTAuth, + HoppRESTHeader, + HoppRESTHeaders, + HoppRESTParam, + HoppRESTParams, + HoppRESTReqBody, + HoppRESTRequest, + parseBodyEnvVariables, + parseRawKeyValueEntriesE, + parseTemplateString, + parseTemplateStringE, +} from "@hoppscotch/data" +import { AwsV4Signer } from "aws4fetch" import * as A from "fp-ts/Array" import * as E from "fp-ts/Either" +import { flow, pipe } from "fp-ts/function" import * as O from "fp-ts/Option" import * as RA from "fp-ts/ReadonlyArray" import * as S from "fp-ts/string" import qs from "qs" -import { flow, pipe } from "fp-ts/function" import { combineLatest, Observable } from "rxjs" import { map } from "rxjs/operators" -import { - FormDataKeyValue, - HoppRESTReqBody, - HoppRESTRequest, - parseTemplateString, - parseBodyEnvVariables, - Environment, - HoppRESTHeader, - HoppRESTParam, - parseRawKeyValueEntriesE, - parseTemplateStringE, - HoppRESTAuth, - HoppRESTHeaders, -} from "@hoppscotch/data" + import { arrayFlatMap, arraySort } from "../functional/array" import { toFormData } from "../functional/formData" import { tupleWithSameKeysToRecord } from "../functional/record" -import { AwsV4Signer } from "aws4fetch" export interface EffectiveHoppRESTRequest extends HoppRESTRequest { /** @@ -33,8 +35,8 @@ export interface EffectiveHoppRESTRequest extends HoppRESTRequest { * This contains path, params and environment variables all applied to it */ effectiveFinalURL: string - effectiveFinalHeaders: { key: string; value: string }[] - effectiveFinalParams: { key: string; value: string }[] + effectiveFinalHeaders: HoppRESTHeaders + effectiveFinalParams: HoppRESTParams effectiveFinalBody: FormData | string | null effectiveFinalRequestVariables: { key: string; value: string }[] } @@ -502,6 +504,7 @@ export async function getEffectiveRESTRequest( false, showKeyIfSecret ), + description: x.description, })) ) @@ -525,6 +528,7 @@ export async function getEffectiveRESTRequest( false, showKeyIfSecret ), + description: x.description, })) ) From 3b29a56ba0f2f1824eec3729773d8996cddc1ea3 Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Sun, 1 Sep 2024 21:31:29 +0530 Subject: [PATCH 043/159] chore: bump version to 2024.8.1 --- packages/hoppscotch-backend/package.json | 2 +- packages/hoppscotch-common/package.json | 2 +- packages/hoppscotch-selfhost-desktop/package.json | 2 +- packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock | 2 +- packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml | 2 +- packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json | 2 +- packages/hoppscotch-selfhost-web/package.json | 2 +- packages/hoppscotch-sh-admin/package.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/hoppscotch-backend/package.json b/packages/hoppscotch-backend/package.json index f91bf9d31..e70eacffa 100644 --- a/packages/hoppscotch-backend/package.json +++ b/packages/hoppscotch-backend/package.json @@ -1,6 +1,6 @@ { "name": "hoppscotch-backend", - "version": "2024.8.0", + "version": "2024.8.1", "description": "", "author": "", "private": true, diff --git a/packages/hoppscotch-common/package.json b/packages/hoppscotch-common/package.json index b909e201d..852b3bde1 100644 --- a/packages/hoppscotch-common/package.json +++ b/packages/hoppscotch-common/package.json @@ -1,7 +1,7 @@ { "name": "@hoppscotch/common", "private": true, - "version": "2024.8.0", + "version": "2024.8.1", "scripts": { "dev": "pnpm exec npm-run-all -p -l dev:*", "test": "vitest --run", diff --git a/packages/hoppscotch-selfhost-desktop/package.json b/packages/hoppscotch-selfhost-desktop/package.json index 710cb1d64..65f886b72 100644 --- a/packages/hoppscotch-selfhost-desktop/package.json +++ b/packages/hoppscotch-selfhost-desktop/package.json @@ -1,7 +1,7 @@ { "name": "@hoppscotch/selfhost-desktop", "private": true, - "version": "2024.8.0", + "version": "2024.8.1", "type": "module", "scripts": { "dev:vite": "vite", diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock index 79cdb196f..f33693c50 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock @@ -1296,7 +1296,7 @@ dependencies = [ [[package]] name = "hoppscotch-desktop" -version = "24.8.0" +version = "24.8.1" dependencies = [ "cocoa 0.25.0", "dashmap", diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml index c33e20b36..7858bff15 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hoppscotch-desktop" -version = "24.8.0" +version = "24.8.1" description = "A Tauri App" authors = ["you"] license = "" diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json b/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json index c43019942..a3fbdedc4 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "Hoppscotch", - "version": "24.8.0" + "version": "24.8.1" }, "tauri": { "allowlist": { diff --git a/packages/hoppscotch-selfhost-web/package.json b/packages/hoppscotch-selfhost-web/package.json index dff3a9c6f..4eee6f3fe 100644 --- a/packages/hoppscotch-selfhost-web/package.json +++ b/packages/hoppscotch-selfhost-web/package.json @@ -1,7 +1,7 @@ { "name": "@hoppscotch/selfhost-web", "private": true, - "version": "2024.8.0", + "version": "2024.8.1", "type": "module", "scripts": { "dev:vite": "vite", diff --git a/packages/hoppscotch-sh-admin/package.json b/packages/hoppscotch-sh-admin/package.json index 3d5b6844b..bc2d9411a 100644 --- a/packages/hoppscotch-sh-admin/package.json +++ b/packages/hoppscotch-sh-admin/package.json @@ -1,7 +1,7 @@ { "name": "hoppscotch-sh-admin", "private": true, - "version": "2024.8.0", + "version": "2024.8.1", "type": "module", "scripts": { "dev": "pnpm exec npm-run-all -p -l dev:*", From a3956433874d2e8e4d7c90b162217207f3447bff Mon Sep 17 00:00:00 2001 From: James George <25279263+jamesgeorge007@users.noreply.github.com> Date: Tue, 10 Sep 2024 00:23:33 -0700 Subject: [PATCH 044/159] fix: ensure cross-platform compatibility with file exports (#4336) --- .../components/collections/ImportExport.vue | 33 +++++++----- .../collections/graphql/ImportExport.vue | 8 +-- .../components/environments/ImportExport.vue | 50 +++++++++---------- .../environments/my/Environment.vue | 12 +++-- .../environments/teams/Environment.vue | 11 ++-- .../import-export/export/environment.ts | 43 ++++++---------- .../src/helpers/import-export/export/index.ts | 44 ++++++++-------- .../hoppscotch-common/src/platform/std/io.ts | 20 ++++---- 8 files changed, 114 insertions(+), 107 deletions(-) diff --git a/packages/hoppscotch-common/src/components/collections/ImportExport.vue b/packages/hoppscotch-common/src/components/collections/ImportExport.vue index 7bc85c676..726ea4eb5 100644 --- a/packages/hoppscotch-common/src/components/collections/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/collections/ImportExport.vue @@ -48,7 +48,7 @@ import { getTeamCollectionJSON } from "~/helpers/backend/helpers" import { platform } from "~/platform" -import { initializeDownloadCollection } from "~/helpers/import-export/export" +import { initializeDownloadFile } from "~/helpers/import-export/export" import { gistExporter } from "~/helpers/import-export/export/gist" import { myCollectionsExporter } from "~/helpers/import-export/export/myCollections" import { teamCollectionsExporter } from "~/helpers/import-export/export/teamCollections" @@ -389,27 +389,27 @@ const HoppMyCollectionsExporter: ImporterOrExporter = { applicableTo: ["personal-workspace"], isLoading: isHoppMyCollectionExporterInProgress, }, - action: () => { + action: async () => { if (!myCollections.value.length) { return toast.error(t("error.no_collections_to_export")) } isHoppMyCollectionExporterInProgress.value = true - const message = initializeDownloadCollection( + const message = await initializeDownloadFile( myCollectionsExporter(myCollections.value), - "Collections" + "hoppscotch-personal-collections" ) - if (E.isRight(message)) { - toast.success(t(message.right)) + E.isRight(message) + ? toast.success(t(message.right)) + : toast.error(t(message.left)) - platform.analytics?.logEvent({ - type: "HOPP_EXPORT_COLLECTION", - exporter: "json", - platform: "rest", - }) - } + platform.analytics?.logEvent({ + type: "HOPP_EXPORT_COLLECTION", + exporter: "json", + platform: "rest", + }) isHoppMyCollectionExporterInProgress.value = false }, @@ -436,7 +436,14 @@ const HoppTeamCollectionsExporter: ImporterOrExporter = { ) if (E.isRight(res)) { - initializeDownloadCollection(res.right, "team-collections") + const message = await initializeDownloadFile( + res.right, + "hoppscotch-team-collections" + ) + + E.isRight(message) + ? toast.success(t(message.right)) + : toast.error(t(message.left)) platform.analytics?.logEvent({ type: "HOPP_EXPORT_COLLECTION", diff --git a/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue b/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue index a9dc667b8..18062ca95 100644 --- a/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue @@ -21,7 +21,7 @@ import { GistSource } from "~/helpers/import-export/import/import-sources/GistSo import IconFolderPlus from "~icons/lucide/folder-plus" import IconUser from "~icons/lucide/user" -import { initializeDownloadCollection } from "~/helpers/import-export/export" +import { initializeDownloadFile } from "~/helpers/import-export/export" import { useReadonlyStream } from "~/composables/stream" import { platform } from "~/platform" @@ -133,14 +133,14 @@ const GqlCollectionsHoppExporter: ImporterOrExporter = { disabled: false, applicableTo: ["personal-workspace", "team-workspace"], }, - action: () => { + action: async () => { if (!gqlCollections.value.length) { return toast.error(t("error.no_collections_to_export")) } - const message = initializeDownloadCollection( + const message = await initializeDownloadFile( gqlCollectionsExporter(gqlCollections.value), - "GQLCollections" + "hoppscotch-gql-collections" ) if (E.isLeft(message)) { diff --git a/packages/hoppscotch-common/src/components/environments/ImportExport.vue b/packages/hoppscotch-common/src/components/environments/ImportExport.vue index fc97315f4..2f86598d7 100644 --- a/packages/hoppscotch-common/src/components/environments/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/environments/ImportExport.vue @@ -13,36 +13,36 @@ import { Environment, NonSecretEnvironment } from "@hoppscotch/data" import * as E from "fp-ts/Either" import { ref } from "vue" +import { ImporterOrExporter } from "~/components/importExport/types" import { useI18n } from "~/composables/i18n" import { useToast } from "~/composables/toast" -import { ImporterOrExporter } from "~/components/importExport/types" +import { hoppEnvImporter } from "~/helpers/import-export/import/hoppEnv" import { FileSource } from "~/helpers/import-export/import/import-sources/FileSource" import { GistSource } from "~/helpers/import-export/import/import-sources/GistSource" -import { hoppEnvImporter } from "~/helpers/import-export/import/hoppEnv" import { - appendEnvironments, addGlobalEnvVariable, + appendEnvironments, environments$, } from "~/newstore/environments" -import { createTeamEnvironment } from "~/helpers/backend/mutations/TeamEnvironment" -import { TeamEnvironment } from "~/helpers/teams/TeamEnvironment" import { GQLError } from "~/helpers/backend/GQLClient" import { CreateTeamEnvironmentMutation } from "~/helpers/backend/graphql" -import { postmanEnvImporter } from "~/helpers/import-export/import/postmanEnv" +import { createTeamEnvironment } from "~/helpers/backend/mutations/TeamEnvironment" import { insomniaEnvImporter } from "~/helpers/import-export/import/insomniaEnv" +import { postmanEnvImporter } from "~/helpers/import-export/import/postmanEnv" +import { TeamEnvironment } from "~/helpers/teams/TeamEnvironment" -import IconFolderPlus from "~icons/lucide/folder-plus" -import IconPostman from "~icons/hopp/postman" -import IconInsomnia from "~icons/hopp/insomnia" -import IconUser from "~icons/lucide/user" -import { initializeDownloadCollection } from "~/helpers/import-export/export" import { computed } from "vue" import { useReadonlyStream } from "~/composables/stream" +import { initializeDownloadFile } from "~/helpers/import-export/export" import { environmentsExporter } from "~/helpers/import-export/export/environments" import { gistExporter } from "~/helpers/import-export/export/gist" import { platform } from "~/platform" +import IconInsomnia from "~icons/hopp/insomnia" +import IconPostman from "~icons/hopp/postman" +import IconFolderPlus from "~icons/lucide/folder-plus" +import IconUser from "~icons/lucide/user" const t = useI18n() const toast = useToast() @@ -67,19 +67,17 @@ const isTeamEnvironment = computed(() => { }) const environmentJson = computed(() => { - if ( - props.environmentType === "TEAM_ENV" && - props.teamEnvironments !== undefined - ) { - const teamEnvironments = props.teamEnvironments.map( - (x) => x.environment as Environment - ) - return teamEnvironments + if (isTeamEnvironment.value && props.teamEnvironments) { + return props.teamEnvironments.map((x) => x.environment) } return myEnvironments.value }) +const workspaceType = computed(() => + isTeamEnvironment.value ? "team" : "personal" +) + const HoppEnvironmentsImport: ImporterOrExporter = { metadata: { id: "import.from_json", @@ -105,7 +103,7 @@ const HoppEnvironmentsImport: ImporterOrExporter = { platform.analytics?.logEvent({ type: "HOPP_IMPORT_ENVIRONMENT", platform: "rest", - workspaceType: isTeamEnvironment.value ? "team" : "personal", + workspaceType: workspaceType.value, }) emit("hide-modal") @@ -138,7 +136,7 @@ const PostmanEnvironmentsImport: ImporterOrExporter = { platform.analytics?.logEvent({ type: "HOPP_IMPORT_ENVIRONMENT", platform: "rest", - workspaceType: isTeamEnvironment.value ? "team" : "personal", + workspaceType: workspaceType.value, }) emit("hide-modal") @@ -178,7 +176,7 @@ const insomniaEnvironmentsImport: ImporterOrExporter = { platform.analytics?.logEvent({ type: "HOPP_IMPORT_ENVIRONMENT", platform: "rest", - workspaceType: isTeamEnvironment.value ? "team" : "personal", + workspaceType: workspaceType.value, }) emit("hide-modal") @@ -214,7 +212,7 @@ const EnvironmentsImportFromGIST: ImporterOrExporter = { platform.analytics?.logEvent({ type: "HOPP_IMPORT_ENVIRONMENT", platform: "rest", - workspaceType: isTeamEnvironment.value ? "team" : "personal", + workspaceType: workspaceType.value, }) emit("hide-modal") }, @@ -230,14 +228,14 @@ const HoppEnvironmentsExport: ImporterOrExporter = { disabled: false, applicableTo: ["personal-workspace", "team-workspace"], }, - action: () => { + action: async () => { if (!environmentJson.value.length) { return toast.error(t("error.no_environments_to_export")) } - const message = initializeDownloadCollection( + const message = await initializeDownloadFile( environmentsExporter(environmentJson.value), - "Environments" + `hoppscotch-${workspaceType.value}-environments` ) if (E.isLeft(message)) { diff --git a/packages/hoppscotch-common/src/components/environments/my/Environment.vue b/packages/hoppscotch-common/src/components/environments/my/Environment.vue index 0a1189a51..5464117d3 100644 --- a/packages/hoppscotch-common/src/components/environments/my/Environment.vue +++ b/packages/hoppscotch-common/src/components/environments/my/Environment.vue @@ -126,6 +126,8 @@ import { useService } from "dioc/vue" import { cloneDeep } from "lodash-es" import { computed, ref } from "vue" import { TippyComponent } from "vue-tippy" +import * as E from "fp-ts/Either" + import { exportAsJSON } from "~/helpers/import-export/export/environment" import { createEnvironment, @@ -163,11 +165,13 @@ const secretEnvironmentService = useService(SecretEnvironmentService) const isGlobalEnvironment = computed(() => props.environmentIndex === "Global") -const exportEnvironmentAsJSON = () => { +const exportEnvironmentAsJSON = async () => { const { environment, environmentIndex } = props - exportAsJSON(environment, environmentIndex) - ? toast.success(t("state.download_started")) - : toast.error(t("state.download_failed")) + + const message = await exportAsJSON(environment, environmentIndex) + E.isRight(message) + ? toast.success(t(message.right)) + : toast.error(t(message.left)) } const tippyActions = ref(null) diff --git a/packages/hoppscotch-common/src/components/environments/teams/Environment.vue b/packages/hoppscotch-common/src/components/environments/teams/Environment.vue index f6eb85d79..fdc0a683a 100644 --- a/packages/hoppscotch-common/src/components/environments/teams/Environment.vue +++ b/packages/hoppscotch-common/src/components/environments/teams/Environment.vue @@ -128,6 +128,7 @@ import * as TE from "fp-ts/TaskEither" import { pipe } from "fp-ts/function" import { ref } from "vue" import { TippyComponent } from "vue-tippy" +import * as E from "fp-ts/Either" import { useI18n } from "~/composables/i18n" import { GQLError } from "~/helpers/backend/GQLClient" @@ -161,10 +162,12 @@ const secretEnvironmentService = useService(SecretEnvironmentService) const confirmRemove = ref(false) -const exportEnvironmentAsJSON = () => - exportAsJSON(props.environment) - ? toast.success(t("state.download_started")) - : toast.error(t("state.download_failed")) +const exportEnvironmentAsJSON = async () => { + const message = await exportAsJSON(props.environment) + E.isRight(message) + ? toast.success(t(message.right)) + : toast.error(t(message.left)) +} const tippyActions = ref(null) const options = ref(null) diff --git a/packages/hoppscotch-common/src/helpers/import-export/export/environment.ts b/packages/hoppscotch-common/src/helpers/import-export/export/environment.ts index 22b6dff58..ef95fcd27 100644 --- a/packages/hoppscotch-common/src/helpers/import-export/export/environment.ts +++ b/packages/hoppscotch-common/src/helpers/import-export/export/environment.ts @@ -1,9 +1,11 @@ import { Environment } from "@hoppscotch/data" -import { TeamEnvironment } from "~/helpers/teams/TeamEnvironment" +import * as E from "fp-ts/Either" import { cloneDeep } from "lodash-es" -import { platform } from "~/platform" -const getEnvironmentJson = ( +import { TeamEnvironment } from "~/helpers/teams/TeamEnvironment" +import { initializeDownloadFile } from "." + +const getEnvironmentJSON = ( environmentObj: TeamEnvironment | Environment, environmentIndex?: number | "Global" | null ) => { @@ -22,33 +24,20 @@ const getEnvironmentJson = ( : undefined } -export const exportAsJSON = ( +export const exportAsJSON = async ( environmentObj: Environment | TeamEnvironment, environmentIndex?: number | "Global" | null -): boolean => { - const dataToWrite = getEnvironmentJson(environmentObj, environmentIndex) +): Promise | E.Left> => { + const environmentJSON = getEnvironmentJSON(environmentObj, environmentIndex) - if (!dataToWrite) return false + if (!environmentJSON) { + return E.left("state.download_failed") + } - const file = new Blob([dataToWrite], { type: "application/json" }) - const url = URL.createObjectURL(file) + const message = await initializeDownloadFile( + environmentJSON, + JSON.parse(environmentJSON).name + ) - URL.revokeObjectURL(url) - - platform.io.saveFileWithDialog({ - data: dataToWrite, - contentType: "application/json", - // Extracts the path from url, removes fragment identifier and query parameters if any, appends the ".json" extension, and assigns it - suggestedFilename: `${ - url.split("/").pop()!.split("#")[0].split("?")[0] - }.json`, - filters: [ - { - name: "JSON file", - extensions: ["json"], - }, - ], - }) - - return true + return message } diff --git a/packages/hoppscotch-common/src/helpers/import-export/export/index.ts b/packages/hoppscotch-common/src/helpers/import-export/export/index.ts index 23e7fe5b2..84a14348a 100644 --- a/packages/hoppscotch-common/src/helpers/import-export/export/index.ts +++ b/packages/hoppscotch-common/src/helpers/import-export/export/index.ts @@ -1,32 +1,36 @@ import * as E from "fp-ts/Either" +import { platform } from "~/platform" /** - * Create a downloadable file from a collection and prompts the user to download it. - * @param collectionJSON - JSON string of the collection + * Create a downloadable file from a collection/environment and prompts the user to download it. + * @param contentsJSON - JSON string of the collection * @param name - Name of the collection set as the file name + * @returns {Promise | E.Left>} - Returns a promise that resolves to an `Either` with `i18n` key for the status message */ -export const initializeDownloadCollection = ( - collectionJSON: string, +export const initializeDownloadFile = async ( + contentsJSON: string, name: string | null ) => { - const file = new Blob([collectionJSON], { type: "application/json" }) - const a = document.createElement("a") + const file = new Blob([contentsJSON], { type: "application/json" }) const url = URL.createObjectURL(file) - a.href = url - if (name) { - a.download = `${name}.json` - } else { - a.download = `${url.split("/").pop()!.split("#")[0].split("?")[0]}.json` + const fileName = name ?? url.split("/").pop()!.split("#")[0].split("?")[0] + + const result = await platform.io.saveFileWithDialog({ + data: contentsJSON, + contentType: "application/json", + suggestedFilename: `${fileName}.json`, + filters: [ + { + name: "Hoppscotch Collection/Environment JSON file", + extensions: ["json"], + }, + ], + }) + + if (result.type === "unknown" || result.type === "saved") { + return E.right("state.download_started") } - document.body.appendChild(a) - a.click() - - setTimeout(() => { - document.body.removeChild(a) - URL.revokeObjectURL(url) - }, 1000) - - return E.right("state.download_started") + return E.left("state.download_failed") } diff --git a/packages/hoppscotch-common/src/platform/std/io.ts b/packages/hoppscotch-common/src/platform/std/io.ts index b8fd50ffc..70e55399b 100644 --- a/packages/hoppscotch-common/src/platform/std/io.ts +++ b/packages/hoppscotch-common/src/platform/std/io.ts @@ -13,15 +13,17 @@ export const browserIODef: IOPlatformDef = { const url = URL.createObjectURL(file) a.href = url - a.download = pipe( - url, - S.split("/"), - RNEA.last, - S.split("#"), - RNEA.head, - S.split("?"), - RNEA.head - ) + a.download = + opts.suggestedFilename ?? + pipe( + url, + S.split("/"), + RNEA.last, + S.split("#"), + RNEA.head, + S.split("?"), + RNEA.head + ) document.body.appendChild(a) a.click() From bb87206b58f4a96e4bbc9ef40fa05410d3b6d42a Mon Sep 17 00:00:00 2001 From: Trivikram Kamat <16024985+trivikr@users.noreply.github.com> Date: Tue, 10 Sep 2024 01:02:12 -0700 Subject: [PATCH 045/159] chore: bump github actions to v4 (#4333) --- .github/workflows/codeql-analysis.yml | 2 +- .github/workflows/release-push-docker.yml | 2 +- .github/workflows/ui.yml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index ec5e254ef..bb87b6e42 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -33,7 +33,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL diff --git a/.github/workflows/release-push-docker.yml b/.github/workflows/release-push-docker.yml index c8f10f968..6f0bfed91 100644 --- a/.github/workflows/release-push-docker.yml +++ b/.github/workflows/release-push-docker.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup environment run: cp .env.example .env diff --git a/.github/workflows/ui.yml b/.github/workflows/ui.yml index d6ccf93e9..b66ee93fa 100644 --- a/.github/workflows/ui.yml +++ b/.github/workflows/ui.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup environment run: mv .env.example .env @@ -26,7 +26,7 @@ jobs: run_install: true - name: Setup node - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }} cache: pnpm From 53839e1091a253e65ae4c90bb38b809de2125075 Mon Sep 17 00:00:00 2001 From: Nivedin <53208152+nivedin@users.noreply.github.com> Date: Wed, 11 Sep 2024 11:40:21 +0530 Subject: [PATCH 046/159] fix: close context menu when no text is selected (#4337) --- .../src/composables/codemirror.ts | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/hoppscotch-common/src/composables/codemirror.ts b/packages/hoppscotch-common/src/composables/codemirror.ts index 0b491c837..713a82852 100644 --- a/packages/hoppscotch-common/src/composables/codemirror.ts +++ b/packages/hoppscotch-common/src/composables/codemirror.ts @@ -242,11 +242,27 @@ export function useCodemirror( ? new HoppEnvironmentPlugin(subscribeToStream, view) : null + const closeContextMenu = () => { + invokeAction("contextmenu.open", { + position: { + top: 0, + left: 0, + }, + text: null, + }) + } + function handleTextSelection() { const selection = view.value?.state.selection.main if (selection) { const { from, to } = selection - if (from === to) return + + // If the selection is empty, hide the context menu + if (from === to) { + closeContextMenu() + return + } + const text = view.value?.state.doc.sliceString(from, to) const coords = view.value?.coordsAtPos(from) const top = coords?.top ?? 0 @@ -260,13 +276,7 @@ export function useCodemirror( text, }) } else { - invokeAction("contextmenu.open", { - position: { - top, - left, - }, - text: null, - }) + closeContextMenu() } } } From 35cc8c247de8e44b50c51cb98b9183656d793db1 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Wed, 11 Sep 2024 14:35:05 +0700 Subject: [PATCH 047/159] fix(status): fix import status message (#4325) Co-authored-by: Dmitry Mukovkin --- .../components/collections/ImportExport.vue | 18 ++++++++++-------- .../collections/graphql/ImportExport.vue | 2 +- .../components/environments/ImportExport.vue | 4 ++-- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/hoppscotch-common/src/components/collections/ImportExport.vue b/packages/hoppscotch-common/src/components/collections/ImportExport.vue index 726ea4eb5..dc098b53f 100644 --- a/packages/hoppscotch-common/src/components/collections/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/collections/ImportExport.vue @@ -401,15 +401,17 @@ const HoppMyCollectionsExporter: ImporterOrExporter = { "hoppscotch-personal-collections" ) - E.isRight(message) - ? toast.success(t(message.right)) - : toast.error(t(message.left)) + if (E.isRight(message)) { + toast.success(t("state.download_started")) - platform.analytics?.logEvent({ - type: "HOPP_EXPORT_COLLECTION", - exporter: "json", - platform: "rest", - }) + platform.analytics?.logEvent({ + type: "HOPP_EXPORT_COLLECTION", + exporter: "json", + platform: "rest", + }) + } else { + toast.error(t(message.left)) + } isHoppMyCollectionExporterInProgress.value = false }, diff --git a/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue b/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue index 18062ca95..a9716c992 100644 --- a/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue @@ -148,7 +148,7 @@ const GqlCollectionsHoppExporter: ImporterOrExporter = { return } - toast.success(message.right) + toast.success(t("state.download_started")) platform.analytics?.logEvent({ type: "HOPP_EXPORT_COLLECTION", diff --git a/packages/hoppscotch-common/src/components/environments/ImportExport.vue b/packages/hoppscotch-common/src/components/environments/ImportExport.vue index 2f86598d7..6d7c0a6d5 100644 --- a/packages/hoppscotch-common/src/components/environments/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/environments/ImportExport.vue @@ -239,11 +239,11 @@ const HoppEnvironmentsExport: ImporterOrExporter = { ) if (E.isLeft(message)) { - toast.error(t(message.left)) + toast.error(t("export.failed")) return } - toast.success(t(message.right)) + toast.success(t("state.download_started")) platform.analytics?.logEvent({ type: "HOPP_EXPORT_ENVIRONMENT", From 2bc46ed6cbf2ef4bb090888d4039b01cda41c1cf Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Wed, 11 Sep 2024 13:45:19 +0530 Subject: [PATCH 048/159] chore: bump version to 2024.8.2 --- packages/hoppscotch-backend/package.json | 2 +- packages/hoppscotch-common/package.json | 2 +- packages/hoppscotch-selfhost-desktop/package.json | 2 +- packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock | 2 +- packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml | 2 +- packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json | 2 +- packages/hoppscotch-selfhost-web/package.json | 2 +- packages/hoppscotch-sh-admin/package.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/hoppscotch-backend/package.json b/packages/hoppscotch-backend/package.json index e70eacffa..810b95f5f 100644 --- a/packages/hoppscotch-backend/package.json +++ b/packages/hoppscotch-backend/package.json @@ -1,6 +1,6 @@ { "name": "hoppscotch-backend", - "version": "2024.8.1", + "version": "2024.8.2", "description": "", "author": "", "private": true, diff --git a/packages/hoppscotch-common/package.json b/packages/hoppscotch-common/package.json index 852b3bde1..68dd641b3 100644 --- a/packages/hoppscotch-common/package.json +++ b/packages/hoppscotch-common/package.json @@ -1,7 +1,7 @@ { "name": "@hoppscotch/common", "private": true, - "version": "2024.8.1", + "version": "2024.8.2", "scripts": { "dev": "pnpm exec npm-run-all -p -l dev:*", "test": "vitest --run", diff --git a/packages/hoppscotch-selfhost-desktop/package.json b/packages/hoppscotch-selfhost-desktop/package.json index 65f886b72..61c82f55e 100644 --- a/packages/hoppscotch-selfhost-desktop/package.json +++ b/packages/hoppscotch-selfhost-desktop/package.json @@ -1,7 +1,7 @@ { "name": "@hoppscotch/selfhost-desktop", "private": true, - "version": "2024.8.1", + "version": "2024.8.2", "type": "module", "scripts": { "dev:vite": "vite", diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock index f33693c50..d593aca11 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock @@ -1296,7 +1296,7 @@ dependencies = [ [[package]] name = "hoppscotch-desktop" -version = "24.8.1" +version = "24.8.2" dependencies = [ "cocoa 0.25.0", "dashmap", diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml index 7858bff15..d134ac93e 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hoppscotch-desktop" -version = "24.8.1" +version = "24.8.2" description = "A Tauri App" authors = ["you"] license = "" diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json b/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json index a3fbdedc4..64fc3a375 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "Hoppscotch", - "version": "24.8.1" + "version": "24.8.2" }, "tauri": { "allowlist": { diff --git a/packages/hoppscotch-selfhost-web/package.json b/packages/hoppscotch-selfhost-web/package.json index 4eee6f3fe..e4e40b907 100644 --- a/packages/hoppscotch-selfhost-web/package.json +++ b/packages/hoppscotch-selfhost-web/package.json @@ -1,7 +1,7 @@ { "name": "@hoppscotch/selfhost-web", "private": true, - "version": "2024.8.1", + "version": "2024.8.2", "type": "module", "scripts": { "dev:vite": "vite", diff --git a/packages/hoppscotch-sh-admin/package.json b/packages/hoppscotch-sh-admin/package.json index bc2d9411a..a87e6c97b 100644 --- a/packages/hoppscotch-sh-admin/package.json +++ b/packages/hoppscotch-sh-admin/package.json @@ -1,7 +1,7 @@ { "name": "hoppscotch-sh-admin", "private": true, - "version": "2024.8.1", + "version": "2024.8.2", "type": "module", "scripts": { "dev": "pnpm exec npm-run-all -p -l dev:*", From 7f18a847fa39339c65750c5509164dff33b691bd Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Wed, 11 Sep 2024 14:21:31 +0530 Subject: [PATCH 049/159] chore: update vulnerable dependencies --- package.json | 5 +- packages/hoppscotch-backend/package.json | 2 +- packages/hoppscotch-sh-admin/package.json | 2 +- pnpm-lock.yaml | 213 ++++++++++------------ 4 files changed, 103 insertions(+), 119 deletions(-) diff --git a/package.json b/package.json index 80495b0e9..6ad47cfe9 100644 --- a/package.json +++ b/package.json @@ -39,8 +39,11 @@ "subscriptions-transport-ws>ws": "7.5.10", "@nestjs/graphql>ws": "8.17.1", "braces": "3.0.3", - "express": "4.19.2", + "express": "4.20.0", + "send": "0.19.0", "pug": "3.0.3", + "body-parser": "1.20.3", + "path-to-regexp@3.2.0": "3.3.0", "micromatch@<4.0.8": "4.0.8" }, "packageExtensions": { diff --git a/packages/hoppscotch-backend/package.json b/packages/hoppscotch-backend/package.json index 810b95f5f..1b17e7c6c 100644 --- a/packages/hoppscotch-backend/package.json +++ b/packages/hoppscotch-backend/package.json @@ -50,7 +50,7 @@ "cookie": "0.5.0", "cookie-parser": "1.4.6", "cron": "3.1.6", - "express": "4.18.2", + "express": "4.20.0", "express-session": "1.17.3", "fp-ts": "2.13.1", "graphql": "16.8.1", diff --git a/packages/hoppscotch-sh-admin/package.json b/packages/hoppscotch-sh-admin/package.json index a87e6c97b..b1c014339 100644 --- a/packages/hoppscotch-sh-admin/package.json +++ b/packages/hoppscotch-sh-admin/package.json @@ -28,7 +28,7 @@ "axios": "1.7.5", "cors": "2.8.5", "date-fns": "2.29.3", - "express": "4.18.2", + "express": "4.20.0", "express-graphql": "0.12.0", "fp-ts": "2.13.1", "graphql": "16.6.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 191672185..8814e7231 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,8 +10,11 @@ overrides: subscriptions-transport-ws>ws: 7.5.10 '@nestjs/graphql>ws': 8.17.1 braces: 3.0.3 - express: 4.19.2 + express: 4.20.0 + send: 0.19.0 pug: 3.0.3 + body-parser: 1.20.3 + path-to-regexp@3.2.0: 3.3.0 micromatch@<4.0.8: 4.0.8 packageExtensionsChecksum: da57d58cd55bf5e7924e59ad5f1485b8 @@ -145,8 +148,8 @@ importers: specifier: 3.1.6 version: 3.1.6 express: - specifier: 4.19.2 - version: 4.19.2 + specifier: 4.20.0 + version: 4.20.0 express-session: specifier: 1.17.3 version: 1.17.3 @@ -376,7 +379,7 @@ importers: version: 3.2.5 tsup: specifier: 8.0.2 - version: 8.0.2(@swc/core@1.4.2)(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3) + version: 8.0.2(@swc/core@1.4.2)(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3) typescript: specifier: 5.3.3 version: 5.3.3 @@ -785,7 +788,7 @@ importers: version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) vite-plugin-checker: specifier: 0.6.2 - version: 0.6.2(eslint@8.57.0)(meow@8.1.2)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)) + version: 0.6.2(eslint@8.57.0)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)) vite-plugin-fonts: specifier: 0.7.0 version: 0.7.0(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) @@ -904,7 +907,7 @@ importers: version: 2.8.4 ts-jest: specifier: 27.1.5 - version: 27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5) + version: 27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -1088,7 +1091,7 @@ importers: version: 0.14.9(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 0.21.0 - version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vite: specifier: 4.5.0 version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) @@ -1097,7 +1100,7 @@ importers: version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-inspect: specifier: 0.7.38 - version: 0.7.38(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) + version: 0.7.38(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-pages: specifier: 0.26.0 version: 0.26.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) @@ -1257,7 +1260,7 @@ importers: version: 0.17.4(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 0.25.2 - version: 0.25.2(@babel/parser@7.24.5)(rollup@3.29.4)(vue@3.3.9(typescript@5.3.2)) + version: 0.25.2(@babel/parser@7.24.5)(rollup@4.17.2)(vue@3.3.9(typescript@5.3.2)) vite: specifier: 4.5.0 version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) @@ -1269,7 +1272,7 @@ importers: version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-inspect: specifier: 0.7.42 - version: 0.7.42(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) + version: 0.7.42(rollup@4.17.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-pages: specifier: 0.31.0 version: 0.31.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) @@ -1311,7 +1314,7 @@ importers: version: 0.1.0(vue@3.3.9(typescript@4.9.3)) '@intlify/unplugin-vue-i18n': specifier: 1.2.0 - version: 1.2.0(rollup@3.29.4)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) + version: 1.2.0(rollup@2.79.1)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) '@types/cors': specifier: 2.8.13 version: 2.8.13 @@ -1337,8 +1340,8 @@ importers: specifier: 2.29.3 version: 2.29.3 express: - specifier: 4.19.2 - version: 4.19.2 + specifier: 4.20.0 + version: 4.20.0 express-graphql: specifier: 0.12.0 version: 0.12.0(graphql@16.6.0) @@ -1377,7 +1380,7 @@ importers: version: 0.14.9(@vue/compiler-sfc@3.2.45)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 0.21.0 - version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vue: specifier: 3.3.9 version: 3.3.9(typescript@4.9.3) @@ -3545,8 +3548,8 @@ packages: resolution: {integrity: sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==} engines: {node: '>= 14'} - '@intlify/message-compiler@10.0.0-beta.6': - resolution: {integrity: sha512-zsChZ15nY73vJMHJPAK5yGM/w9EJxnDiiT+br+7F6052exRUrUUvKrLkvoP3daeMwsE768zVhKqqS439cd4aZw==} + '@intlify/message-compiler@10.0.0': + resolution: {integrity: sha512-OcaWc63NC/9p1cMdgoNKBj4d61BH8sUW1Hfs6YijTd9656ZR4rNqXAlRnBrfS5ABq0vjQjpa8VnyvH9hK49yBw==} engines: {node: '>= 16'} '@intlify/message-compiler@9.13.1': @@ -3565,8 +3568,8 @@ packages: resolution: {integrity: sha512-McnYWhcoYmDJvssVu6QGR0shqlkJuL1HHdi5lK7fNqvQqRYaQ4lSLjYmZxwc8tRNMdIe9/KUKfyPxU9M6yCtNQ==} engines: {node: '>= 16'} - '@intlify/shared@10.0.0-beta.6': - resolution: {integrity: sha512-Bz5aiS62ovE/27EpKDT+oFhr2ZYLkjKHuVI4NWz2C+bOuqBkFR20CJgBcmdm2GiAHMdyQfuhY+ThBv1XyHXk3A==} + '@intlify/shared@10.0.0': + resolution: {integrity: sha512-6ngLfI7DOTew2dcF9WMJx+NnMWghMBhIiHbGg+wRvngpzD5KZJZiJVuzMsUQE1a5YebEmtpTEfUrDp/NqVGdiw==} engines: {node: '>= 16'} '@intlify/shared@9.13.1': @@ -5868,8 +5871,8 @@ packages: blob@0.0.5: resolution: {integrity: sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==} - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + body-parser@1.20.3: + resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} boolbase@1.0.0: @@ -6826,6 +6829,10 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + encodeurl@2.0.0: + resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} + engines: {node: '>= 0.8'} + encoding-japanese@2.0.0: resolution: {integrity: sha512-++P0RhebUC8MJAwJOsT93dT+5oc5oPImp1HubZpAuCZ5kTLnhuuBhKHj2jJeO/Gj93idPBWmIuQ9QWMe5rX3pQ==} engines: {node: '>=8.10.0'} @@ -7460,8 +7467,8 @@ packages: resolution: {integrity: sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==} engines: {node: '>= 0.8.0'} - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + express@4.20.0: + resolution: {integrity: sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==} engines: {node: '>= 0.10.0'} extend-object@1.0.0: @@ -9148,7 +9155,7 @@ packages: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} engines: {node: '>= 0.6'} mediaquery-text@1.2.0: @@ -9172,8 +9179,8 @@ packages: resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} engines: {node: '>=10'} - merge-descriptors@1.0.1: - resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} + merge-descriptors@1.0.3: + resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -9844,11 +9851,11 @@ packages: resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + path-to-regexp@0.1.10: + resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} - path-to-regexp@3.2.0: - resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + path-to-regexp@3.3.0: + resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} path-type@3.0.0: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} @@ -10387,6 +10394,10 @@ packages: resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} engines: {node: '>=0.6'} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} @@ -10782,8 +10793,8 @@ packages: engines: {node: '>=10'} hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + send@0.19.0: + resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} engines: {node: '>= 0.8.0'} sentence-case@3.0.4: @@ -10798,8 +10809,8 @@ packages: serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + serve-static@1.16.0: + resolution: {integrity: sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==} engines: {node: '>= 0.8.0'} set-blocking@2.0.0: @@ -12961,9 +12972,9 @@ snapshots: '@types/express-serve-static-core': 4.19.0 '@types/node-fetch': 2.6.11 async-retry: 1.3.3 - body-parser: 1.20.2 + body-parser: 1.20.3 cors: 2.8.5 - express: 4.19.2 + express: 4.20.0 graphql: 16.8.1 loglevel: 1.9.1 lru-cache: 7.18.3 @@ -15861,8 +15872,8 @@ snapshots: '@intlify/bundle-utils@3.4.0(vue-i18n@9.8.0(vue@3.3.9(typescript@5.3.2)))': dependencies: - '@intlify/message-compiler': 10.0.0-beta.6 - '@intlify/shared': 10.0.0-beta.6 + '@intlify/message-compiler': 10.0.0 + '@intlify/shared': 10.0.0 jsonc-eslint-parser: 1.4.1 source-map: 0.6.1 yaml-eslint-parser: 0.3.2 @@ -15915,9 +15926,9 @@ snapshots: dependencies: '@intlify/shared': 9.2.2 - '@intlify/message-compiler@10.0.0-beta.6': + '@intlify/message-compiler@10.0.0': dependencies: - '@intlify/shared': 10.0.0-beta.6 + '@intlify/shared': 10.0.0 source-map-js: 1.2.0 '@intlify/message-compiler@9.13.1': @@ -15940,7 +15951,7 @@ snapshots: '@intlify/shared': 9.8.0 source-map-js: 1.2.0 - '@intlify/shared@10.0.0-beta.6': {} + '@intlify/shared@10.0.0': {} '@intlify/shared@9.13.1': {} @@ -15950,11 +15961,11 @@ snapshots: '@intlify/shared@9.8.0': {} - '@intlify/unplugin-vue-i18n@1.2.0(rollup@3.29.4)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))': + '@intlify/unplugin-vue-i18n@1.2.0(rollup@2.79.1)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))': dependencies: '@intlify/bundle-utils': 7.5.1(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) '@intlify/shared': 9.13.1 - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) '@vue/compiler-sfc': 3.3.10 debug: 4.3.4(supports-color@9.4.0) fast-glob: 3.3.2 @@ -15973,7 +15984,7 @@ snapshots: '@intlify/vite-plugin-vue-i18n@6.0.1(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-i18n@9.8.0(vue@3.3.9(typescript@4.9.5)))': dependencies: '@intlify/bundle-utils': 7.0.0(vue-i18n@9.8.0(vue@3.3.9(typescript@4.9.5))) - '@intlify/shared': 10.0.0-beta.6 + '@intlify/shared': 10.0.0 '@rollup/pluginutils': 4.2.1 debug: 4.3.4(supports-color@9.4.0) fast-glob: 3.3.2 @@ -15987,7 +15998,7 @@ snapshots: '@intlify/vite-plugin-vue-i18n@7.0.0(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-i18n@9.8.0(vue@3.3.9(typescript@5.3.2)))': dependencies: '@intlify/bundle-utils': 3.4.0(vue-i18n@9.8.0(vue@3.3.9(typescript@5.3.2))) - '@intlify/shared': 10.0.0-beta.6 + '@intlify/shared': 10.0.0 '@rollup/pluginutils': 4.2.1 debug: 4.3.4(supports-color@9.4.0) fast-glob: 3.3.2 @@ -16432,7 +16443,7 @@ snapshots: '@nuxtjs/opencollective': 0.3.2 fast-safe-stringify: 2.1.1 iterare: 1.2.1 - path-to-regexp: 3.2.0 + path-to-regexp: 3.3.0 reflect-metadata: 0.1.13 rxjs: 7.6.0 tslib: 2.6.2 @@ -16500,9 +16511,9 @@ snapshots: dependencies: '@nestjs/common': 10.2.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.6.0) '@nestjs/core': 10.2.7(@nestjs/common@10.2.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.6.0))(@nestjs/platform-express@10.2.7)(reflect-metadata@0.1.13)(rxjs@7.6.0) - body-parser: 1.20.2 + body-parser: 1.20.3 cors: 2.8.5 - express: 4.19.2 + express: 4.20.0 multer: 1.4.4-lts.1 tslib: 2.6.2 transitivePeerDependencies: @@ -16545,7 +16556,7 @@ snapshots: '@nestjs/mapped-types': 2.0.5(@nestjs/common@10.2.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13)(rxjs@7.6.0))(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.13) js-yaml: 4.1.0 lodash: 4.17.21 - path-to-regexp: 3.2.0 + path-to-regexp: 3.3.0 reflect-metadata: 0.1.13 swagger-ui-dist: 5.17.14 optionalDependencies: @@ -18974,7 +18985,7 @@ snapshots: blob@0.0.5: {} - body-parser@1.20.2: + body-parser@1.20.3: dependencies: bytes: 3.1.2 content-type: 1.0.5 @@ -18984,7 +18995,7 @@ snapshots: http-errors: 2.0.0 iconv-lite: 0.4.24 on-finished: 2.4.1 - qs: 6.11.0 + qs: 6.13.0 raw-body: 2.5.2 type-is: 1.6.18 unpipe: 1.0.0 @@ -20045,6 +20056,8 @@ snapshots: encodeurl@1.0.2: {} + encodeurl@2.0.0: {} + encoding-japanese@2.0.0: {} encoding-japanese@2.1.0: {} @@ -20986,34 +20999,34 @@ snapshots: transitivePeerDependencies: - supports-color - express@4.19.2: + express@4.20.0: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 - body-parser: 1.20.2 + body-parser: 1.20.3 content-disposition: 0.5.4 content-type: 1.0.5 cookie: 0.6.0 cookie-signature: 1.0.6 debug: 2.6.9 depd: 2.0.0 - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 finalhandler: 1.2.0 fresh: 0.5.2 http-errors: 2.0.0 - merge-descriptors: 1.0.1 + merge-descriptors: 1.0.3 methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.7 + path-to-regexp: 0.1.10 proxy-addr: 2.0.7 qs: 6.11.0 range-parser: 1.2.1 safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 + send: 0.19.0 + serve-static: 1.16.0 setprototypeof: 1.2.0 statuses: 2.0.1 type-is: 1.6.18 @@ -23294,7 +23307,7 @@ snapshots: type-fest: 0.18.1 yargs-parser: 20.2.9 - merge-descriptors@1.0.1: {} + merge-descriptors@1.0.3: {} merge-stream@2.0.0: {} @@ -24339,9 +24352,9 @@ snapshots: lru-cache: 10.2.2 minipass: 7.1.0 - path-to-regexp@0.1.7: {} + path-to-regexp@0.1.10: {} - path-to-regexp@3.2.0: {} + path-to-regexp@3.3.0: {} path-type@3.0.0: dependencies: @@ -24485,12 +24498,12 @@ snapshots: postcss: 8.4.32 ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2) - postcss-load-config@4.0.2(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)): + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: - postcss: 8.4.32 + postcss: 8.4.40 ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3) postcss-merge-longhand@7.0.2(postcss@8.4.40): @@ -24877,6 +24890,10 @@ snapshots: dependencies: side-channel: 1.0.6 + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + querystringify@2.2.0: optional: true @@ -25302,7 +25319,7 @@ snapshots: dependencies: lru-cache: 6.0.0 - send@0.18.0: + send@0.19.0: dependencies: debug: 2.6.9 depd: 2.0.0 @@ -25338,12 +25355,12 @@ snapshots: dependencies: randombytes: 2.1.0 - serve-static@1.15.0: + serve-static@1.16.0: dependencies: encodeurl: 1.0.2 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 0.19.0 transitivePeerDependencies: - supports-color @@ -26111,7 +26128,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5): + ts-jest@27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -26126,7 +26143,6 @@ snapshots: optionalDependencies: '@babel/core': 7.24.5 '@types/jest': 27.5.2 - babel-jest: 29.7.0(@babel/core@7.24.5) ts-jest@29.0.5(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.4.1(@types/node@18.11.10)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.11.10)(typescript@4.9.3)))(typescript@4.9.3): dependencies: @@ -26332,7 +26348,7 @@ snapshots: tslib@2.6.2: {} - tsup@8.0.2(@swc/core@1.4.2)(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3): + tsup@8.0.2(@swc/core@1.4.2)(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3): dependencies: bundle-require: 4.1.0(esbuild@0.19.12) cac: 6.7.14 @@ -26342,7 +26358,7 @@ snapshots: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)) resolve-from: 5.0.0 rollup: 4.17.2 source-map: 0.8.0-beta.0 @@ -26350,7 +26366,7 @@ snapshots: tree-kill: 1.2.2 optionalDependencies: '@swc/core': 1.4.2 - postcss: 8.4.32 + postcss: 8.4.40 typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -26571,7 +26587,7 @@ snapshots: transitivePeerDependencies: - supports-color - unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: '@antfu/utils': 0.5.2 '@rollup/pluginutils': 4.2.1 @@ -26582,7 +26598,7 @@ snapshots: magic-string: 0.26.7 minimatch: 5.1.6 resolve: 1.22.8 - unplugin: 0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + unplugin: 0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vue: 3.3.9(typescript@4.9.3) optionalDependencies: '@babel/parser': 7.24.5 @@ -26593,7 +26609,7 @@ snapshots: - vite - webpack - unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: '@antfu/utils': 0.5.2 '@rollup/pluginutils': 4.2.1 @@ -26604,7 +26620,7 @@ snapshots: magic-string: 0.26.7 minimatch: 5.1.6 resolve: 1.22.8 - unplugin: 0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + unplugin: 0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vue: 3.3.9(typescript@4.9.5) optionalDependencies: '@babel/parser': 7.24.5 @@ -26615,25 +26631,6 @@ snapshots: - vite - webpack - unplugin-vue-components@0.25.2(@babel/parser@7.24.5)(rollup@3.29.4)(vue@3.3.9(typescript@5.3.2)): - dependencies: - '@antfu/utils': 0.7.7 - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) - chokidar: 3.6.0 - debug: 4.3.4(supports-color@9.4.0) - fast-glob: 3.3.2 - local-pkg: 0.4.3 - magic-string: 0.30.10 - minimatch: 9.0.4 - resolve: 1.22.8 - unplugin: 1.10.1 - vue: 3.3.9(typescript@5.3.2) - optionalDependencies: - '@babel/parser': 7.24.5 - transitivePeerDependencies: - - rollup - - supports-color - unplugin-vue-components@0.25.2(@babel/parser@7.24.5)(rollup@4.17.2)(vue@3.3.9(typescript@5.3.2)): dependencies: '@antfu/utils': 0.7.7 @@ -26653,7 +26650,7 @@ snapshots: - rollup - supports-color - unplugin@0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin@0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: acorn: 8.11.3 chokidar: 3.6.0 @@ -26661,11 +26658,11 @@ snapshots: webpack-virtual-modules: 0.4.6 optionalDependencies: esbuild: 0.20.2 - rollup: 3.29.4 + rollup: 2.79.1 vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0) webpack: 5.91.0(@swc/core@1.4.2)(esbuild@0.20.2) - unplugin@0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin@0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: acorn: 8.11.3 chokidar: 3.6.0 @@ -26673,7 +26670,7 @@ snapshots: webpack-virtual-modules: 0.4.6 optionalDependencies: esbuild: 0.20.2 - rollup: 3.29.4 + rollup: 2.79.1 vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) webpack: 5.91.0(@swc/core@1.4.2)(esbuild@0.20.2) @@ -26818,7 +26815,7 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.6.2(eslint@8.57.0)(meow@8.1.2)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)): + vite-plugin-checker@0.6.2(eslint@8.57.0)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)): dependencies: '@babel/code-frame': 7.24.2 ansi-escapes: 4.3.2 @@ -26840,7 +26837,6 @@ snapshots: vscode-uri: 3.0.8 optionalDependencies: eslint: 8.57.0 - meow: 8.1.2 optionator: 0.9.4 typescript: 5.3.2 vue-tsc: 1.8.24(typescript@5.3.2) @@ -26886,25 +26882,10 @@ snapshots: dependencies: vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) - vite-plugin-inspect@0.7.38(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): + vite-plugin-inspect@0.7.38(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): dependencies: '@antfu/utils': 0.7.7 - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) - debug: 4.3.4(supports-color@9.4.0) - error-stack-parser-es: 0.1.1 - fs-extra: 11.2.0 - open: 9.1.0 - picocolors: 1.0.0 - sirv: 2.0.4 - vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) - transitivePeerDependencies: - - rollup - - supports-color - - vite-plugin-inspect@0.7.42(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): - dependencies: - '@antfu/utils': 0.7.7 - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) debug: 4.3.4(supports-color@9.4.0) error-stack-parser-es: 0.1.1 fs-extra: 11.2.0 From cf2b1b50fae3cd2486309c1d5b8cf33f060eef8b Mon Sep 17 00:00:00 2001 From: jcgurango Date: Wed, 11 Sep 2024 21:36:49 +0800 Subject: [PATCH 050/159] fix: preserve description while toggling field enabled status (#4340) Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com> --- .../src/components/http/KeyValue.vue | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/packages/hoppscotch-common/src/components/http/KeyValue.vue b/packages/hoppscotch-common/src/components/http/KeyValue.vue index 8e4137dfe..da2f2364c 100644 --- a/packages/hoppscotch-common/src/components/http/KeyValue.vue +++ b/packages/hoppscotch-common/src/components/http/KeyValue.vue @@ -94,6 +94,7 @@ key: name, value: value, active: isActive ? !entityActive : false, + description: description ?? '', }) " /> @@ -119,6 +120,14 @@ import { useI18n } from "~/composables/i18n" import { AggregateEnvironment } from "~/newstore/environments" import { InspectorResult } from "~/services/inspection" +type Entity = { + id: number + key: string + value: string + active: boolean + description: string +} + const t = useI18n() defineProps<{ @@ -141,10 +150,13 @@ const emit = defineEmits<{ (e: "update:value", value: string): void (e: "update:description", value: string): void (e: "deleteEntity", value: number): void - (e: "updateEntity", { index, payload }: { index: number; payload: any }): void + ( + e: "updateEntity", + { index, payload }: { index: number; payload: Entity } + ): void }>() -const updateEntity = (index: number, payload: any) => { +const updateEntity = (index: number, payload: Entity) => { emit("updateEntity", { index, payload, From e554bde64dc145109240a65ded793a97f6185ff1 Mon Sep 17 00:00:00 2001 From: Shreyas Date: Wed, 18 Sep 2024 18:24:26 +0530 Subject: [PATCH 051/159] feat(desktop): faster launch with resolved desktop app startup issues (#4357) --- .../src-tauri/Cargo.lock | 223 +++++++++++++----- .../src-tauri/Cargo.toml | 7 +- .../src-tauri/src/interop/mod.rs | 1 + .../src-tauri/src/interop/startup/error.rs | 53 +++++ .../src-tauri/src/interop/startup/init.rs | 186 +++++++++++++++ .../src-tauri/src/interop/startup/mod.rs | 7 + .../src-tauri/src/main.rs | 27 ++- .../src-tauri/tauri.conf.json | 4 +- .../src/interop.ts | 41 ++++ .../hoppscotch-selfhost-desktop/src/main.ts | 4 + 10 files changed, 490 insertions(+), 63 deletions(-) create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/mod.rs create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/error.rs create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/init.rs create mode 100644 packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/mod.rs create mode 100644 packages/hoppscotch-selfhost-desktop/src/interop.ts diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock index d593aca11..d1d767f1f 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock @@ -56,6 +56,55 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + +[[package]] +name = "anstyle-parse" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "anyhow" version = "1.0.86" @@ -163,9 +212,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.5.0" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" +checksum = "74f7971dbd9326d58187408ab83117d8ac1bb9c17b085fdacd1cf2f598719b6b" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -174,9 +223,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.1" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -366,6 +415,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + [[package]] name = "combine" version = "4.6.7" @@ -713,6 +768,29 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "env_filter" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f2c92ceda6ceec50f43169f9ee8424fe2db276791afde7b2cd8bc084cb376ab" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13fa619b91fb2381732789fc5de83b45675e882f66623b7d8cb4f643017018d" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -776,6 +854,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "fluent-uri" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17c704e9dbe1ddd863da1e6ff3567795087b1eb201ce80d8fa81162e1516500d" +dependencies = [ + "bitflags 1.3.2", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1300,7 +1387,9 @@ version = "24.8.2" dependencies = [ "cocoa 0.25.0", "dashmap", + "env_logger", "hex_color", + "log", "objc", "reqwest", "serde", @@ -1310,6 +1399,7 @@ dependencies = [ "tauri-plugin-deep-link", "tauri-plugin-store", "tauri-plugin-window-state", + "thiserror", "tokio", "tokio-util", "url", @@ -1371,6 +1461,12 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "hyper" version = "0.14.28" @@ -1544,6 +1640,12 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + [[package]] name = "itoa" version = "0.4.8" @@ -1619,6 +1721,29 @@ dependencies = [ "thiserror", ] +[[package]] +name = "json-patch" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b1fb8864823fad91877e6caea0baca82e49e8db50f8e5c9f9a453e27d3330fc" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "jsonptr" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6e529149475ca0b2820835d3dce8fcc41c6b943ca608d32f35b449255e4627" +dependencies = [ + "fluent-uri", + "serde", + "serde_json", +] + [[package]] name = "kuchikiki" version = "0.8.2" @@ -1678,9 +1803,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.21" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "loom" @@ -2837,9 +2962,9 @@ dependencies = [ [[package]] name = "serialize-to-javascript" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" dependencies = [ "serde", "serde_json", @@ -2848,13 +2973,13 @@ dependencies = [ [[package]] name = "serialize-to-javascript-impl" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.66", ] [[package]] @@ -3029,15 +3154,11 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sys-locale" -version = "0.2.4" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a11bd9c338fdba09f7881ab41551932ad42e405f61d01e8406baea71c07aee" +checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0" dependencies = [ - "js-sys", "libc", - "wasm-bindgen", - "web-sys", - "windows-sys 0.45.0", ] [[package]] @@ -3164,9 +3285,9 @@ checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" [[package]] name = "tauri" -version = "1.6.7" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c7177b6be45bbb875aa239578f5adc982a1b3d5ea5b315ccd100aeb0043374" +checksum = "0e33e3ba00a3b05eb6c57ef135781717d33728b48acf914bb05629e74d897d29" dependencies = [ "anyhow", "bytes", @@ -3227,7 +3348,7 @@ dependencies = [ "cargo_toml", "dirs-next", "heck 0.5.0", - "json-patch", + "json-patch 1.4.0", "semver", "serde", "serde_json", @@ -3238,14 +3359,14 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.4.3" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a1d90db526a8cdfd54444ad3f34d8d4d58fa5c536463915942393743bd06f8" +checksum = "93a9e3f5cebf779a63bf24903e714ec91196c307d8249a0008b882424328bcda" dependencies = [ "base64 0.21.7", "brotli", "ico", - "json-patch", + "json-patch 2.0.0", "plist", "png", "proc-macro2", @@ -3264,9 +3385,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "1.4.4" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a582d75414250122e4a597b9dd7d3c910a2c77906648fc2ac9353845ff0feec" +checksum = "d1d0e989f54fe06c5ef0875c5e19cf96453d099a0a774d5192ab47e80471cdab" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -3320,9 +3441,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7ffddf36d450791018e63a3ddf54979b9581d9644c584a5fb5611e6b5f20b4" +checksum = "f33fda7d213e239077fad52e96c6b734cecedb30c2382118b64f94cb5103ff3a" dependencies = [ "gtk", "http", @@ -3341,9 +3462,9 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.14.8" +version = "0.14.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1989b3b4d611f5428b3414a4abae6fa6df30c7eb8ed33250ca90a5f7e5bb3655" +checksum = "18c447dcd9b0f09c7dc4b752cc33e72788805bfd761fbda5692d30c48289efec" dependencies = [ "cocoa 0.24.1", "gtk", @@ -3361,9 +3482,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.5.4" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "450b17a7102e5d46d4bdabae0d1590fd27953e704e691fc081f06c06d2253b35" +checksum = "83a0c939e88d82903a0a7dfb28388b12a3c03504d6bd6086550edaa3b6d8beaa" dependencies = [ "brotli", "ctor", @@ -3372,7 +3493,7 @@ dependencies = [ "heck 0.5.0", "html5ever", "infer", - "json-patch", + "json-patch 2.0.0", "kuchikiki", "log", "memchr", @@ -3430,18 +3551,18 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" +checksum = "c0342370b38b6a11b6cc11d6a805569958d54cfa061a29969c3b5ce2ea405724" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.61" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" +checksum = "a4558b58466b9ad7ca0f102865eccc95938dca1a74a856f2b57b6629050da261" dependencies = [ "proc-macro2", "quote", @@ -3762,6 +3883,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + [[package]] name = "uuid" version = "1.8.0" @@ -4153,15 +4280,6 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.48.0" @@ -4180,21 +4298,6 @@ dependencies = [ "windows-targets 0.52.5", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.48.5" diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml index d134ac93e..fc394a3d0 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml @@ -21,7 +21,6 @@ tauri = { version = "1.5.3", features = [ "shell-open", "window-start-dragging", "http-multipart", - "devtools" ] } tauri-plugin-store = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "v1" } tauri-plugin-deep-link = { git = "https://github.com/FabianLars/tauri-plugin-deep-link", branch = "main" } @@ -34,6 +33,12 @@ serde = { version = "1.0.203", features = ["derive"] } dashmap = "5.5.3" tokio = { version = "1.38.0", features = ["macros"] } tokio-util = "0.7.11" +log = "0.4.22" +thiserror = "1.0.63" + +[dev-dependencies] +tauri = { version = "1.5.3", features = ["devtools", "test"] } +env_logger = "0.11.5" [target.'cfg(target_os = "macos")'.dependencies] cocoa = "0.25.0" diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/mod.rs b/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/mod.rs new file mode 100644 index 000000000..91973a8e1 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/mod.rs @@ -0,0 +1 @@ +pub(crate) mod startup; diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/error.rs b/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/error.rs new file mode 100644 index 000000000..d8ba3fa42 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/error.rs @@ -0,0 +1,53 @@ +/// Error handling module for startup-related operations. +/// +/// This module defines custom error types and a result type used for startup process of the app. +/// Essentially provides a way to handle and communicate errors +/// that may occur during the initialization and window management phases. +use serde::Serialize; +use thiserror::Error; + +/// Represents errors related to window lookup failures. +/// +/// Provide more specific information about which window that could not be found. +/// +/// Derives `Serialize` mainly for sending it over to the frontend for info/logging purposes. +#[derive(Debug, Error, Serialize)] +pub(crate) enum WindowNotFoundError { + /// Indicates that the `main` window of the app could not be found. + /// + /// This typically occurs if there's a mismatch between the expected + /// window labels and the actual windows created by the application. + #[error("No window labeled 'main' found")] + Main, +} + +/// Represents errors that can occur during the startup process. +/// +/// Derives `Serialize` mainly for sending it over to the frontend for info/logging purposes. +#[derive(Debug, Error, Serialize)] +pub(crate) enum StartupError { + /// Represents errors related to window lookup failures. + #[error("Window not found: {0}")] + WindowNotFound(WindowNotFoundError), + + /// Represents a general error from the Tauri runtime. + /// + /// This variant is used for any errors originating from Tauri that don't + /// fit into more specific categories. + #[error("Tauri error: {0}")] + Tauri(String), +} + +/// Functions that are part of the startup process should return this result type. +/// This allows for consistent error handling and makes it clear that the function +/// is part of the startup flow. +/// +/// ``` +/// use your_crate::error::{StartupResult, StartupError}; +/// +/// fn some_startup_function() -> StartupResult<()> { +/// // Function implementation +/// Ok(()) +/// } +/// ``` +pub(crate) type StartupResult = std::result::Result; diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/init.rs b/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/init.rs new file mode 100644 index 000000000..fe67125e2 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/init.rs @@ -0,0 +1,186 @@ +use log::{error, info}; +use tauri::{Manager, Runtime, Window}; + +use super::error::{StartupError, StartupResult, WindowNotFoundError}; +/// Shows the `main` labeled application window. +/// +/// This function is designed to be called as a Tauri command. +/// +/// # Arguments +/// +/// * `window` - A `Window` instance representing the current window. This is automatically +/// provided by Tauri when the command is invoked. +/// +/// # Returns +/// +/// Returns a `StartupResult<(), String>`: +/// - `Ok(())` if showing main window operation succeed. +/// - `Err(StartupError)` containing an error message if any operation fails. +/// +/// # Errors +/// +/// This function will return an error if: +/// - The "main" window is not found. +/// - Showing the main window fails. +/// +/// # Example +/// +/// ```rust,no_run +/// #[tauri::command] +/// async fn invoke_interop_startup_init(window: tauri::Window) { +/// match interop_startup_init(window).await { +/// Ok(_) => println!("`main` window shown successfully"), +/// Err(e) => eprintln!("Error: {}", e), +/// } +/// } +/// ``` +#[tauri::command] +pub async fn interop_startup_init(window: Window) -> StartupResult<()> { + let main_window = window.get_window("main").ok_or_else(|| { + error!("No window labeled 'main' found"); + StartupError::WindowNotFound(WindowNotFoundError::Main) + })?; + + main_window.show().map_err(|e| { + error!("Failed to show `main` window: {}", e); + StartupError::Tauri(format!("Failed to show `main` window: {}", e)) + })?; + + info!("`main` window shown successfully"); + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::*; + use serde_json::json; + use tauri::test::{assert_ipc_response, mock_builder, mock_context, noop_assets}; + use tauri::{InvokePayload, WindowBuilder, WindowUrl}; + + fn create_app(builder: tauri::Builder) -> tauri::App { + builder + .invoke_handler(tauri::generate_handler![interop_startup_init]) + .build(mock_context(noop_assets())) + .expect("failed to build mock app") + } + + /// Test: Main window shown successfully in isolation + /// + /// Rationale: + /// This test verifies the core functionality of `interop_startup_init`. + /// A failure indicates a fundamental issue with the app's initialization process. + /// + /// Context: + /// The "main" window is typically the primary interface, + /// so ensuring it shows correctly is important. + /// + /// Key Points: + /// - We use a mock Tauri application to isolate the window showing behavior. + /// - The test focuses solely on the "main" window to verify the basic case works correctly. + /// + /// Assumptions: + /// - The Tauri runtime is functioning correctly. + /// - A window labeled "main" exists in the application. + /// For this see `tauri.conf.json`: + /// ```json + /// { + /// ... + /// "label": "main", + /// "title": "Hoppscotch", + /// ... + /// ... + /// } + /// ``` + /// + /// Implications of Failure: + /// 1. The window labeling system is broken. + /// 2. There's an issue with Tauri's window management. + /// 3. The `interop_startup_init` function is not correctly implemented. + #[tokio::test] + async fn test_interop_startup_init_main_window_shown_successfully() { + let app = create_app(mock_builder()); + + let window = app.get_window("main").expect("`main` window not found"); + + let result = interop_startup_init(window).await; + + assert!(result.is_ok(), "Expected Ok, but got {:?}", result); + } + + /// Test: Main window found and shown amongst other windows + /// + /// Rationale: + /// This test ensures `interop_startup_init` can correctly identify and show the main window + /// in a more complex scenario with multiple windows. + /// + /// Context: + /// As applications grow, they may introduce additional windows for various purposes. The ability + /// to consistently identify and manipulate the main window is important for maintaining + /// expected behavior. + /// + /// Key Points: + /// - We create an additional "other" window to simulate another window. + /// - The test verifies that the presence of other windows doesn't interfere with main window operations. + /// + /// Assumptions: + /// - The window labeling system consistently identifies the "main" window regardless of other windows. + /// - The order of window creation doesn't affect the ability to find the main window. + /// + /// Implications of Failure: + /// 1. The window identification logic breaks with multiple windows. + #[tokio::test] + async fn test_interop_startup_init_main_window_found_amongst_others() { + let app = create_app(mock_builder()); + + let _ = WindowBuilder::new(&app, "other", WindowUrl::default()) + .build() + .expect("Failed to create other window"); + + let window = app.get_window("other").expect("`other` window not found"); + + let result = interop_startup_init(window).await; + + assert!(result.is_ok(), "Expected `Ok(())`, but got {:?}", result); + } + + /// Test: IPC invocation of interop startup init + /// + /// Rationale: + /// This test makes sure that `interop_startup_init` can be correctly invoked through Tauri's IPC mechanism. + /// It's important because it verifies the integration between the Rust backend and the frontend + /// that would typically call this function. + /// + /// Context: + /// This test simulates scenarios where operations are initiated from the frontend via IPC calls. + /// + /// Key Points: + /// - We're testing the IPC invocation, not just the direct function call. + /// - This verifies both the function's behavior and its correct registration with Tauri's IPC system. + /// + /// Assumptions: + /// - The Tauri IPC system is functioning correctly. + /// - The `interop_startup_init` function is properly registered as a Tauri command. + /// + /// Implications of Failure: + /// 1. There's a mismatch between how the frontend tries to call the function and how it's implemented. + /// 2. The Tauri command registration is incorrect. + /// 3. The function isn't properly handling the IPC context. + #[tokio::test] + async fn test_ipc_interop_startup_init() { + let app = create_app(mock_builder()); + + let window = app.get_window("main").expect("main window not found"); + + let payload = InvokePayload { + cmd: "interop_startup_init".into(), + tauri_module: None, + callback: tauri::api::ipc::CallbackFn(0), + error: tauri::api::ipc::CallbackFn(1), + inner: json!(null), + invoke_key: Some("__invoke-key__".to_string()), + }; + + assert_ipc_response(&window, payload, Ok(())); + } +} diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/mod.rs b/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/mod.rs new file mode 100644 index 000000000..32de9ce44 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/src/interop/startup/mod.rs @@ -0,0 +1,7 @@ +//! Startup management module. +//! +//! This module contains functionality related to managing the application's startup +//! like controlling visibility and lifecycle of the main application windows. + +pub(crate) mod init; +pub(crate) mod error; diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/src/main.rs b/packages/hoppscotch-selfhost-desktop/src-tauri/src/main.rs index 1c280b9a1..89145a241 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/src/main.rs +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/src/main.rs @@ -16,6 +16,7 @@ mod mac; mod win; mod interceptor; +mod interop; use tauri::Manager; @@ -23,7 +24,31 @@ fn main() { tauri_plugin_deep_link::prepare("io.hoppscotch.desktop"); tauri::Builder::default() - .plugin(tauri_plugin_window_state::Builder::default().build()) + .invoke_handler(tauri::generate_handler![ + interop::startup::init::interop_startup_init + ]) + .plugin( + tauri_plugin_window_state::Builder::default() + .with_state_flags( + // NOTE: + // The app (window labeled "main") manages its visible state via `interop_startup_init`. + // See `tauri.conf.json`: + // ```json + // { + // "label": "main", + // "title": "Hoppscotch", + // ... + // ... + // "visible": false, // This is the important part. + // ... + // ... + // } + // ``` + tauri_plugin_window_state::StateFlags::all() + & !tauri_plugin_window_state::StateFlags::VISIBLE, + ) + .build(), + ) .plugin(tauri_plugin_store::Builder::default().build()) .plugin(interceptor::init()) .setup(|app| { diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json b/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json index 64fc3a375..73474e84a 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json @@ -56,9 +56,11 @@ }, "windows": [ { + "label": "main", + "title": "Hoppscotch", + "visible": false, "fullscreen": false, "resizable": true, - "title": "Hoppscotch", "width": 800, "height": 600, "fileDropEnabled": false diff --git a/packages/hoppscotch-selfhost-desktop/src/interop.ts b/packages/hoppscotch-selfhost-desktop/src/interop.ts new file mode 100644 index 000000000..a681f2ff4 --- /dev/null +++ b/packages/hoppscotch-selfhost-desktop/src/interop.ts @@ -0,0 +1,41 @@ +import { invoke } from "@tauri-apps/api/tauri"; +import { onMounted } from "vue"; +import { HoppModule } from "@hoppscotch/common/modules" + +/** + * Initializes the interop startup process. + * + * This function invokes a Tauri command to perform necessary startup operations. + * It's a bridge, specifically calling `interop_startup_init` function defined in + * `src-tauri/src/interop/startup/init.rs`. + * + * @returns A promise that resolves when the startup initialization is complete. + * @throws Will throw an error if the Tauri command fails for any reason. + */ +async function interopStartupInit(): Promise { + return invoke("interop_startup_init"); +} + +/** + * HoppModule for handling interop operations and + * is responsible for initializing interop-startup related functionality. + */ +export const interopModule: HoppModule = { + /** + * Executes when the root component is set up. + * + * This function is called during the application's initialization process, + * and it also uses Vue's `onMounted` hook so the interop-startup occurs + * **after** the component has been mounted in the DOM. + */ + onRootSetup: () => { + onMounted(async () => { + try { + await interopStartupInit(); + console.log("Interop startup initialization completed successfully"); + } catch (error) { + console.error("Failed to initialize interop startup:", error); + } + }); + }, +}; diff --git a/packages/hoppscotch-selfhost-desktop/src/main.ts b/packages/hoppscotch-selfhost-desktop/src/main.ts index 07dd44b4d..c322a7c54 100644 --- a/packages/hoppscotch-selfhost-desktop/src/main.ts +++ b/packages/hoppscotch-selfhost-desktop/src/main.ts @@ -14,6 +14,7 @@ import { appWindow } from "@tauri-apps/api/window" import { stdFooterItems } from "@hoppscotch/common/platform/std/ui/footerItem" import { stdSupportOptionItems } from "@hoppscotch/common/platform/std/ui/supportOptionsItem" import { ioDef } from "./platform/io" +import { interopModule } from "./interop" const headerPaddingLeft = ref("0px") const headerPaddingTop = ref("0px") @@ -45,6 +46,9 @@ const headerPaddingTop = ref("0px") settings: settingsDef, history: historyDef, }, + addedHoppModules: [ + interopModule + ], interceptors: { default: "native", interceptors: [ From 9aa1858642fca7e3f063221011e31b184be29c81 Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Thu, 19 Sep 2024 18:02:18 +0530 Subject: [PATCH 052/159] chore: bump vulnerable dependencies --- package.json | 3 ++- pnpm-lock.yaml | 15 ++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 6ad47cfe9..38670f5ed 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,8 @@ "pug": "3.0.3", "body-parser": "1.20.3", "path-to-regexp@3.2.0": "3.3.0", - "micromatch@<4.0.8": "4.0.8" + "micromatch@<4.0.8": "4.0.8", + "dset@3.1.3": "3.1.4" }, "packageExtensions": { "@hoppscotch/httpsnippet": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8814e7231..c813b1df4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,6 +16,7 @@ overrides: body-parser: 1.20.3 path-to-regexp@3.2.0: 3.3.0 micromatch@<4.0.8: 4.0.8 + dset@3.1.3: 3.1.4 packageExtensionsChecksum: da57d58cd55bf5e7924e59ad5f1485b8 @@ -6782,8 +6783,8 @@ packages: resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} engines: {node: '>=12'} - dset@3.1.3: - resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} + dset@3.1.4: + resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==} engines: {node: '>=4'} duplexer@0.1.2: @@ -15086,7 +15087,7 @@ snapshots: '@graphql-tools/utils': 9.2.1(graphql@16.6.0) '@repeaterjs/repeater': 3.0.5 '@whatwg-node/fetch': 0.8.8 - dset: 3.1.3 + dset: 3.1.4 extract-files: 11.0.0 graphql: 16.6.0 meros: 1.3.0(@types/node@18.18.8) @@ -15100,7 +15101,7 @@ snapshots: '@graphql-tools/utils': 9.2.1(graphql@16.8.1) '@repeaterjs/repeater': 3.0.5 '@whatwg-node/fetch': 0.8.8 - dset: 3.1.3 + dset: 3.1.4 extract-files: 11.0.0 graphql: 16.8.1 meros: 1.3.0(@types/node@18.18.8) @@ -15587,7 +15588,7 @@ snapshots: '@graphql-tools/utils@10.0.6(graphql@16.8.1)': dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) - dset: 3.1.3 + dset: 3.1.4 graphql: 16.8.1 tslib: 2.6.2 @@ -15595,7 +15596,7 @@ snapshots: dependencies: '@graphql-typed-document-node/core': 3.2.0(graphql@16.8.1) cross-inspect: 1.0.0 - dset: 3.1.3 + dset: 3.1.4 graphql: 16.8.1 tslib: 2.6.2 @@ -20019,7 +20020,7 @@ snapshots: dotenv@16.3.1: {} - dset@3.1.3: {} + dset@3.1.4: {} duplexer@0.1.2: {} From c2e9e3dfe2ff9babf9e29745609cc5b5523da485 Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Thu, 19 Sep 2024 18:04:34 +0530 Subject: [PATCH 053/159] chore: bump version to 2024.8.3 --- packages/hoppscotch-backend/package.json | 2 +- packages/hoppscotch-common/package.json | 2 +- packages/hoppscotch-selfhost-desktop/package.json | 2 +- packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock | 2 +- packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml | 2 +- packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json | 2 +- packages/hoppscotch-selfhost-web/package.json | 2 +- packages/hoppscotch-sh-admin/package.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/hoppscotch-backend/package.json b/packages/hoppscotch-backend/package.json index 1b17e7c6c..05c02b102 100644 --- a/packages/hoppscotch-backend/package.json +++ b/packages/hoppscotch-backend/package.json @@ -1,6 +1,6 @@ { "name": "hoppscotch-backend", - "version": "2024.8.2", + "version": "2024.8.3", "description": "", "author": "", "private": true, diff --git a/packages/hoppscotch-common/package.json b/packages/hoppscotch-common/package.json index 68dd641b3..66302da93 100644 --- a/packages/hoppscotch-common/package.json +++ b/packages/hoppscotch-common/package.json @@ -1,7 +1,7 @@ { "name": "@hoppscotch/common", "private": true, - "version": "2024.8.2", + "version": "2024.8.3", "scripts": { "dev": "pnpm exec npm-run-all -p -l dev:*", "test": "vitest --run", diff --git a/packages/hoppscotch-selfhost-desktop/package.json b/packages/hoppscotch-selfhost-desktop/package.json index 61c82f55e..314e71899 100644 --- a/packages/hoppscotch-selfhost-desktop/package.json +++ b/packages/hoppscotch-selfhost-desktop/package.json @@ -1,7 +1,7 @@ { "name": "@hoppscotch/selfhost-desktop", "private": true, - "version": "2024.8.2", + "version": "2024.8.3", "type": "module", "scripts": { "dev:vite": "vite", diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock index d1d767f1f..7c03490f9 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.lock @@ -1383,7 +1383,7 @@ dependencies = [ [[package]] name = "hoppscotch-desktop" -version = "24.8.2" +version = "24.8.3" dependencies = [ "cocoa 0.25.0", "dashmap", diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml index fc394a3d0..76838f3ea 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "hoppscotch-desktop" -version = "24.8.2" +version = "24.8.3" description = "A Tauri App" authors = ["you"] license = "" diff --git a/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json b/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json index 73474e84a..ada554be7 100644 --- a/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json +++ b/packages/hoppscotch-selfhost-desktop/src-tauri/tauri.conf.json @@ -8,7 +8,7 @@ }, "package": { "productName": "Hoppscotch", - "version": "24.8.2" + "version": "24.8.3" }, "tauri": { "allowlist": { diff --git a/packages/hoppscotch-selfhost-web/package.json b/packages/hoppscotch-selfhost-web/package.json index e4e40b907..668259fea 100644 --- a/packages/hoppscotch-selfhost-web/package.json +++ b/packages/hoppscotch-selfhost-web/package.json @@ -1,7 +1,7 @@ { "name": "@hoppscotch/selfhost-web", "private": true, - "version": "2024.8.2", + "version": "2024.8.3", "type": "module", "scripts": { "dev:vite": "vite", diff --git a/packages/hoppscotch-sh-admin/package.json b/packages/hoppscotch-sh-admin/package.json index b1c014339..1ca8de7bb 100644 --- a/packages/hoppscotch-sh-admin/package.json +++ b/packages/hoppscotch-sh-admin/package.json @@ -1,7 +1,7 @@ { "name": "hoppscotch-sh-admin", "private": true, - "version": "2024.8.2", + "version": "2024.8.3", "type": "module", "scripts": { "dev": "pnpm exec npm-run-all -p -l dev:*", From 875e2fae9760de4eb927b883049b9fcadc9df0ab Mon Sep 17 00:00:00 2001 From: Nivedin <53208152+nivedin@users.noreply.github.com> Date: Thu, 19 Sep 2024 18:17:07 +0530 Subject: [PATCH 054/159] fix: workspace environment list reset (#4361) --- .../src/components/environments/index.vue | 56 ++++++++++--------- 1 file changed, 30 insertions(+), 26 deletions(-) diff --git a/packages/hoppscotch-common/src/components/environments/index.vue b/packages/hoppscotch-common/src/components/environments/index.vue index a0c9cd5c6..6fe8b1572 100644 --- a/packages/hoppscotch-common/src/components/environments/index.vue +++ b/packages/hoppscotch-common/src/components/environments/index.vue @@ -112,6 +112,12 @@ const adapterLoading = useReadonlyStream(adapter.loading$, false) const adapterError = useReadonlyStream(adapter.error$, null) const teamEnvironmentList = useReadonlyStream(adapter.teamEnvironmentList$, []) +const selectedEnvironmentIndex = useStream( + selectedEnvironmentIndex$, + { type: "NO_ENV_SELECTED" }, + setSelectedEnvironmentIndex +) + const loading = computed( () => adapterLoading.value && teamEnvironmentList.value.length === 0 ) @@ -138,29 +144,33 @@ const workspace = workspaceService.currentWorkspace // Switch to my environments if workspace is personal and to team environments if workspace is team // also resets selected environment if workspace is personal and the previous selected environment was a team environment -watch(workspace, (newWorkspace) => { - const { type: newWorkspaceType } = newWorkspace +watch( + workspace, + (newWorkspace) => { + const { type: newWorkspaceType } = newWorkspace - if (newWorkspaceType === "personal") { - switchToMyEnvironments() - } else { - updateSelectedTeam(newWorkspace) - } + if (newWorkspaceType === "personal") { + switchToMyEnvironments() + } else { + updateSelectedTeam(newWorkspace) + } - const newTeamID = - newWorkspaceType === "team" ? newWorkspace.teamID : undefined + const newTeamID = + newWorkspaceType === "team" ? newWorkspace.teamID : undefined - // Set active environment to the `No environment` state - // if navigating away from a team workspace - if ( - selectedEnvironmentIndex.value.type === "TEAM_ENV" && - selectedEnvironmentIndex.value.teamID !== newTeamID - ) { - setSelectedEnvironmentIndex({ - type: "NO_ENV_SELECTED", - }) - } -}) + // Set active environment to the `No environment` state + // if navigating away from a team workspace + if ( + selectedEnvironmentIndex.value.type === "TEAM_ENV" && + selectedEnvironmentIndex.value.teamID !== newTeamID + ) { + setSelectedEnvironmentIndex({ + type: "NO_ENV_SELECTED", + }) + } + }, + { immediate: true } +) watch( () => currentUser.value, @@ -256,12 +266,6 @@ defineActionHandler( } ) -const selectedEnvironmentIndex = useStream( - selectedEnvironmentIndex$, - { type: "NO_ENV_SELECTED" }, - setSelectedEnvironmentIndex -) - /* Checking if there are any changes in the selected team environment when there are any updates in the selected team environment list */ watch( From 5a06e52389e2444b2d23081e343340dbc4cff60e Mon Sep 17 00:00:00 2001 From: Dmitry Date: Thu, 19 Sep 2024 19:53:40 +0700 Subject: [PATCH 055/159] feat(filename): added filename in download functional (#4329) Co-authored-by: Dmitry Mukovkin Co-authored-by: nivedin --- packages/hoppscotch-common/locales/en.json | 7 ++++++ .../src/components/cookies/EditCookie.vue | 5 ++-- .../src/components/graphql/Response.vue | 3 ++- .../src/components/http/Codegen.vue | 8 ++++++- .../src/components/http/ImportCurl.vue | 12 +--------- .../lenses/renderers/AudioLensRenderer.vue | 5 +++- .../lenses/renderers/HTMLLensRenderer.vue | 5 +++- .../lenses/renderers/ImageLensRenderer.vue | 5 +++- .../lenses/renderers/JSONLensRenderer.vue | 5 +++- .../lenses/renderers/PDFLensRenderer.vue | 5 +++- .../lenses/renderers/RawLensRenderer.vue | 5 +++- .../lenses/renderers/VideoLensRenderer.vue | 5 +++- .../lenses/renderers/XMLLensRenderer.vue | 5 +++- .../src/components/realtime/LogEntry.vue | 3 ++- .../src/composables/lens-actions.ts | 24 ++----------------- 15 files changed, 56 insertions(+), 46 deletions(-) diff --git a/packages/hoppscotch-common/locales/en.json b/packages/hoppscotch-common/locales/en.json index 745b6b3a6..312a8ff2d 100644 --- a/packages/hoppscotch-common/locales/en.json +++ b/packages/hoppscotch-common/locales/en.json @@ -383,6 +383,13 @@ "title": "Export", "success": "Successfully exported" }, + "filename": { + "cookie_key_value_pairs": "Cookie", + "codegen": "{request_name} - code", + "graphql_response": "GraphQL-Response", + "lens": "{request_name} - response", + "realtime_response": "Realtime-Response" + }, "filter": { "all": "All", "none": "None", diff --git a/packages/hoppscotch-common/src/components/cookies/EditCookie.vue b/packages/hoppscotch-common/src/components/cookies/EditCookie.vue index 79c80f1a0..bd9503e0c 100644 --- a/packages/hoppscotch-common/src/components/cookies/EditCookie.vue +++ b/packages/hoppscotch-common/src/components/cookies/EditCookie.vue @@ -187,8 +187,9 @@ function saveCookieChange() { const { copyIcon, copyResponse } = useCopyResponse(rawCookieString) const { downloadIcon, downloadResponse } = useDownloadResponse( - "", - rawCookieString + "text/plain", + rawCookieString, + t("filename.cookie_key_value_pairs") ) function clearContent() { diff --git a/packages/hoppscotch-common/src/components/graphql/Response.vue b/packages/hoppscotch-common/src/components/graphql/Response.vue index 8a867ee59..81d187504 100644 --- a/packages/hoppscotch-common/src/components/graphql/Response.vue +++ b/packages/hoppscotch-common/src/components/graphql/Response.vue @@ -157,7 +157,8 @@ useCodemirror( const { copyIcon, copyResponse } = useCopyResponse(responseString) const { downloadIcon, downloadResponse } = useDownloadResponse( "application/json", - responseString + responseString, + t("filename.graphql_response") ) defineActionHandler( diff --git a/packages/hoppscotch-common/src/components/http/Codegen.vue b/packages/hoppscotch-common/src/components/http/Codegen.vue index d3a25058c..53c6ac894 100644 --- a/packages/hoppscotch-common/src/components/http/Codegen.vue +++ b/packages/hoppscotch-common/src/components/http/Codegen.vue @@ -259,5 +259,11 @@ const filteredCodegenDefinitions = computed(() => { }) const { copyIcon, copyResponse } = useCopyResponse(requestCode) -const { downloadIcon, downloadResponse } = useDownloadResponse("", requestCode) +const { downloadIcon, downloadResponse } = useDownloadResponse( + "", + requestCode, + t("filename.codegen", { + request_name: request.value.name, + }) +) diff --git a/packages/hoppscotch-common/src/components/http/ImportCurl.vue b/packages/hoppscotch-common/src/components/http/ImportCurl.vue index d9a319c32..36deeaa01 100644 --- a/packages/hoppscotch-common/src/components/http/ImportCurl.vue +++ b/packages/hoppscotch-common/src/components/http/ImportCurl.vue @@ -26,12 +26,6 @@ :icon="IconWrapText" @click.prevent="toggleNestedSetting('WRAP_LINES', 'importCurl')" /> - { } const { copyIcon, copyResponse } = useCopyResponse(curl) -const { downloadIcon, downloadResponse } = useDownloadResponse("", curl) const clearContent = () => { curl.value = "" diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/AudioLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/AudioLensRenderer.vue index e06a67d34..4ebc08555 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/AudioLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/AudioLensRenderer.vue @@ -72,7 +72,10 @@ const responseType = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( responseType.value, - computed(() => props.response.body) + computed(() => props.response.body), + t("filename.lens", { + request_name: props.response.req.name, + }) ) defineActionHandler("response.file.download", () => downloadResponse()) diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue index 4c74a4ef0..9d10236e1 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/HTMLLensRenderer.vue @@ -93,7 +93,10 @@ const WRAP_LINES = useNestedSetting("WRAP_LINES", "httpResponseBody") const { responseBodyText } = useResponseBody(props.response) const { downloadIcon, downloadResponse } = useDownloadResponse( "text/html", - responseBodyText + responseBodyText, + t("filename.lens", { + request_name: props.response.req.name, + }) ) const defaultPreview = persistenceService.getLocalConfig("lens_html_preview") === "true" diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/ImageLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/ImageLensRenderer.vue index c0142549f..1260f6eff 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/ImageLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/ImageLensRenderer.vue @@ -67,7 +67,10 @@ const responseType = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( responseType.value, - computed(() => props.response.body) + computed(() => props.response.body), + t("filename.lens", { + request_name: props.response.req.name, + }) ) watch(props.response, () => { diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/JSONLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/JSONLensRenderer.vue index c9dff574d..8d7afe383 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/JSONLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/JSONLensRenderer.vue @@ -354,7 +354,10 @@ const filterResponseError = computed(() => const { copyIcon, copyResponse } = useCopyResponse(jsonBodyText) const { downloadIcon, downloadResponse } = useDownloadResponse( "application/json", - jsonBodyText + jsonBodyText, + t("filename.lens", { + request_name: props.response.req.name, + }) ) // Template refs diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/PDFLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/PDFLensRenderer.vue index e916e97d9..c41acd935 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/PDFLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/PDFLensRenderer.vue @@ -53,7 +53,10 @@ const pdfsrc = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( "application/pdf", - computed(() => props.response.body) + computed(() => props.response.body), + t("filename.lens", { + request_name: props.response.req.name, + }) ) defineActionHandler("response.file.download", () => downloadResponse()) diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/RawLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/RawLensRenderer.vue index fc24434d2..9a5f7fedc 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/RawLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/RawLensRenderer.vue @@ -95,7 +95,10 @@ const responseType = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( responseType.value, - rawResponseBody + rawResponseBody, + t("filename.lens", { + request_name: props.response.req.name, + }) ) const { copyIcon, copyResponse } = useCopyResponse(responseBodyText) diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/VideoLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/VideoLensRenderer.vue index dc3db979f..455165412 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/VideoLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/VideoLensRenderer.vue @@ -72,7 +72,10 @@ const responseType = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( responseType.value, - computed(() => props.response.body) + computed(() => props.response.body), + t("filename.lens", { + request_name: props.response.req.name, + }) ) defineActionHandler("response.file.download", () => downloadResponse()) diff --git a/packages/hoppscotch-common/src/components/lenses/renderers/XMLLensRenderer.vue b/packages/hoppscotch-common/src/components/lenses/renderers/XMLLensRenderer.vue index faab1cc91..c94940899 100644 --- a/packages/hoppscotch-common/src/components/lenses/renderers/XMLLensRenderer.vue +++ b/packages/hoppscotch-common/src/components/lenses/renderers/XMLLensRenderer.vue @@ -89,7 +89,10 @@ const responseType = computed(() => const { downloadIcon, downloadResponse } = useDownloadResponse( responseType.value, - responseBodyText + responseBodyText, + t("filename.lens", { + request_name: props.response.req.name, + }) ) const { copyIcon, copyResponse } = useCopyResponse(responseBodyText) diff --git a/packages/hoppscotch-common/src/components/realtime/LogEntry.vue b/packages/hoppscotch-common/src/components/realtime/LogEntry.vue index 907af3766..a760b1995 100644 --- a/packages/hoppscotch-common/src/components/realtime/LogEntry.vue +++ b/packages/hoppscotch-common/src/components/realtime/LogEntry.vue @@ -326,7 +326,8 @@ const { copyIcon, copyResponse } = useCopyResponse(logPayload) const { downloadIcon, downloadResponse } = useDownloadResponse( "application/json", - logPayload + logPayload, + t("filename.realtime_response") ) const copyQueryIcon = refAutoReset( diff --git a/packages/hoppscotch-common/src/composables/lens-actions.ts b/packages/hoppscotch-common/src/composables/lens-actions.ts index b7bf90010..2f4624050 100644 --- a/packages/hoppscotch-common/src/composables/lens-actions.ts +++ b/packages/hoppscotch-common/src/composables/lens-actions.ts @@ -1,9 +1,6 @@ import { HoppRESTResponse } from "@helpers/types/HoppRESTResponse" import { copyToClipboard } from "@helpers/utils/clipboard" import { refAutoReset } from "@vueuse/core" -import { pipe } from "fp-ts/function" -import * as RNEA from "fp-ts/ReadonlyNonEmptyArray" -import * as S from "fp-ts/string" import { computed, ComputedRef, onMounted, ref, Ref } from "vue" import jsonToLanguage from "~/helpers/utils/json-to-language" @@ -58,7 +55,8 @@ export type downloadResponseReturnType = (() => void) | Ref export function useDownloadResponse( contentType: string, - responseBody: Ref + responseBody: Ref, + filename: string ) { const downloadIcon = refAutoReset(IconDownload, 1000) @@ -68,24 +66,6 @@ export function useDownloadResponse( const downloadResponse = async () => { const dataToWrite = responseBody.value - // Guess extension and filename - const file = new Blob([dataToWrite], { type: contentType }) - const url = URL.createObjectURL(file) - - const filename = pipe( - url, - S.split("/"), - RNEA.last, - S.split("#"), - RNEA.head, - S.split("?"), - RNEA.head - ) - - URL.revokeObjectURL(url) - - console.log(filename) - // TODO: Look at the mime type and determine extension ? const result = await platform.io.saveFileWithDialog({ data: dataToWrite, From 626b5fea7f423d1ed05659504f8fe64539ba8a23 Mon Sep 17 00:00:00 2001 From: Akash K <57758277+amk-dev@users.noreply.github.com> Date: Thu, 19 Sep 2024 19:09:14 +0530 Subject: [PATCH 056/159] chore: preemptly update pwa settings to avoid missing files in the service worker cache (#4344) Co-authored-by: Andrew Bastin --- packages/hoppscotch-selfhost-web/package.json | 4 +- .../hoppscotch-selfhost-web/vite.config.ts | 2 +- pnpm-lock.yaml | 159 ++++++++++++++---- 3 files changed, 132 insertions(+), 33 deletions(-) diff --git a/packages/hoppscotch-selfhost-web/package.json b/packages/hoppscotch-selfhost-web/package.json index 668259fea..35f561376 100644 --- a/packages/hoppscotch-selfhost-web/package.json +++ b/packages/hoppscotch-selfhost-web/package.json @@ -75,9 +75,9 @@ "vite-plugin-fonts": "0.7.0", "vite-plugin-html-config": "1.0.11", "vite-plugin-inspect": "0.7.42", - "vite-plugin-pages": "0.31.0", + "vite-plugin-pages": "0.17.3", "vite-plugin-pages-sitemap": "1.6.1", - "vite-plugin-pwa": "0.17.3", + "vite-plugin-pwa": "0.20.5", "vite-plugin-static-copy": "0.17.1", "vite-plugin-vue-layouts": "0.8.0", "vue-tsc": "1.8.24" diff --git a/packages/hoppscotch-selfhost-web/vite.config.ts b/packages/hoppscotch-selfhost-web/vite.config.ts index 94e63bcb9..0ce77efd4 100644 --- a/packages/hoppscotch-selfhost-web/vite.config.ts +++ b/packages/hoppscotch-selfhost-web/vite.config.ts @@ -208,7 +208,7 @@ export default defineConfig({ registerType: "prompt", workbox: { cleanupOutdatedCaches: true, - maximumFileSizeToCacheInBytes: 4194304, + maximumFileSizeToCacheInBytes: 10485760, navigateFallbackDenylist: [ /robots.txt/, /sitemap.xml/, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c813b1df4..250bd2502 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -380,7 +380,7 @@ importers: version: 3.2.5 tsup: specifier: 8.0.2 - version: 8.0.2(@swc/core@1.4.2)(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3) + version: 8.0.2(@swc/core@1.4.2)(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3) typescript: specifier: 5.3.3 version: 5.3.3 @@ -789,7 +789,7 @@ importers: version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) vite-plugin-checker: specifier: 0.6.2 - version: 0.6.2(eslint@8.57.0)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)) + version: 0.6.2(eslint@8.57.0)(meow@8.1.2)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)) vite-plugin-fonts: specifier: 0.7.0 version: 0.7.0(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) @@ -908,7 +908,7 @@ importers: version: 2.8.4 ts-jest: specifier: 27.1.5 - version: 27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5) + version: 27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -1092,7 +1092,7 @@ importers: version: 0.14.9(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 0.21.0 - version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vite: specifier: 4.5.0 version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) @@ -1101,7 +1101,7 @@ importers: version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-inspect: specifier: 0.7.38 - version: 0.7.38(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) + version: 0.7.38(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-pages: specifier: 0.26.0 version: 0.26.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) @@ -1261,7 +1261,7 @@ importers: version: 0.17.4(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 0.25.2 - version: 0.25.2(@babel/parser@7.24.5)(rollup@4.17.2)(vue@3.3.9(typescript@5.3.2)) + version: 0.25.2(@babel/parser@7.24.5)(rollup@3.29.4)(vue@3.3.9(typescript@5.3.2)) vite: specifier: 4.5.0 version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) @@ -1273,7 +1273,7 @@ importers: version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-inspect: specifier: 0.7.42 - version: 0.7.42(rollup@4.17.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) + version: 0.7.42(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-pages: specifier: 0.31.0 version: 0.31.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) @@ -1281,8 +1281,8 @@ importers: specifier: 1.6.1 version: 1.6.1 vite-plugin-pwa: - specifier: 0.17.3 - version: 0.17.3(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.0.0) + specifier: 0.20.5 + version: 0.20.5(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.0.0) vite-plugin-static-copy: specifier: 0.17.1 version: 0.17.1(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) @@ -1315,7 +1315,7 @@ importers: version: 0.1.0(vue@3.3.9(typescript@4.9.3)) '@intlify/unplugin-vue-i18n': specifier: 1.2.0 - version: 1.2.0(rollup@2.79.1)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) + version: 1.2.0(rollup@3.29.4)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) '@types/cors': specifier: 2.8.13 version: 2.8.13 @@ -1381,7 +1381,7 @@ importers: version: 0.14.9(@vue/compiler-sfc@3.2.45)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 0.21.0 - version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vue: specifier: 3.3.9 version: 3.3.9(typescript@4.9.3) @@ -6573,6 +6573,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decamelize-keys@1.1.1: resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} engines: {node: '>=0.10.0'} @@ -7537,6 +7546,14 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + fdir@6.3.0: + resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -9900,6 +9917,10 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + picomatch@4.0.2: + resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} + engines: {node: '>=12'} + pidtree@0.3.1: resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} engines: {node: '>=0.10'} @@ -11327,6 +11348,10 @@ packages: tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinyglobby@0.2.6: + resolution: {integrity: sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==} + engines: {node: '>=12.0.0'} + tinypool@0.7.0: resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} engines: {node: '>=14.0.0'} @@ -12052,6 +12077,18 @@ packages: workbox-build: ^7.0.0 workbox-window: ^7.0.0 + vite-plugin-pwa@0.20.5: + resolution: {integrity: sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==} + engines: {node: '>=16.0.0'} + peerDependencies: + '@vite-pwa/assets-generator': ^0.2.6 + vite: ^3.1.0 || ^4.0.0 || ^5.0.0 + workbox-build: ^7.1.0 + workbox-window: ^7.1.0 + peerDependenciesMeta: + '@vite-pwa/assets-generator': + optional: true + vite-plugin-static-copy@0.12.0: resolution: {integrity: sha512-5a8hCjYJdf/rl8s7ct/YWt97gXdGPGNSOoJtkY5IYhbnSq04X1gTt5GpFHKfAxhHoed1Grfw3Ed13t7AjJi7gw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -15962,11 +15999,11 @@ snapshots: '@intlify/shared@9.8.0': {} - '@intlify/unplugin-vue-i18n@1.2.0(rollup@2.79.1)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))': + '@intlify/unplugin-vue-i18n@1.2.0(rollup@3.29.4)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))': dependencies: '@intlify/bundle-utils': 7.5.1(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) '@intlify/shared': 9.13.1 - '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) '@vue/compiler-sfc': 3.3.10 debug: 4.3.4(supports-color@9.4.0) fast-glob: 3.3.2 @@ -19816,6 +19853,10 @@ snapshots: optionalDependencies: supports-color: 9.4.0 + debug@4.3.7: + dependencies: + ms: 2.1.3 + decamelize-keys@1.1.1: dependencies: decamelize: 1.2.0 @@ -21122,6 +21163,10 @@ snapshots: dependencies: pend: 1.2.0 + fdir@6.3.0(picomatch@4.0.2): + optionalDependencies: + picomatch: 4.0.2 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -24392,6 +24437,8 @@ snapshots: picomatch@2.3.1: {} + picomatch@4.0.2: {} + pidtree@0.3.1: {} pidtree@0.5.0: {} @@ -24499,12 +24546,12 @@ snapshots: postcss: 8.4.32 ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2) - postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)): + postcss-load-config@4.0.2(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: - postcss: 8.4.40 + postcss: 8.4.32 ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3) postcss-merge-longhand@7.0.2(postcss@8.4.40): @@ -26053,6 +26100,11 @@ snapshots: tinybench@2.8.0: {} + tinyglobby@0.2.6: + dependencies: + fdir: 6.3.0(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@0.7.0: {} tinyspy@2.2.1: {} @@ -26129,7 +26181,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5): + ts-jest@27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -26144,6 +26196,7 @@ snapshots: optionalDependencies: '@babel/core': 7.24.5 '@types/jest': 27.5.2 + babel-jest: 29.7.0(@babel/core@7.24.5) ts-jest@29.0.5(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.4.1(@types/node@18.11.10)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.11.10)(typescript@4.9.3)))(typescript@4.9.3): dependencies: @@ -26349,7 +26402,7 @@ snapshots: tslib@2.6.2: {} - tsup@8.0.2(@swc/core@1.4.2)(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3): + tsup@8.0.2(@swc/core@1.4.2)(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3): dependencies: bundle-require: 4.1.0(esbuild@0.19.12) cac: 6.7.14 @@ -26359,7 +26412,7 @@ snapshots: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)) + postcss-load-config: 4.0.2(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)) resolve-from: 5.0.0 rollup: 4.17.2 source-map: 0.8.0-beta.0 @@ -26367,7 +26420,7 @@ snapshots: tree-kill: 1.2.2 optionalDependencies: '@swc/core': 1.4.2 - postcss: 8.4.40 + postcss: 8.4.32 typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -26588,7 +26641,7 @@ snapshots: transitivePeerDependencies: - supports-color - unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: '@antfu/utils': 0.5.2 '@rollup/pluginutils': 4.2.1 @@ -26599,7 +26652,7 @@ snapshots: magic-string: 0.26.7 minimatch: 5.1.6 resolve: 1.22.8 - unplugin: 0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + unplugin: 0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vue: 3.3.9(typescript@4.9.3) optionalDependencies: '@babel/parser': 7.24.5 @@ -26610,7 +26663,7 @@ snapshots: - vite - webpack - unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: '@antfu/utils': 0.5.2 '@rollup/pluginutils': 4.2.1 @@ -26621,7 +26674,7 @@ snapshots: magic-string: 0.26.7 minimatch: 5.1.6 resolve: 1.22.8 - unplugin: 0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + unplugin: 0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vue: 3.3.9(typescript@4.9.5) optionalDependencies: '@babel/parser': 7.24.5 @@ -26632,6 +26685,25 @@ snapshots: - vite - webpack + unplugin-vue-components@0.25.2(@babel/parser@7.24.5)(rollup@3.29.4)(vue@3.3.9(typescript@5.3.2)): + dependencies: + '@antfu/utils': 0.7.7 + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + chokidar: 3.6.0 + debug: 4.3.4(supports-color@9.4.0) + fast-glob: 3.3.2 + local-pkg: 0.4.3 + magic-string: 0.30.10 + minimatch: 9.0.4 + resolve: 1.22.8 + unplugin: 1.10.1 + vue: 3.3.9(typescript@5.3.2) + optionalDependencies: + '@babel/parser': 7.24.5 + transitivePeerDependencies: + - rollup + - supports-color + unplugin-vue-components@0.25.2(@babel/parser@7.24.5)(rollup@4.17.2)(vue@3.3.9(typescript@5.3.2)): dependencies: '@antfu/utils': 0.7.7 @@ -26651,7 +26723,7 @@ snapshots: - rollup - supports-color - unplugin@0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin@0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: acorn: 8.11.3 chokidar: 3.6.0 @@ -26659,11 +26731,11 @@ snapshots: webpack-virtual-modules: 0.4.6 optionalDependencies: esbuild: 0.20.2 - rollup: 2.79.1 + rollup: 3.29.4 vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0) webpack: 5.91.0(@swc/core@1.4.2)(esbuild@0.20.2) - unplugin@0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin@0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: acorn: 8.11.3 chokidar: 3.6.0 @@ -26671,7 +26743,7 @@ snapshots: webpack-virtual-modules: 0.4.6 optionalDependencies: esbuild: 0.20.2 - rollup: 2.79.1 + rollup: 3.29.4 vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) webpack: 5.91.0(@swc/core@1.4.2)(esbuild@0.20.2) @@ -26816,7 +26888,7 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.6.2(eslint@8.57.0)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)): + vite-plugin-checker@0.6.2(eslint@8.57.0)(meow@8.1.2)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)): dependencies: '@babel/code-frame': 7.24.2 ansi-escapes: 4.3.2 @@ -26838,6 +26910,7 @@ snapshots: vscode-uri: 3.0.8 optionalDependencies: eslint: 8.57.0 + meow: 8.1.2 optionator: 0.9.4 typescript: 5.3.2 vue-tsc: 1.8.24(typescript@5.3.2) @@ -26883,10 +26956,25 @@ snapshots: dependencies: vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) - vite-plugin-inspect@0.7.38(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): + vite-plugin-inspect@0.7.38(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): dependencies: '@antfu/utils': 0.7.7 - '@rollup/pluginutils': 5.1.0(rollup@2.79.1) + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + debug: 4.3.4(supports-color@9.4.0) + error-stack-parser-es: 0.1.1 + fs-extra: 11.2.0 + open: 9.1.0 + picocolors: 1.0.0 + sirv: 2.0.4 + vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) + transitivePeerDependencies: + - rollup + - supports-color + + vite-plugin-inspect@0.7.42(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): + dependencies: + '@antfu/utils': 0.7.7 + '@rollup/pluginutils': 5.1.0(rollup@3.29.4) debug: 4.3.4(supports-color@9.4.0) error-stack-parser-es: 0.1.1 fs-extra: 11.2.0 @@ -26989,6 +27077,17 @@ snapshots: transitivePeerDependencies: - supports-color + vite-plugin-pwa@0.20.5(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.0.0): + dependencies: + debug: 4.3.7 + pretty-bytes: 6.1.1 + tinyglobby: 0.2.6 + vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) + workbox-build: 7.1.0(@types/babel__core@7.20.5) + workbox-window: 7.0.0 + transitivePeerDependencies: + - supports-color + vite-plugin-static-copy@0.12.0(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): dependencies: chokidar: 3.6.0 From 412de9a44ef9670397fa93ddf0812f16f3dfae2b Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Thu, 19 Sep 2024 20:47:24 +0530 Subject: [PATCH 057/159] chore: bump lockfiles --- pnpm-lock.yaml | 130 ++++++++++++++++++++++++------------------------- 1 file changed, 63 insertions(+), 67 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 250bd2502..dc0054620 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -380,7 +380,7 @@ importers: version: 3.2.5 tsup: specifier: 8.0.2 - version: 8.0.2(@swc/core@1.4.2)(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3) + version: 8.0.2(@swc/core@1.4.2)(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3) typescript: specifier: 5.3.3 version: 5.3.3 @@ -789,7 +789,7 @@ importers: version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) vite-plugin-checker: specifier: 0.6.2 - version: 0.6.2(eslint@8.57.0)(meow@8.1.2)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)) + version: 0.6.2(eslint@8.57.0)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)) vite-plugin-fonts: specifier: 0.7.0 version: 0.7.0(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) @@ -908,7 +908,7 @@ importers: version: 2.8.4 ts-jest: specifier: 27.1.5 - version: 27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5) + version: 27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5) typescript: specifier: 4.9.5 version: 4.9.5 @@ -1092,7 +1092,7 @@ importers: version: 0.14.9(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 0.21.0 - version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vite: specifier: 4.5.0 version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) @@ -1101,7 +1101,7 @@ importers: version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-inspect: specifier: 0.7.38 - version: 0.7.38(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) + version: 0.7.38(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-pages: specifier: 0.26.0 version: 0.26.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) @@ -1261,7 +1261,7 @@ importers: version: 0.17.4(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 0.25.2 - version: 0.25.2(@babel/parser@7.24.5)(rollup@3.29.4)(vue@3.3.9(typescript@5.3.2)) + version: 0.25.2(@babel/parser@7.24.5)(rollup@4.17.2)(vue@3.3.9(typescript@5.3.2)) vite: specifier: 4.5.0 version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) @@ -1273,10 +1273,10 @@ importers: version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-inspect: specifier: 0.7.42 - version: 0.7.42(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) + version: 0.7.42(rollup@4.17.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-pages: - specifier: 0.31.0 - version: 0.31.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) + specifier: 0.17.3 + version: 0.17.3(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-pages-sitemap: specifier: 1.6.1 version: 1.6.1 @@ -1315,7 +1315,7 @@ importers: version: 0.1.0(vue@3.3.9(typescript@4.9.3)) '@intlify/unplugin-vue-i18n': specifier: 1.2.0 - version: 1.2.0(rollup@3.29.4)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) + version: 1.2.0(rollup@2.79.1)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) '@types/cors': specifier: 2.8.13 version: 2.8.13 @@ -1381,7 +1381,7 @@ importers: version: 0.14.9(@vue/compiler-sfc@3.2.45)(vue-template-compiler@2.7.16) unplugin-vue-components: specifier: 0.21.0 - version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + version: 0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vue: specifier: 3.3.9 version: 3.3.9(typescript@4.9.3) @@ -1513,6 +1513,9 @@ packages: '@antfu/install-pkg@0.1.1': resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} + '@antfu/utils@0.2.4': + resolution: {integrity: sha512-2bZNkVfL9IZESmvE26UKi8SzyvSoaIsGXDcnbHFMtmGMqUiB1fXpAJ1ijGf+tSqKRQ5yagck2U1Qk0p+705/kw==} + '@antfu/utils@0.5.2': resolution: {integrity: sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==} @@ -4774,6 +4777,9 @@ packages: '@types/supertest@2.0.12': resolution: {integrity: sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==} + '@types/throttle-debounce@2.1.0': + resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} + '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -12044,6 +12050,15 @@ packages: vite-plugin-pages-sitemap@1.6.1: resolution: {integrity: sha512-8Nil2Q6qltBnxL/OX19ORMFxLGM//7mlW7LG+LCR8qOygxdzEIyxyw3LBz0j5tGwJr8BDSpuBW2MkMTtP6wBTQ==} + vite-plugin-pages@0.17.3: + resolution: {integrity: sha512-Lyn4kZ+2cbj47JwW3ENRyDv7lo10YPcPFKKXOqPR96RoL665DLqVs4UjvSUQjKleH+OTG4moCYRHbFDRw62d/Q==} + peerDependencies: + '@vue/compiler-sfc': '>=3' + vite: '>=2' + peerDependenciesMeta: + '@vue/compiler-sfc': + optional: true + vite-plugin-pages@0.26.0: resolution: {integrity: sha512-yJZvwHEt7puYIf19S89IvkDsWPjWleSied4H8hmdW6i8buCA93z1UAU1ipW1d8fNKrC4FzXsUHHbPm6+kl1p9w==} peerDependencies: @@ -12911,6 +12926,10 @@ snapshots: execa: 5.1.1 find-up: 5.0.0 + '@antfu/utils@0.2.4': + dependencies: + '@types/throttle-debounce': 2.1.0 + '@antfu/utils@0.5.2': {} '@antfu/utils@0.7.7': {} @@ -15999,11 +16018,11 @@ snapshots: '@intlify/shared@9.8.0': {} - '@intlify/unplugin-vue-i18n@1.2.0(rollup@3.29.4)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))': + '@intlify/unplugin-vue-i18n@1.2.0(rollup@2.79.1)(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))': dependencies: '@intlify/bundle-utils': 7.5.1(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3))) '@intlify/shared': 9.13.1 - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) '@vue/compiler-sfc': 3.3.10 debug: 4.3.4(supports-color@9.4.0) fast-glob: 3.3.2 @@ -17357,6 +17376,8 @@ snapshots: dependencies: '@types/superagent': 8.1.7 + '@types/throttle-debounce@2.1.0': {} + '@types/trusted-types@2.0.7': {} '@types/ua-parser-js@0.7.39': {} @@ -21842,7 +21863,7 @@ snapshots: dependencies: '@tootallnate/once': 1.1.2 agent-base: 6.0.2 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.7 transitivePeerDependencies: - supports-color optional: true @@ -24546,12 +24567,12 @@ snapshots: postcss: 8.4.32 ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2) - postcss-load-config@4.0.2(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)): + postcss-load-config@4.0.2(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)): dependencies: lilconfig: 3.1.1 yaml: 2.4.2 optionalDependencies: - postcss: 8.4.32 + postcss: 8.4.40 ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3) postcss-merge-longhand@7.0.2(postcss@8.4.40): @@ -26181,7 +26202,7 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-jest@27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5): + ts-jest@27.1.5(@babel/core@7.24.5)(@types/jest@27.5.2)(jest@29.7.0(@types/node@17.0.45)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@17.0.45)(typescript@4.9.5)))(typescript@4.9.5): dependencies: bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 @@ -26196,7 +26217,6 @@ snapshots: optionalDependencies: '@babel/core': 7.24.5 '@types/jest': 27.5.2 - babel-jest: 29.7.0(@babel/core@7.24.5) ts-jest@29.0.5(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.4.1(@types/node@18.11.10)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.11.10)(typescript@4.9.3)))(typescript@4.9.3): dependencies: @@ -26402,7 +26422,7 @@ snapshots: tslib@2.6.2: {} - tsup@8.0.2(@swc/core@1.4.2)(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3): + tsup@8.0.2(@swc/core@1.4.2)(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3))(typescript@5.3.3): dependencies: bundle-require: 4.1.0(esbuild@0.19.12) cac: 6.7.14 @@ -26412,7 +26432,7 @@ snapshots: execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss-load-config: 4.0.2(postcss@8.4.32)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)) + postcss-load-config: 4.0.2(postcss@8.4.40)(ts-node@10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.3)) resolve-from: 5.0.0 rollup: 4.17.2 source-map: 0.8.0-beta.0 @@ -26420,7 +26440,7 @@ snapshots: tree-kill: 1.2.2 optionalDependencies: '@swc/core': 1.4.2 - postcss: 8.4.32 + postcss: 8.4.40 typescript: 5.3.3 transitivePeerDependencies: - supports-color @@ -26641,7 +26661,7 @@ snapshots: transitivePeerDependencies: - supports-color - unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(vue@3.3.9(typescript@4.9.3))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: '@antfu/utils': 0.5.2 '@rollup/pluginutils': 4.2.1 @@ -26652,7 +26672,7 @@ snapshots: magic-string: 0.26.7 minimatch: 5.1.6 resolve: 1.22.8 - unplugin: 0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + unplugin: 0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vue: 3.3.9(typescript@4.9.3) optionalDependencies: '@babel/parser': 7.24.5 @@ -26663,7 +26683,7 @@ snapshots: - vite - webpack - unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin-vue-components@0.21.0(@babel/parser@7.24.5)(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue@3.3.9(typescript@4.9.5))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: '@antfu/utils': 0.5.2 '@rollup/pluginutils': 4.2.1 @@ -26674,7 +26694,7 @@ snapshots: magic-string: 0.26.7 minimatch: 5.1.6 resolve: 1.22.8 - unplugin: 0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) + unplugin: 0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)) vue: 3.3.9(typescript@4.9.5) optionalDependencies: '@babel/parser': 7.24.5 @@ -26685,25 +26705,6 @@ snapshots: - vite - webpack - unplugin-vue-components@0.25.2(@babel/parser@7.24.5)(rollup@3.29.4)(vue@3.3.9(typescript@5.3.2)): - dependencies: - '@antfu/utils': 0.7.7 - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) - chokidar: 3.6.0 - debug: 4.3.4(supports-color@9.4.0) - fast-glob: 3.3.2 - local-pkg: 0.4.3 - magic-string: 0.30.10 - minimatch: 9.0.4 - resolve: 1.22.8 - unplugin: 1.10.1 - vue: 3.3.9(typescript@5.3.2) - optionalDependencies: - '@babel/parser': 7.24.5 - transitivePeerDependencies: - - rollup - - supports-color - unplugin-vue-components@0.25.2(@babel/parser@7.24.5)(rollup@4.17.2)(vue@3.3.9(typescript@5.3.2)): dependencies: '@antfu/utils': 0.7.7 @@ -26723,7 +26724,7 @@ snapshots: - rollup - supports-color - unplugin@0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin@0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: acorn: 8.11.3 chokidar: 3.6.0 @@ -26731,11 +26732,11 @@ snapshots: webpack-virtual-modules: 0.4.6 optionalDependencies: esbuild: 0.20.2 - rollup: 3.29.4 + rollup: 2.79.1 vite: 3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0) webpack: 5.91.0(@swc/core@1.4.2)(esbuild@0.20.2) - unplugin@0.7.2(esbuild@0.20.2)(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): + unplugin@0.7.2(esbuild@0.20.2)(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(webpack@5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)): dependencies: acorn: 8.11.3 chokidar: 3.6.0 @@ -26743,7 +26744,7 @@ snapshots: webpack-virtual-modules: 0.4.6 optionalDependencies: esbuild: 0.20.2 - rollup: 3.29.4 + rollup: 2.79.1 vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) webpack: 5.91.0(@swc/core@1.4.2)(esbuild@0.20.2) @@ -26888,7 +26889,7 @@ snapshots: - supports-color - terser - vite-plugin-checker@0.6.2(eslint@8.57.0)(meow@8.1.2)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)): + vite-plugin-checker@0.6.2(eslint@8.57.0)(optionator@0.9.4)(typescript@5.3.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(vue-tsc@1.8.24(typescript@5.3.2)): dependencies: '@babel/code-frame': 7.24.2 ansi-escapes: 4.3.2 @@ -26910,7 +26911,6 @@ snapshots: vscode-uri: 3.0.8 optionalDependencies: eslint: 8.57.0 - meow: 8.1.2 optionator: 0.9.4 typescript: 5.3.2 vue-tsc: 1.8.24(typescript@5.3.2) @@ -26956,25 +26956,10 @@ snapshots: dependencies: vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) - vite-plugin-inspect@0.7.38(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): + vite-plugin-inspect@0.7.38(rollup@2.79.1)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): dependencies: '@antfu/utils': 0.7.7 - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) - debug: 4.3.4(supports-color@9.4.0) - error-stack-parser-es: 0.1.1 - fs-extra: 11.2.0 - open: 9.1.0 - picocolors: 1.0.0 - sirv: 2.0.4 - vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) - transitivePeerDependencies: - - rollup - - supports-color - - vite-plugin-inspect@0.7.42(rollup@3.29.4)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): - dependencies: - '@antfu/utils': 0.7.7 - '@rollup/pluginutils': 5.1.0(rollup@3.29.4) + '@rollup/pluginutils': 5.1.0(rollup@2.79.1) debug: 4.3.4(supports-color@9.4.0) error-stack-parser-es: 0.1.1 fs-extra: 11.2.0 @@ -27003,6 +26988,17 @@ snapshots: vite-plugin-pages-sitemap@1.6.1: {} + vite-plugin-pages@0.17.3(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): + dependencies: + '@antfu/utils': 0.2.4 + deep-equal: 2.2.3 + fast-glob: 3.3.2 + json5: 2.2.3 + vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) + yaml: 2.4.2 + optionalDependencies: + '@vue/compiler-sfc': 3.3.10 + vite-plugin-pages@0.26.0(@vue/compiler-sfc@3.2.45)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0)): dependencies: '@types/debug': 4.1.12 From e9e1366cc8a0f6d3116cb4ab5a44b964d1d36128 Mon Sep 17 00:00:00 2001 From: Andrew Bastin Date: Fri, 20 Sep 2024 14:20:14 +0530 Subject: [PATCH 058/159] chore: revert vite-plugin-pages and vite-plugin-pwa versions --- packages/hoppscotch-selfhost-web/package.json | 4 +- pnpm-lock.yaml | 112 +++--------------- 2 files changed, 17 insertions(+), 99 deletions(-) diff --git a/packages/hoppscotch-selfhost-web/package.json b/packages/hoppscotch-selfhost-web/package.json index 35f561376..668259fea 100644 --- a/packages/hoppscotch-selfhost-web/package.json +++ b/packages/hoppscotch-selfhost-web/package.json @@ -75,9 +75,9 @@ "vite-plugin-fonts": "0.7.0", "vite-plugin-html-config": "1.0.11", "vite-plugin-inspect": "0.7.42", - "vite-plugin-pages": "0.17.3", + "vite-plugin-pages": "0.31.0", "vite-plugin-pages-sitemap": "1.6.1", - "vite-plugin-pwa": "0.20.5", + "vite-plugin-pwa": "0.17.3", "vite-plugin-static-copy": "0.17.1", "vite-plugin-vue-layouts": "0.8.0", "vue-tsc": "1.8.24" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc0054620..af21abc94 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1275,14 +1275,14 @@ importers: specifier: 0.7.42 version: 0.7.42(rollup@4.17.2)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-pages: - specifier: 0.17.3 - version: 0.17.3(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) + specifier: 0.31.0 + version: 0.31.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) vite-plugin-pages-sitemap: specifier: 1.6.1 version: 1.6.1 vite-plugin-pwa: - specifier: 0.20.5 - version: 0.20.5(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.0.0) + specifier: 0.17.3 + version: 0.17.3(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.0.0) vite-plugin-static-copy: specifier: 0.17.1 version: 0.17.1(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)) @@ -1513,9 +1513,6 @@ packages: '@antfu/install-pkg@0.1.1': resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==} - '@antfu/utils@0.2.4': - resolution: {integrity: sha512-2bZNkVfL9IZESmvE26UKi8SzyvSoaIsGXDcnbHFMtmGMqUiB1fXpAJ1ijGf+tSqKRQ5yagck2U1Qk0p+705/kw==} - '@antfu/utils@0.5.2': resolution: {integrity: sha512-CQkeV+oJxUazwjlHD0/3ZD08QWKuGQkhnrKo3e6ly5pd48VUpXbb77q0xMU4+vc2CkJnDS02Eq/M9ugyX20XZA==} @@ -4777,9 +4774,6 @@ packages: '@types/supertest@2.0.12': resolution: {integrity: sha512-X3HPWTwXRerBZS7Mo1k6vMVR1Z6zmJcDVn5O/31whe0tnjE4te6ZJSJGq1RiqHPjzPdMTfjCFogDJmwng9xHaQ==} - '@types/throttle-debounce@2.1.0': - resolution: {integrity: sha512-5eQEtSCoESnh2FsiLTxE121IiE60hnMqcb435fShf4bpLRjEu1Eoekht23y6zXS9Ts3l+Szu3TARnTsA0GkOkQ==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -7552,14 +7546,6 @@ packages: fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - fdir@6.3.0: - resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -9923,10 +9909,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - pidtree@0.3.1: resolution: {integrity: sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==} engines: {node: '>=0.10'} @@ -11354,10 +11336,6 @@ packages: tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} - tinyglobby@0.2.6: - resolution: {integrity: sha512-NbBoFBpqfcgd1tCiO8Lkfdk+xrA7mlLR9zgvZcZWQQwU63XAfUePyd6wZBaU93Hqw347lHnwFzttAkemHzzz4g==} - engines: {node: '>=12.0.0'} - tinypool@0.7.0: resolution: {integrity: sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==} engines: {node: '>=14.0.0'} @@ -12050,15 +12028,6 @@ packages: vite-plugin-pages-sitemap@1.6.1: resolution: {integrity: sha512-8Nil2Q6qltBnxL/OX19ORMFxLGM//7mlW7LG+LCR8qOygxdzEIyxyw3LBz0j5tGwJr8BDSpuBW2MkMTtP6wBTQ==} - vite-plugin-pages@0.17.3: - resolution: {integrity: sha512-Lyn4kZ+2cbj47JwW3ENRyDv7lo10YPcPFKKXOqPR96RoL665DLqVs4UjvSUQjKleH+OTG4moCYRHbFDRw62d/Q==} - peerDependencies: - '@vue/compiler-sfc': '>=3' - vite: '>=2' - peerDependenciesMeta: - '@vue/compiler-sfc': - optional: true - vite-plugin-pages@0.26.0: resolution: {integrity: sha512-yJZvwHEt7puYIf19S89IvkDsWPjWleSied4H8hmdW6i8buCA93z1UAU1ipW1d8fNKrC4FzXsUHHbPm6+kl1p9w==} peerDependencies: @@ -12092,18 +12061,6 @@ packages: workbox-build: ^7.0.0 workbox-window: ^7.0.0 - vite-plugin-pwa@0.20.5: - resolution: {integrity: sha512-aweuI/6G6n4C5Inn0vwHumElU/UEpNuO+9iZzwPZGTCH87TeZ6YFMrEY6ZUBQdIHHlhTsbMDryFARcSuOdsz9Q==} - engines: {node: '>=16.0.0'} - peerDependencies: - '@vite-pwa/assets-generator': ^0.2.6 - vite: ^3.1.0 || ^4.0.0 || ^5.0.0 - workbox-build: ^7.1.0 - workbox-window: ^7.1.0 - peerDependenciesMeta: - '@vite-pwa/assets-generator': - optional: true - vite-plugin-static-copy@0.12.0: resolution: {integrity: sha512-5a8hCjYJdf/rl8s7ct/YWt97gXdGPGNSOoJtkY5IYhbnSq04X1gTt5GpFHKfAxhHoed1Grfw3Ed13t7AjJi7gw==} engines: {node: ^14.18.0 || >=16.0.0} @@ -12926,10 +12883,6 @@ snapshots: execa: 5.1.1 find-up: 5.0.0 - '@antfu/utils@0.2.4': - dependencies: - '@types/throttle-debounce': 2.1.0 - '@antfu/utils@0.5.2': {} '@antfu/utils@0.7.7': {} @@ -13230,7 +13183,7 @@ snapshots: '@babel/core': 7.24.5 '@babel/helper-compilation-targets': 7.23.6 '@babel/helper-plugin-utils': 7.24.5 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -13910,7 +13863,7 @@ snapshots: '@babel/helper-split-export-declaration': 7.24.5 '@babel/parser': 7.24.5 '@babel/types': 7.24.5 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -17376,8 +17329,6 @@ snapshots: dependencies: '@types/superagent': 8.1.7 - '@types/throttle-debounce@2.1.0': {} - '@types/trusted-types@2.0.7': {} '@types/ua-parser-js@0.7.39': {} @@ -18668,13 +18619,13 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.7 transitivePeerDependencies: - supports-color agent-base@7.1.1: dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -21184,10 +21135,6 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.3.0(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -21871,7 +21818,7 @@ snapshots: http-proxy-agent@6.1.1: dependencies: agent-base: 7.1.1 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -21921,7 +21868,7 @@ snapshots: https-proxy-agent@6.2.1: dependencies: agent-base: 7.1.1 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -22333,7 +22280,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.7 istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -24458,8 +24405,6 @@ snapshots: picomatch@2.3.1: {} - picomatch@4.0.2: {} - pidtree@0.3.1: {} pidtree@0.5.0: {} @@ -25890,7 +25835,7 @@ snapshots: css-tree: 2.3.1 css-what: 6.1.0 csso: 5.0.5 - picocolors: 1.0.0 + picocolors: 1.0.1 swagger-methods@2.0.2: {} @@ -26121,11 +26066,6 @@ snapshots: tinybench@2.8.0: {} - tinyglobby@0.2.6: - dependencies: - fdir: 6.3.0(picomatch@4.0.2) - picomatch: 4.0.2 - tinypool@0.7.0: {} tinyspy@2.2.1: {} @@ -26988,17 +26928,6 @@ snapshots: vite-plugin-pages-sitemap@1.6.1: {} - vite-plugin-pages@0.17.3(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): - dependencies: - '@antfu/utils': 0.2.4 - deep-equal: 2.2.3 - fast-glob: 3.3.2 - json5: 2.2.3 - vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) - yaml: 2.4.2 - optionalDependencies: - '@vue/compiler-sfc': 3.3.10 - vite-plugin-pages@0.26.0(@vue/compiler-sfc@3.2.45)(vite@3.2.4(@types/node@18.18.8)(sass@1.58.0)(terser@5.31.0)): dependencies: '@types/debug': 4.1.12 @@ -27036,13 +26965,13 @@ snapshots: vite-plugin-pages@0.31.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): dependencies: '@types/debug': 4.1.12 - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.7 deep-equal: 2.2.3 extract-comments: 1.1.0 fast-glob: 3.3.2 json5: 2.2.3 local-pkg: 0.4.3 - picocolors: 1.0.0 + picocolors: 1.0.1 vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) yaml: 2.4.2 optionalDependencies: @@ -27064,7 +26993,7 @@ snapshots: vite-plugin-pwa@0.17.3(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.0.0): dependencies: - debug: 4.3.4(supports-color@9.4.0) + debug: 4.3.7 fast-glob: 3.3.2 pretty-bytes: 6.1.1 vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) @@ -27073,17 +27002,6 @@ snapshots: transitivePeerDependencies: - supports-color - vite-plugin-pwa@0.20.5(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))(workbox-build@7.1.0(@types/babel__core@7.20.5))(workbox-window@7.0.0): - dependencies: - debug: 4.3.7 - pretty-bytes: 6.1.1 - tinyglobby: 0.2.6 - vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0) - workbox-build: 7.1.0(@types/babel__core@7.20.5) - workbox-window: 7.0.0 - transitivePeerDependencies: - - supports-color - vite-plugin-static-copy@0.12.0(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)): dependencies: chokidar: 3.6.0 From 1701961335b443d777c0d1d2336f02e075575d8d Mon Sep 17 00:00:00 2001 From: HelixY2J <100087653+HelixY2J@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:00:48 +0530 Subject: [PATCH 059/159] feat: add loading state for import actions (#4217) Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com> --- .../components/collections/ImportExport.vue | 104 ++++++++++----- .../collections/graphql/ImportExport.vue | 2 +- .../components/environments/ImportExport.vue | 120 +++++++++++------- .../ImportExportSteps/FileImport.vue | 27 +++- .../ImportExportSteps/MyCollectionImport.vue | 7 +- .../ImportExportSteps/UrlImport.vue | 20 ++- .../import/import-sources/FileSource.ts | 3 + .../import/import-sources/GistSource.ts | 5 +- .../import/import-sources/UrlSource.ts | 3 + 9 files changed, 196 insertions(+), 95 deletions(-) diff --git a/packages/hoppscotch-common/src/components/collections/ImportExport.vue b/packages/hoppscotch-common/src/components/collections/ImportExport.vue index dc098b53f..4287fde90 100644 --- a/packages/hoppscotch-common/src/components/collections/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/collections/ImportExport.vue @@ -19,30 +19,30 @@ import { UrlSource } from "~/helpers/import-export/import/import-sources/UrlSour import IconFile from "~icons/lucide/file" import { - hoppRESTImporter, - hoppInsomniaImporter, - hoppPostmanImporter, - toTeamsImporter, - hoppOpenAPIImporter, harImporter, + hoppInsomniaImporter, + hoppOpenAPIImporter, + hoppPostmanImporter, + hoppRESTImporter, + toTeamsImporter, } from "~/helpers/import-export/import/importers" import { defineStep } from "~/composables/step-components" +import MyCollectionImport from "~/components/importExport/ImportExportSteps/MyCollectionImport.vue" import { useI18n } from "~/composables/i18n" import { useToast } from "~/composables/toast" import { appendRESTCollections, restCollections$ } from "~/newstore/collections" -import MyCollectionImport from "~/components/importExport/ImportExportSteps/MyCollectionImport.vue" -import IconFolderPlus from "~icons/lucide/folder-plus" -import IconOpenAPI from "~icons/lucide/file" -import IconPostman from "~icons/hopp/postman" import IconInsomnia from "~icons/hopp/insomnia" +import IconPostman from "~icons/hopp/postman" +import IconOpenAPI from "~icons/lucide/file" +import IconFolderPlus from "~icons/lucide/folder-plus" import IconGithub from "~icons/lucide/github" import IconLink from "~icons/lucide/link" -import IconUser from "~icons/lucide/user" import { useReadonlyStream } from "~/composables/stream" +import IconUser from "~icons/lucide/user" import { getTeamCollectionJSON } from "~/helpers/backend/helpers" @@ -53,10 +53,18 @@ import { gistExporter } from "~/helpers/import-export/export/gist" import { myCollectionsExporter } from "~/helpers/import-export/export/myCollections" import { teamCollectionsExporter } from "~/helpers/import-export/export/teamCollections" -import { GistSource } from "~/helpers/import-export/import/import-sources/GistSource" import { ImporterOrExporter } from "~/components/importExport/types" +import { GistSource } from "~/helpers/import-export/import/import-sources/GistSource" import { TeamWorkspace } from "~/services/workspace.service" +const isPostmanImporterInProgress = ref(false) +const isInsomniaImporterInProgress = ref(false) +const isOpenAPIImporterInProgress = ref(false) +const isRESTImporterInProgress = ref(false) +const isPersonalCollectionImporterInProgress = ref(false) +const isHarImporterInProgress = ref(false) +const isGistImporterInProgress = ref(false) + const t = useI18n() const toast = useToast() @@ -92,7 +100,7 @@ const showImportFailedError = () => { const handleImportToStore = async (collections: HoppCollection[]) => { const importResult = props.collectionsType.type === "my-collections" - ? await importToPersonalWorkspace(collections) + ? importToPersonalWorkspace(collections) : await importToTeamsWorkspace(collections) if (E.isRight(importResult)) { @@ -179,10 +187,11 @@ const HoppRESTImporter: ImporterOrExporter = { caption: "import.from_file", acceptedFileTypes: ".json", onImportFromFile: async (content) => { + isRESTImporterInProgress.value = true const res = await hoppRESTImporter(content)() if (E.isRight(res)) { - handleImportToStore(res.right) + await handleImportToStore(res.right) platform.analytics?.logEvent({ type: "HOPP_IMPORT_COLLECTION", @@ -193,7 +202,10 @@ const HoppRESTImporter: ImporterOrExporter = { } else { showImportFailedError() } + + isRESTImporterInProgress.value = false }, + isLoading: isRESTImporterInProgress, }), } @@ -207,8 +219,11 @@ const HoppMyCollectionImporter: ImporterOrExporter = { applicableTo: ["team-workspace"], }, component: defineStep("my_collection_import", MyCollectionImport, () => ({ + loading: isPersonalCollectionImporterInProgress.value, async onImportFromMyCollection(content) { - handleImportToStore([content]) + isPersonalCollectionImporterInProgress.value = true + + await handleImportToStore([content]) // our analytics consider this as an export event, so keeping compatibility with that platform.analytics?.logEvent({ @@ -216,6 +231,8 @@ const HoppMyCollectionImporter: ImporterOrExporter = { exporter: "import_to_teams", platform: "rest", }) + + isPersonalCollectionImporterInProgress.value = false }, })), } @@ -238,10 +255,12 @@ const HoppOpenAPIImporter: ImporterOrExporter = { caption: "import.from_file", acceptedFileTypes: ".json, .yaml, .yml", onImportFromFile: async (content) => { + isOpenAPIImporterInProgress.value = true + const res = await hoppOpenAPIImporter(content)() if (E.isRight(res)) { - handleImportToStore(res.right) + await handleImportToStore(res.right) platform.analytics?.logEvent({ platform: "rest", @@ -252,7 +271,10 @@ const HoppOpenAPIImporter: ImporterOrExporter = { } else { showImportFailedError() } + + isOpenAPIImporterInProgress.value = false }, + isLoading: isOpenAPIImporterInProgress, }), }, { @@ -262,10 +284,12 @@ const HoppOpenAPIImporter: ImporterOrExporter = { step: UrlSource({ caption: "import.from_url", onImportFromURL: async (content) => { + isOpenAPIImporterInProgress.value = true + const res = await hoppOpenAPIImporter([content])() if (E.isRight(res)) { - handleImportToStore(res.right) + await handleImportToStore(res.right) platform.analytics?.logEvent({ platform: "rest", @@ -276,7 +300,10 @@ const HoppOpenAPIImporter: ImporterOrExporter = { } else { showImportFailedError() } + + isOpenAPIImporterInProgress.value = false }, + isLoading: isOpenAPIImporterInProgress, }), }, ], @@ -295,10 +322,12 @@ const HoppPostmanImporter: ImporterOrExporter = { caption: "import.from_file", acceptedFileTypes: ".json", onImportFromFile: async (content) => { + isPostmanImporterInProgress.value = true + const res = await hoppPostmanImporter(content)() if (E.isRight(res)) { - handleImportToStore(res.right) + await handleImportToStore(res.right) platform.analytics?.logEvent({ platform: "rest", @@ -309,7 +338,10 @@ const HoppPostmanImporter: ImporterOrExporter = { } else { showImportFailedError() } + + isPostmanImporterInProgress.value = false }, + isLoading: isPostmanImporterInProgress, }), } @@ -326,10 +358,12 @@ const HoppInsomniaImporter: ImporterOrExporter = { caption: "import.from_file", acceptedFileTypes: ".json", onImportFromFile: async (content) => { + isInsomniaImporterInProgress.value = true + const res = await hoppInsomniaImporter(content)() if (E.isRight(res)) { - handleImportToStore(res.right) + await handleImportToStore(res.right) platform.analytics?.logEvent({ platform: "rest", @@ -340,7 +374,10 @@ const HoppInsomniaImporter: ImporterOrExporter = { } else { showImportFailedError() } + + isInsomniaImporterInProgress.value = false }, + isLoading: isInsomniaImporterInProgress, }), } @@ -361,10 +398,12 @@ const HoppGistImporter: ImporterOrExporter = { return } + isGistImporterInProgress.value = true + const res = await hoppRESTImporter(content.right)() if (E.isRight(res)) { - handleImportToStore(res.right) + await handleImportToStore(res.right) platform.analytics?.logEvent({ platform: "rest", @@ -375,7 +414,10 @@ const HoppGistImporter: ImporterOrExporter = { } else { showImportFailedError() } + + isGistImporterInProgress.value = false }, + isLoading: isGistImporterInProgress, }), } @@ -528,22 +570,26 @@ const HARImporter: ImporterOrExporter = { caption: "import.from_file", acceptedFileTypes: ".har", onImportFromFile: async (content) => { + isHarImporterInProgress.value = true + const res = await harImporter(content) - if (E.isLeft(res)) { + if (E.isRight(res)) { + await handleImportToStore(res.right) + + platform.analytics?.logEvent({ + type: "HOPP_IMPORT_COLLECTION", + importer: "import.from_har", + platform: "rest", + workspaceType: isTeamWorkspace.value ? "team" : "personal", + }) + } else { showImportFailedError() - return } - handleImportToStore(res.right) - - platform.analytics?.logEvent({ - type: "HOPP_IMPORT_COLLECTION", - importer: "import.from_har", - platform: "rest", - workspaceType: isTeamWorkspace.value ? "team" : "personal", - }) + isHarImporterInProgress.value = false }, + isLoading: isHarImporterInProgress, }), } diff --git a/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue b/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue index a9716c992..b0759eabe 100644 --- a/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/collections/graphql/ImportExport.vue @@ -231,7 +231,7 @@ const showImportFailedError = () => { toast.error(t("import.failed")) } -const handleImportToStore = async (gqlCollections: HoppCollection[]) => { +const handleImportToStore = (gqlCollections: HoppCollection[]) => { appendGraphqlCollections(gqlCollections) toast.success(t("state.file_imported")) } diff --git a/packages/hoppscotch-common/src/components/environments/ImportExport.vue b/packages/hoppscotch-common/src/components/environments/ImportExport.vue index 6d7c0a6d5..0f11f6580 100644 --- a/packages/hoppscotch-common/src/components/environments/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/environments/ImportExport.vue @@ -60,6 +60,11 @@ const currentUser = useReadonlyStream( platform.auth.getCurrentUser() ) +const isPostmanImporterInProgress = ref(false) +const isInsomniaImporterInProgress = ref(false) +const isRESTImporterInProgress = ref(false) +const isGistImporterInProgress = ref(false) + const isEnvironmentGistExportInProgress = ref(false) const isTeamEnvironment = computed(() => { @@ -91,23 +96,27 @@ const HoppEnvironmentsImport: ImporterOrExporter = { acceptedFileTypes: "application/json", caption: "import.hoppscotch_environment_description", onImportFromFile: async (environments) => { + isRESTImporterInProgress.value = true + const res = await hoppEnvImporter(environments)() - if (E.isLeft(res)) { + if (E.isRight(res)) { + await handleImportToStore(res.right) + + platform.analytics?.logEvent({ + type: "HOPP_IMPORT_ENVIRONMENT", + platform: "rest", + workspaceType: isTeamEnvironment.value ? "team" : "personal", + }) + + emit("hide-modal") + } else { showImportFailedError() - return } - handleImportToStore(res.right) - - platform.analytics?.logEvent({ - type: "HOPP_IMPORT_ENVIRONMENT", - platform: "rest", - workspaceType: workspaceType.value, - }) - - emit("hide-modal") + isRESTImporterInProgress.value = false }, + isLoading: isRESTImporterInProgress, }), } @@ -124,23 +133,27 @@ const PostmanEnvironmentsImport: ImporterOrExporter = { acceptedFileTypes: "application/json", caption: "import.postman_environment_description", onImportFromFile: async (environments) => { + isPostmanImporterInProgress.value = true + const res = await postmanEnvImporter(environments)() - if (E.isLeft(res)) { + if (E.isRight(res)) { + await handleImportToStore(res.right) + + platform.analytics?.logEvent({ + type: "HOPP_IMPORT_ENVIRONMENT", + platform: "rest", + workspaceType: isTeamEnvironment.value ? "team" : "personal", + }) + + emit("hide-modal") + } else { showImportFailedError() - return } - handleImportToStore(res.right) - - platform.analytics?.logEvent({ - type: "HOPP_IMPORT_ENVIRONMENT", - platform: "rest", - workspaceType: workspaceType.value, - }) - - emit("hide-modal") + isPostmanImporterInProgress.value = false }, + isLoading: isPostmanImporterInProgress, }), } @@ -157,30 +170,34 @@ const insomniaEnvironmentsImport: ImporterOrExporter = { acceptedFileTypes: "application/json", caption: "import.insomnia_environment_description", onImportFromFile: async (environments) => { + isInsomniaImporterInProgress.value = true + const res = await insomniaEnvImporter(environments)() - if (E.isLeft(res)) { + if (E.isRight(res)) { + const globalEnvs = res.right.filter( + (env) => env.name === "Base Environment" + ) + const otherEnvs = res.right.filter( + (env) => env.name !== "Base Environment" + ) + + await handleImportToStore(otherEnvs, globalEnvs) + + platform.analytics?.logEvent({ + type: "HOPP_IMPORT_ENVIRONMENT", + platform: "rest", + workspaceType: isTeamEnvironment.value ? "team" : "personal", + }) + + emit("hide-modal") + } else { showImportFailedError() - return } - const globalEnvs = res.right.filter( - (env) => env.name === "Base Environment" - ) - const otherEnvs = res.right.filter( - (env) => env.name !== "Base Environment" - ) - - handleImportToStore(otherEnvs, globalEnvs) - - platform.analytics?.logEvent({ - type: "HOPP_IMPORT_ENVIRONMENT", - platform: "rest", - workspaceType: workspaceType.value, - }) - - emit("hide-modal") + isInsomniaImporterInProgress.value = false }, + isLoading: isInsomniaImporterInProgress, }), } @@ -201,21 +218,26 @@ const EnvironmentsImportFromGIST: ImporterOrExporter = { return } + isGistImporterInProgress.value = true + const res = await hoppEnvImporter(environments.right)() - if (E.isLeft(res)) { + if (E.isRight(res)) { + await handleImportToStore(res.right) + + platform.analytics?.logEvent({ + type: "HOPP_IMPORT_ENVIRONMENT", + platform: "rest", + workspaceType: isTeamEnvironment.value ? "team" : "personal", + }) + emit("hide-modal") + } else { showImportFailedError() - return } - handleImportToStore(res.right) - platform.analytics?.logEvent({ - type: "HOPP_IMPORT_ENVIRONMENT", - platform: "rest", - workspaceType: workspaceType.value, - }) - emit("hide-modal") + isGistImporterInProgress.value = false }, + isLoading: isGistImporterInProgress, }), } diff --git a/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/FileImport.vue b/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/FileImport.vue index 4750b1a42..ce83fa8b9 100644 --- a/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/FileImport.vue +++ b/packages/hoppscotch-common/src/components/importExport/ImportExportSteps/FileImport.vue @@ -45,9 +45,10 @@

@@ -55,14 +56,20 @@ diff --git a/packages/hoppscotch-common/src/components/environments/Selector.vue b/packages/hoppscotch-common/src/components/environments/Selector.vue index 1f859bc08..d0e511cd1 100644 --- a/packages/hoppscotch-common/src/components/environments/Selector.vue +++ b/packages/hoppscotch-common/src/components/environments/Selector.vue @@ -147,7 +147,7 @@ class="flex flex-col items-center py-4" > - {{ getErrorMessage(teamAdapterError) }} + {{ t(getEnvActionErrorMessage(teamAdapterError)) }} @@ -304,10 +304,14 @@ import { TippyComponent } from "vue-tippy" import { useI18n } from "~/composables/i18n" import { useReadonlyStream, useStream } from "~/composables/stream" import { invokeAction } from "~/helpers/actions" -import { GQLError } from "~/helpers/backend/GQLClient" import { GetMyTeamsQuery } from "~/helpers/backend/graphql" +import { getEnvActionErrorMessage } from "~/helpers/error-messages" import { TeamEnvironment } from "~/helpers/teams/TeamEnvironment" import TeamEnvironmentAdapter from "~/helpers/teams/TeamEnvironmentAdapter" +import { + sortPersonalEnvironmentsAlphabetically, + sortTeamEnvironmentsAlphabetically, +} from "~/helpers/utils/sortEnvironmentsAlphabetically" import { environments$, globalEnv$, @@ -316,10 +320,6 @@ import { } from "~/newstore/environments" import { useLocalState } from "~/newstore/localstate" import { WorkspaceService } from "~/services/workspace.service" -import { - sortPersonalEnvironmentsAlphabetically, - sortTeamEnvironmentsAlphabetically, -} from "~/helpers/utils/sortEnvironmentsAlphabetically" import IconCheck from "~icons/lucide/check" import IconEdit from "~icons/lucide/edit" import IconEye from "~icons/lucide/eye" @@ -590,18 +590,6 @@ onMounted(() => { const envSelectorActions = ref(null) const envQuickPeekActions = ref(null) -const getErrorMessage = (err: GQLError) => { - if (err.type === "network_error") { - return t("error.network_error") - } - switch (err.error) { - case "team_environment/not_found": - return t("team_environment.not_found") - default: - return t("error.something_went_wrong") - } -} - const globalEnvs = useReadonlyStream(globalEnv$, {} as GlobalEnvironment) const environmentVariables = computed(() => { diff --git a/packages/hoppscotch-common/src/components/environments/index.vue b/packages/hoppscotch-common/src/components/environments/index.vue index 431bbafce..3ff8d2f5a 100644 --- a/packages/hoppscotch-common/src/components/environments/index.vue +++ b/packages/hoppscotch-common/src/components/environments/index.vue @@ -7,8 +7,12 @@ @@ -52,16 +56,22 @@ import { Environment, GlobalEnvironment } from "@hoppscotch/data" import { useService } from "dioc/vue" import * as TE from "fp-ts/TaskEither" import { pipe } from "fp-ts/function" -import { isEqual } from "lodash-es" +import { cloneDeep, isEqual } from "lodash-es" import { computed, ref, watch } from "vue" import { useI18n } from "~/composables/i18n" import { useToast } from "~/composables/toast" import { defineActionHandler } from "~/helpers/actions" import { GQLError } from "~/helpers/backend/GQLClient" -import { deleteTeamEnvironment } from "~/helpers/backend/mutations/TeamEnvironment" +import { + createTeamEnvironment, + deleteTeamEnvironment, +} from "~/helpers/backend/mutations/TeamEnvironment" +import { getEnvActionErrorMessage } from "~/helpers/error-messages" import TeamEnvironmentAdapter from "~/helpers/teams/TeamEnvironmentAdapter" import { + createEnvironment, deleteEnvironment, + getGlobalVariables, getSelectedEnvironmentIndex, globalEnv$, selectedEnvironmentIndex$, @@ -88,7 +98,7 @@ const environmentType = ref({ const globalEnv = useReadonlyStream(globalEnv$, {} as GlobalEnvironment) -const globalEnvironment = computed(() => ({ +const globalEnvironment = computed(() => ({ v: 1 as const, id: "Global", name: "Global", @@ -189,6 +199,7 @@ const editingEnvironmentIndex = ref<"Global" | null>(null) const editingVariableName = ref("") const editingVariableValue = ref("") const secretOptionSelected = ref(false) +const duplicateGlobalEnvironmentLoading = ref(false) const position = ref({ top: 0, left: 0 }) @@ -210,6 +221,41 @@ const editEnvironment = (environmentIndex: "Global") => { displayModalEdit(true) } +const duplicateGlobalEnvironment = async () => { + if (workspace.value.type === "team") { + duplicateGlobalEnvironmentLoading.value = true + + await pipe( + createTeamEnvironment( + JSON.stringify(globalEnvironment.value.variables), + workspace.value.teamID, + `Global - ${t("action.duplicate")}` + ), + TE.match( + (err: GQLError) => { + console.error(err) + + toast.error(t(getEnvActionErrorMessage(err))) + }, + () => { + toast.success(t("environment.duplicated")) + } + ) + )() + + duplicateGlobalEnvironmentLoading.value = false + + return + } + + createEnvironment( + `Global - ${t("action.duplicate")}`, + cloneDeep(getGlobalVariables()) + ) + + toast.success(`${t("environment.duplicated")}`) +} + const removeSelectedEnvironment = () => { const selectedEnvIndex = getSelectedEnvironmentIndex() if (selectedEnvIndex?.type === "NO_ENV_SELECTED") return diff --git a/packages/hoppscotch-common/src/components/environments/my/Environment.vue b/packages/hoppscotch-common/src/components/environments/my/Environment.vue index 5464117d3..f220bf87c 100644 --- a/packages/hoppscotch-common/src/components/environments/my/Environment.vue +++ b/packages/hoppscotch-common/src/components/environments/my/Environment.vue @@ -45,7 +45,7 @@ tabindex="0" role="menu" @keyup.e="edit!.$el.click()" - @keyup.d="showDuplicateAction ? duplicate!.$el.click() : null" + @keyup.d="duplicate!.$el.click()" @keyup.j="exportAsJsonEl!.$el.click()" @keyup.delete=" !(environmentIndex === 'Global') @@ -59,6 +59,7 @@ :icon="IconEdit" :label="`${t('action.edit')}`" :shortcut="['E']" + :disabled="duplicateGlobalEnvironmentLoading" @click=" () => { emit('edit-environment') @@ -67,15 +68,15 @@ " /> @@ -84,6 +85,7 @@ :icon="IconEdit" :label="`${t('export.as_json')}`" :shortcut="['J']" + :disabled="duplicateGlobalEnvironmentLoading" @click=" () => { exportEnvironmentAsJSON() @@ -97,6 +99,7 @@ :icon="IconTrash2" :label="`${t('action.delete')}`" :shortcut="['⌫']" + :disabled="duplicateGlobalEnvironmentLoading" @click=" () => { confirmRemove = true @@ -123,17 +126,14 @@ import { useToast } from "@composables/toast" import { Environment } from "@hoppscotch/data" import { HoppSmartItem } from "@hoppscotch/ui" import { useService } from "dioc/vue" -import { cloneDeep } from "lodash-es" -import { computed, ref } from "vue" +import { computed, ref, watch } from "vue" import { TippyComponent } from "vue-tippy" import * as E from "fp-ts/Either" import { exportAsJSON } from "~/helpers/import-export/export/environment" import { - createEnvironment, deleteEnvironment, duplicateEnvironment, - getGlobalVariables, } from "~/newstore/environments" import { SecretEnvironmentService } from "~/services/secret-environment.service" import IconCopy from "~icons/lucide/copy" @@ -148,21 +148,33 @@ const props = withDefaults( defineProps<{ environment: Environment environmentIndex: number | "Global" | null - showDuplicateAction: boolean + duplicateGlobalEnvironmentLoading?: boolean + showContextMenuLoadingState?: boolean }>(), { - showDuplicateAction: true, + duplicateGlobalEnvironmentLoading: false, + showContextMenuLoadingState: false, } ) const emit = defineEmits<{ (e: "edit-environment"): void + (e: "duplicate-global-environment"): void }>() const confirmRemove = ref(false) const secretEnvironmentService = useService(SecretEnvironmentService) +watch( + () => props.duplicateGlobalEnvironmentLoading, + (newDuplicateGlobalEnvironmentLoadingVal) => { + if (!newDuplicateGlobalEnvironmentLoadingVal) { + options?.value?.tippy?.hide() + } + } +) + const isGlobalEnvironment = computed(() => props.environmentIndex === "Global") const exportEnvironmentAsJSON = async () => { @@ -191,14 +203,16 @@ const removeEnvironment = () => { } const duplicateEnvironments = () => { - if (props.environmentIndex === null) return - if (isGlobalEnvironment.value) { - createEnvironment( - `Global - ${t("action.duplicate")}`, - cloneDeep(getGlobalVariables()) - ) - } else duplicateEnvironment(props.environmentIndex as number) + if (props.environmentIndex === null) { + return + } + if (isGlobalEnvironment.value) { + emit("duplicate-global-environment") + return + } + + duplicateEnvironment(props.environmentIndex as number) toast.success(`${t("environment.duplicated")}`) } diff --git a/packages/hoppscotch-common/src/components/environments/teams/Details.vue b/packages/hoppscotch-common/src/components/environments/teams/Details.vue index 676408beb..3906dced5 100644 --- a/packages/hoppscotch-common/src/components/environments/teams/Details.vue +++ b/packages/hoppscotch-common/src/components/environments/teams/Details.vue @@ -165,6 +165,7 @@ import IconHelpCircle from "~icons/lucide/help-circle" import { platform } from "~/platform" import { useService } from "dioc/vue" import { SecretEnvironmentService } from "~/services/secret-environment.service" +import { getEnvActionErrorMessage } from "~/helpers/error-messages" type EnvironmentVariable = { id: number @@ -405,7 +406,7 @@ const saveEnvironment = async () => { TE.match( (err: GQLError) => { console.error(err) - toast.error(`${getErrorMessage(err)}`) + toast.error(t(getEnvActionErrorMessage(err))) isLoading.value = false }, (res) => { @@ -453,7 +454,7 @@ const saveEnvironment = async () => { TE.match( (err: GQLError) => { console.error(err) - toast.error(`${getErrorMessage(err)}`) + toast.error(t(getEnvActionErrorMessage(err))) isLoading.value = false }, () => { @@ -474,18 +475,4 @@ const hideModal = () => { selectedEnvOption.value = "variables" emit("hide-modal") } - -const getErrorMessage = (err: GQLError) => { - if (err.type === "network_error") { - return t("error.network_error") - } - switch (err.error) { - case "team_environment/not_found": - return t("team_environment.not_found") - case "team_environment/short_name": - return t("environment.short_name") - default: - return t("error.something_went_wrong") - } -} diff --git a/packages/hoppscotch-common/src/components/environments/teams/Environment.vue b/packages/hoppscotch-common/src/components/environments/teams/Environment.vue index fdc0a683a..a7e74f35c 100644 --- a/packages/hoppscotch-common/src/components/environments/teams/Environment.vue +++ b/packages/hoppscotch-common/src/components/environments/teams/Environment.vue @@ -48,6 +48,7 @@ :icon="IconEdit" :label="`${t('action.edit')}`" :shortcut="['E']" + :disabled="duplicateEnvironmentLoading" @click=" () => { emit('edit-environment') @@ -62,12 +63,8 @@ :icon="IconCopy" :label="`${t('action.duplicate')}`" :shortcut="['D']" - @click=" - () => { - duplicateEnvironments() - hide() - } - " + :loading="duplicateEnvironmentLoading" + @click="duplicateEnvironment" /> () const exportAsJsonEl = ref() const propertiesAction = ref() +const duplicateEnvironmentLoading = ref(false) + const removeEnvironment = () => { pipe( deleteTeamEnvironment(props.environment.id), TE.match( (err: GQLError) => { console.error(err) - toast.error(`${getErrorMessage(err)}`) + toast.error(t(getEnvActionErrorMessage(err))) }, () => { toast.success(`${t("team_environment.deleted")}`) @@ -193,32 +196,24 @@ const removeEnvironment = () => { )() } -const duplicateEnvironments = () => { - pipe( - duplicateEnvironment(props.environment.id), +const duplicateEnvironment = async () => { + duplicateEnvironmentLoading.value = true + + await pipe( + duplicateTeamEnvironment(props.environment.id), TE.match( (err: GQLError) => { console.error(err) - toast.error(`${getErrorMessage(err)}`) + toast.error(t(getEnvActionErrorMessage(err))) }, () => { toast.success(`${t("environment.duplicated")}`) } ) )() -} -const getErrorMessage = (err: GQLError) => { - if (err.type === "network_error") { - return t("error.network_error") - } - switch (err.error) { - case "team_environment/not_found": - return t("team_environment.not_found") - case "team_environment/short_name": - return t("environment.short_name") - default: - return t("error.something_went_wrong") - } + duplicateEnvironmentLoading.value = false + + options.value!.tippy?.hide() } diff --git a/packages/hoppscotch-common/src/components/environments/teams/index.vue b/packages/hoppscotch-common/src/components/environments/teams/index.vue index 6b6e44fcc..a69482bb2 100644 --- a/packages/hoppscotch-common/src/components/environments/teams/index.vue +++ b/packages/hoppscotch-common/src/components/environments/teams/index.vue @@ -104,7 +104,7 @@ class="flex flex-col items-center py-4" > - {{ getErrorMessage(adapterError) }} + {{ t(getEnvActionErrorMessage(adapterError)) }} { secretOptionSelected.value = false } -const getErrorMessage = (err: GQLError) => { - if (err.type === "network_error") { - return t("error.network_error") - } - switch (err.error) { - case "team_environment/not_found": - return t("team_environment.not_found") - default: - return t("error.something_went_wrong") - } -} - const showEnvironmentProperties = (environmentID: string) => { showEnvironmentsPropertiesModal.value = true selectedEnvironmentID.value = environmentID diff --git a/packages/hoppscotch-common/src/helpers/error-messages/index.ts b/packages/hoppscotch-common/src/helpers/error-messages/index.ts new file mode 100644 index 000000000..76382204e --- /dev/null +++ b/packages/hoppscotch-common/src/helpers/error-messages/index.ts @@ -0,0 +1,18 @@ +import { GQLError } from "../backend/GQLClient" + +export const getEnvActionErrorMessage = (err: GQLError) => { + if (err.type === "network_error") { + return "error.network_error" + } + + switch (err.error) { + case "team_environment/not_found": + return "team_environment.not_found" + case "team_environment/short_name": + return "environment.short_name" + case "Forbidden resource": + return "profile.no_permission" + default: + return "error.something_went_wrong" + } +} From 062b0fdda07ffa162b1017ca5135c5d8ea8b9b51 Mon Sep 17 00:00:00 2001 From: Balu Babu Date: Thu, 26 Sep 2024 22:54:44 +0530 Subject: [PATCH 063/159] chore: addition of new GQL subscription for `UserCollection` duplication (#4358) Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com> --- .../src/pubsub/topicsDefs.ts | 2 + .../user-collection.resolver.ts | 11 +++ .../user-collection.service.ts | 80 ++++++++++++++++++- .../user-collection/user-collections.model.ts | 51 ++++++++++++ 4 files changed, 141 insertions(+), 3 deletions(-) diff --git a/packages/hoppscotch-backend/src/pubsub/topicsDefs.ts b/packages/hoppscotch-backend/src/pubsub/topicsDefs.ts index 49506c67e..b36171221 100644 --- a/packages/hoppscotch-backend/src/pubsub/topicsDefs.ts +++ b/packages/hoppscotch-backend/src/pubsub/topicsDefs.ts @@ -23,6 +23,7 @@ import { TeamInvitation } from 'src/team-invitation/team-invitation.model'; import { InvitedUser } from '../admin/invited-user.model'; import { UserCollection, + UserCollectionDuplicatedData, UserCollectionRemovedData, UserCollectionReorderData, } from 'src/user-collection/user-collections.model'; @@ -48,6 +49,7 @@ export type TopicDef = { [ topic: `user_coll/${string}/${'created' | 'updated' | 'moved'}` ]: UserCollection; + [topic: `user_coll/${string}/${'duplicated'}`]: UserCollectionDuplicatedData; [topic: `user_coll/${string}/${'deleted'}`]: UserCollectionRemovedData; [topic: `user_coll/${string}/${'order_updated'}`]: UserCollectionReorderData; [topic: `team/${string}/member_removed`]: string; diff --git a/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts b/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts index 8bc2f22e5..b5f3d2820 100644 --- a/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts +++ b/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts @@ -16,6 +16,7 @@ import { AuthUser } from 'src/types/AuthUser'; import { UserCollectionService } from './user-collection.service'; import { UserCollection, + UserCollectionDuplicatedData, UserCollectionExportJSONData, UserCollectionRemovedData, UserCollectionReorderData, @@ -470,4 +471,14 @@ export class UserCollectionResolver { userCollectionOrderUpdated(@GqlUser() user: AuthUser) { return this.pubSub.asyncIterator(`user_coll/${user.uid}/order_updated`); } + + @Subscription(() => UserCollectionDuplicatedData, { + description: 'Listen to when a User Collection has been duplicated', + resolve: (value) => value, + }) + @SkipThrottle() + @UseGuards(GqlAuthGuard) + userCollectionDuplicated(@GqlUser() user: AuthUser) { + return this.pubSub.asyncIterator(`user_coll/${user.uid}/duplicated`); + } } diff --git a/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts b/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts index 69358854c..0eeaee52f 100644 --- a/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts +++ b/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts @@ -23,6 +23,7 @@ import { Prisma, UserCollection, ReqType as DBReqType } from '@prisma/client'; import { UserCollection as UserCollectionModel, UserCollectionExportJSONData, + UserCollectionDuplicatedData, } from './user-collections.model'; import { ReqType } from 'src/types/RequestTypes'; import { @@ -1035,6 +1036,7 @@ export class UserCollectionService { userID: string, destCollectionID: string | null, reqType: DBReqType, + isCollectionDuplication = false, ) { // Check to see if jsonString is valid const collectionsList = stringToJson(jsonString); @@ -1087,9 +1089,24 @@ export class UserCollectionService { ), ); - userCollections.forEach((collection) => - this.pubsub.publish(`user_coll/${userID}/created`, this.cast(collection)), - ); + if (isCollectionDuplication) { + const collectionData = await this.fetchCollectionData( + userCollections[0].id, + ); + if (E.isRight(collectionData)) { + this.pubsub.publish( + `user_coll/${userID}/duplicated`, + collectionData.right, + ); + } + } else { + userCollections.forEach((collection) => + this.pubsub.publish( + `user_coll/${userID}/created`, + this.cast(collection), + ), + ); + } return E.right(true); } @@ -1182,9 +1199,66 @@ export class UserCollectionService { userID, collection.right.parentID, reqType, + true, ); if (E.isLeft(result)) return E.left(result.left as string); return E.right(true); } + + /** + * Generates a JSON containing all the contents of a collection + * + * @param collection Collection whose details we want to fetch + * @returns A JSON string containing all the contents of a collection + */ + private async fetchCollectionData( + collectionID: string, + ): Promise | E.Right> { + const collection = await this.getUserCollection(collectionID); + if (E.isLeft(collection)) return E.left(collection.left); + + const { id, title, data, type, parentID, userUid } = collection.right; + const orderIndex = 'asc'; + + const [childCollections, requests] = await Promise.all([ + this.prisma.userCollection.findMany({ + where: { parentID: id }, + orderBy: { orderIndex }, + }), + this.prisma.userRequest.findMany({ + where: { collectionID: id }, + orderBy: { orderIndex }, + }), + ]); + + const childCollectionDataList = await Promise.all( + childCollections.map(({ id }) => this.fetchCollectionData(id)), + ); + + const failedChildData = childCollectionDataList.find(E.isLeft); + if (failedChildData) return E.left(failedChildData.left); + + const childCollectionsJSONStr = JSON.stringify( + (childCollectionDataList as E.Right[]).map( + (childCollection) => childCollection.right, + ), + ); + + const transformedRequests = requests.map((requestObj) => ({ + ...requestObj, + request: JSON.stringify(requestObj.request), + })); + + return E.right({ + id, + title, + data, + type, + parentID, + userID: userUid, + childCollections: childCollectionsJSONStr, + requests: transformedRequests, + }); + } } diff --git a/packages/hoppscotch-backend/src/user-collection/user-collections.model.ts b/packages/hoppscotch-backend/src/user-collection/user-collections.model.ts index 89c26861c..d0f7717fc 100644 --- a/packages/hoppscotch-backend/src/user-collection/user-collections.model.ts +++ b/packages/hoppscotch-backend/src/user-collection/user-collections.model.ts @@ -1,5 +1,7 @@ import { ObjectType, Field, ID, registerEnumType } from '@nestjs/graphql'; +import { User } from '@prisma/client'; import { ReqType } from 'src/types/RequestTypes'; +import { UserRequest } from 'src/user-request/user-request.model'; @ObjectType() export class UserCollection { @@ -73,3 +75,52 @@ export class UserCollectionExportJSONData { }) collectionType: ReqType; } + +@ObjectType() +export class UserCollectionDuplicatedData { + @Field(() => ID, { + description: 'ID of the user collection', + }) + id: string; + + @Field({ + description: 'Displayed title of the user collection', + }) + title: string; + + @Field({ + description: 'JSON string representing the collection data', + nullable: true, + }) + data: string; + + @Field(() => ReqType, { + description: 'Type of the user collection', + }) + type: ReqType; + + @Field({ + description: 'Parent ID of the duplicated User Collection', + nullable: true, + }) + parentID: string | null; + + @Field({ + description: 'User ID of the duplicated User Collection', + }) + userID: string; + + @Field({ + description: 'Child collections of the duplicated User Collection', + }) + childCollections: string; + + @Field(() => [UserRequest], { + description: 'Requests of the duplicated User Collection', + }) + requests: UserRequest[]; +} + +registerEnumType(ReqType, { + name: 'CollType', +}); From 421e6b76c9388049aa81a74390d31fbbfe90ac35 Mon Sep 17 00:00:00 2001 From: Anwarul Islam Date: Fri, 27 Sep 2024 17:17:55 +0600 Subject: [PATCH 064/159] feat: add generate data schema option in spotlight searcher (#4356) --- .../services/spotlight/searchers/response.searcher.ts | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/hoppscotch-common/src/services/spotlight/searchers/response.searcher.ts b/packages/hoppscotch-common/src/services/spotlight/searchers/response.searcher.ts index 40832e563..88b918681 100644 --- a/packages/hoppscotch-common/src/services/spotlight/searchers/response.searcher.ts +++ b/packages/hoppscotch-common/src/services/spotlight/searchers/response.searcher.ts @@ -9,6 +9,7 @@ import { import IconDownload from "~icons/lucide/download" import IconCopy from "~icons/lucide/copy" +import IconNetwork from "~icons/lucide/network" import { Container } from "dioc" type Doc = { @@ -40,6 +41,8 @@ export class ResponseSpotlightSearcherService extends StaticSpotlightSearcherSer "response.file.download" ) + private dataSchemaActionEnabled = isActionBound("response.schema.toggle") + private documents: Record = reactive({ copy_response: { text: this.t("spotlight.response.copy"), @@ -55,6 +58,12 @@ export class ResponseSpotlightSearcherService extends StaticSpotlightSearcherSer () => !this.downloadResponseActionEnabled.value ), }, + generate_data_schema: { + text: this.t("response.generate_data_schema"), + alternates: ["generate", "data", "schema", "typescript", "response"], + icon: markRaw(IconNetwork), + excludeFromSearch: computed(() => !this.dataSchemaActionEnabled.value), + }, }) // TODO: Constructors are no longer recommended as of dioc > 3, move to onServiceInit @@ -87,5 +96,6 @@ export class ResponseSpotlightSearcherService extends StaticSpotlightSearcherSer public onDocSelected(id: string): void { if (id === "copy_response") invokeAction(`response.copy`) if (id === "download_response") invokeAction(`response.file.download`) + if (id === "generate_data_schema") invokeAction(`response.schema.toggle`) } } From fc37196354d93195e86ce35186136bce5d2572c1 Mon Sep 17 00:00:00 2001 From: Balu Babu Date: Fri, 27 Sep 2024 16:55:47 +0530 Subject: [PATCH 065/159] chore: export single User/Team Collection (#4359) * chore: added query to export single TeamCollection data * chore: added query to export single UserCollection data * chore: fixed typo * chore: completed requested changes in PR review --- .../team-collection.resolver.ts | 30 +++++++++++++++++++ .../team-collection.service.ts | 4 +-- .../user-collection.resolver.ts | 24 +++++++++++++++ .../user-collection.service.ts | 2 +- packages/hoppscotch-backend/src/utils.ts | 11 +++++++ 5 files changed, 68 insertions(+), 3 deletions(-) diff --git a/packages/hoppscotch-backend/src/team-collection/team-collection.resolver.ts b/packages/hoppscotch-backend/src/team-collection/team-collection.resolver.ts index 4c6b00ea6..1fc4c1086 100644 --- a/packages/hoppscotch-backend/src/team-collection/team-collection.resolver.ts +++ b/packages/hoppscotch-backend/src/team-collection/team-collection.resolver.ts @@ -102,6 +102,36 @@ export class TeamCollectionResolver { return jsonString.right; } + @Query(() => String, { + description: + 'Returns a JSON string of all the contents of a Team Collection', + }) + @UseGuards(GqlAuthGuard, GqlTeamMemberGuard) + @RequiresTeamRole( + TeamMemberRole.VIEWER, + TeamMemberRole.EDITOR, + TeamMemberRole.OWNER, + ) + async exportCollectionToJSON( + @Args({ name: 'teamID', description: 'ID of the team', type: () => ID }) + teamID: string, + @Args({ + name: 'collectionID', + description: 'ID of the collection', + type: () => ID, + }) + collectionID: string, + ) { + const collectionData = + await this.teamCollectionService.exportCollectionToJSONObject( + teamID, + collectionID, + ); + + if (E.isLeft(collectionData)) throwErr(collectionData.left as string); + return JSON.stringify(collectionData.right); + } + @Query(() => [TeamCollection], { description: 'Returns the collections of a team', }) diff --git a/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts b/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts index 093c25393..6779e64aa 100644 --- a/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts +++ b/packages/hoppscotch-backend/src/team-collection/team-collection.service.ts @@ -103,10 +103,10 @@ export class TeamCollectionService { * @param collectionID The Collection ID * @returns A JSON string containing all the contents of a collection */ - private async exportCollectionToJSONObject( + async exportCollectionToJSONObject( teamID: string, collectionID: string, - ) { + ): Promise | E.Left> { const collection = await this.getCollection(collectionID); if (E.isLeft(collection)) return E.left(TEAM_INVALID_COLL_ID); diff --git a/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts b/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts index b5f3d2820..df530e3d7 100644 --- a/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts +++ b/packages/hoppscotch-backend/src/user-collection/user-collection.resolver.ts @@ -186,6 +186,30 @@ export class UserCollectionResolver { return jsonString.right; } + @Query(() => String, { + description: + 'Returns a JSON string of all the contents of a User Collection', + }) + @UseGuards(GqlAuthGuard) + async exportUserCollectionToJSON( + @GqlUser() user: AuthUser, + @Args({ + type: () => ID, + name: 'collectionID', + description: 'ID of the user collection', + }) + collectionID: string, + ) { + const jsonString = + await this.userCollectionService.exportUserCollectionToJSONObject( + user.uid, + collectionID, + ); + + if (E.isLeft(jsonString)) throwErr(jsonString.left as string); + return JSON.stringify(jsonString.right); + } + // Mutations @Mutation(() => UserCollection, { description: 'Creates root REST user collection(no parent user collection)', diff --git a/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts b/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts index 0eeaee52f..4366caf43 100644 --- a/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts +++ b/packages/hoppscotch-backend/src/user-collection/user-collection.service.ts @@ -836,7 +836,7 @@ export class UserCollectionService { * @param collectionID The Collection ID * @returns A JSON string containing all the contents of a collection */ - private async exportUserCollectionToJSONObject( + async exportUserCollectionToJSONObject( userUID: string, collectionID: string, ): Promise | E.Right> { diff --git a/packages/hoppscotch-backend/src/utils.ts b/packages/hoppscotch-backend/src/utils.ts index 820976cf9..23afc3fa3 100644 --- a/packages/hoppscotch-backend/src/utils.ts +++ b/packages/hoppscotch-backend/src/utils.ts @@ -116,6 +116,17 @@ export const getGqlArg = ( ); /** + * To the daring adventurer who has stumbled upon this relic of code... welcome. + * Many have gazed upon its depths, yet few have returned with answers. + * I could have deleted it, but that felt... too easy, too final. + * + * If you're still reading, perhaps you're the one destined to unravel its secrets. + * Or, maybe you're like me—content to let it linger, a puzzle for the ages. + * The choice is yours, but beware... once you start, there is no turning back. + * + * PLEASE, NO ONE KNOWS HOW THIS WORKS... + * -- Balu, whispering from the great beyond... probably still trying to understand this damn thing. + * * Sequences an array of TaskEither values while maintaining an array of all the error values * @param arr Array of TaskEithers * @returns A TaskEither saying all the errors possible on the left or all the success values on the right From db8cf229acf56abf56b6221c5f805f2a820f45de Mon Sep 17 00:00:00 2001 From: Akash K <57758277+amk-dev@users.noreply.github.com> Date: Fri, 27 Sep 2024 17:20:26 +0530 Subject: [PATCH 066/159] chore: make client secret optional across grant types (#4363) Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com> --- .../__tests__/unit/workspace-access.spec.ts | 31 +++++++- .../components/http/authorization/OAuth2.vue | 16 +++- .../services/oauth/flows/clientCredentials.ts | 6 +- .../src/services/oauth/flows/password.ts | 6 +- .../persistence/__tests__/__mocks__/index.ts | 10 +-- .../hoppscotch-data/src/collection/index.ts | 6 +- .../hoppscotch-data/src/collection/v/3.ts | 2 +- .../hoppscotch-data/src/collection/v/4.ts | 37 +++++++++ packages/hoppscotch-data/src/graphql/index.ts | 9 ++- packages/hoppscotch-data/src/graphql/v/3.ts | 4 +- packages/hoppscotch-data/src/graphql/v/4.ts | 4 +- packages/hoppscotch-data/src/graphql/v/6.ts | 2 +- packages/hoppscotch-data/src/graphql/v/7.ts | 49 ++++++++++++ packages/hoppscotch-data/src/rest/index.ts | 29 ++++--- packages/hoppscotch-data/src/rest/v/8.ts | 79 +++++++++++++++++++ .../collections/collections.platform.ts | 8 +- 16 files changed, 256 insertions(+), 42 deletions(-) create mode 100644 packages/hoppscotch-data/src/collection/v/4.ts create mode 100644 packages/hoppscotch-data/src/graphql/v/7.ts create mode 100644 packages/hoppscotch-data/src/rest/v/8.ts diff --git a/packages/hoppscotch-cli/src/__tests__/unit/workspace-access.spec.ts b/packages/hoppscotch-cli/src/__tests__/unit/workspace-access.spec.ts index 3677b6747..da38e914b 100644 --- a/packages/hoppscotch-cli/src/__tests__/unit/workspace-access.spec.ts +++ b/packages/hoppscotch-cli/src/__tests__/unit/workspace-access.spec.ts @@ -1,4 +1,7 @@ +import { HoppCollection } from "@hoppscotch/data"; +import { entityReference } from "verzod"; import { describe, expect, test } from "vitest"; +import { z } from "zod"; import { transformWorkspaceCollections, @@ -16,6 +19,26 @@ import { import TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK from "../e2e/fixtures/collections/multiple-child-collections-auth-headers-coll.json"; +// Helper function to validate against `HoppCollection` schema and apply relevant migrations +const migrateCollections = (collections: unknown[]): HoppCollection[] => { + const collectionSchemaParsedResult = z + .array(entityReference(HoppCollection)) + .safeParse(collections); + + if (!collectionSchemaParsedResult.success) { + throw new Error( + `Incoming collections failed schema validation: ${JSON.stringify(collections, null, 2)}` + ); + } + + return collectionSchemaParsedResult.data.map((collection) => { + return { + ...collection, + folders: migrateCollections(collection.folders), + }; + }); +}; + describe("workspace-access", () => { describe("transformWorkspaceCollection", () => { test("Successfully transforms collection data with deeply nested collections and authorization/headers set at each level to the `HoppCollection` format", () => { @@ -27,13 +50,15 @@ describe("workspace-access", () => { }); test("Successfully transforms collection data with multiple child collections and authorization/headers set at each level to the `HoppCollection` format", () => { + const migratedCollections = migrateCollections([ + TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK, + ]); + expect( transformWorkspaceCollections( WORKSPACE_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK ) - ).toEqual([ - TRANSFORMED_MULTIPLE_CHILD_COLLECTIONS_WITH_AUTH_HEADERS_MOCK, - ]); + ).toEqual(migratedCollections); }); test("Adds the default value for `auth` & `header` fields while transforming collections without authorization/headers set at certain levels", () => { diff --git a/packages/hoppscotch-common/src/components/http/authorization/OAuth2.vue b/packages/hoppscotch-common/src/components/http/authorization/OAuth2.vue index 48a76d6bf..3cf92591a 100644 --- a/packages/hoppscotch-common/src/components/http/authorization/OAuth2.vue +++ b/packages/hoppscotch-common/src/components/http/authorization/OAuth2.vue @@ -401,7 +401,7 @@ const supportedGrantTypes = [ return E.right(undefined) } - const runAction = () => { + const runAction = async () => { const params: AuthCodeOauthFlowParams = { authEndpoint: authEndpoint.value, tokenEndpoint: tokenEndpoint.value, @@ -420,7 +420,11 @@ const supportedGrantTypes = [ return E.left("VALIDATION_FAILED" as const) } - authCode.init(parsedArgs.data) + const res = await authCode.init(parsedArgs.data) + + if (E.isLeft(res)) { + return res + } return E.right(undefined) } @@ -1047,8 +1051,14 @@ const generateOAuthToken = async () => { VALIDATION_FAILED: t("authorization.oauth.validation_failed"), OAUTH_TOKEN_FETCH_FAILED: t("authorization.oauth.token_fetch_failed"), } + if (res.left in errorMessages) { + // @ts-expect-error - not possible to have a key that doesn't exist + toast.error(errorMessages[res.left]) + return + } + + toast.error(t("error.something_went_wrong")) - toast.error(errorMessages[res.left]) return } } diff --git a/packages/hoppscotch-common/src/services/oauth/flows/clientCredentials.ts b/packages/hoppscotch-common/src/services/oauth/flows/clientCredentials.ts index 9582b8236..034bc3822 100644 --- a/packages/hoppscotch-common/src/services/oauth/flows/clientCredentials.ts +++ b/packages/hoppscotch-common/src/services/oauth/flows/clientCredentials.ts @@ -24,7 +24,6 @@ const ClientCredentialsFlowParamsSchema = ClientCredentialsGrantTypeParams.pick( return ( params.authEndpoint.length >= 1 && params.clientID.length >= 1 && - params.clientSecret.length >= 1 && (!params.scopes || params.scopes.length >= 1) ) }, @@ -56,7 +55,10 @@ const initClientCredentialsOAuthFlow = async ({ const formData = new URLSearchParams() formData.append("grant_type", "client_credentials") formData.append("client_id", clientID) - formData.append("client_secret", clientSecret) + + if (clientSecret) { + formData.append("client_secret", clientSecret) + } if (scopes) { formData.append("scope", scopes) diff --git a/packages/hoppscotch-common/src/services/oauth/flows/password.ts b/packages/hoppscotch-common/src/services/oauth/flows/password.ts index d572b6471..22875bc71 100644 --- a/packages/hoppscotch-common/src/services/oauth/flows/password.ts +++ b/packages/hoppscotch-common/src/services/oauth/flows/password.ts @@ -24,7 +24,6 @@ const PasswordFlowParamsSchema = PasswordGrantTypeParams.pick({ return ( params.authEndpoint.length >= 1 && params.clientID.length >= 1 && - params.clientSecret.length >= 1 && params.username.length >= 1 && params.password.length >= 1 && (!params.scopes || params.scopes.length >= 1) @@ -59,10 +58,13 @@ const initPasswordOauthFlow = async ({ const formData = new URLSearchParams() formData.append("grant_type", "password") formData.append("client_id", clientID) - formData.append("client_secret", clientSecret) formData.append("username", username) formData.append("password", password) + if (clientSecret) { + formData.append("client_secret", clientSecret) + } + if (scopes) { formData.append("scope", scopes) } diff --git a/packages/hoppscotch-common/src/services/persistence/__tests__/__mocks__/index.ts b/packages/hoppscotch-common/src/services/persistence/__tests__/__mocks__/index.ts index a12d80cfb..1e36c791a 100644 --- a/packages/hoppscotch-common/src/services/persistence/__tests__/__mocks__/index.ts +++ b/packages/hoppscotch-common/src/services/persistence/__tests__/__mocks__/index.ts @@ -25,7 +25,7 @@ const DEFAULT_SETTINGS = getDefaultSettings() export const REST_COLLECTIONS_MOCK: HoppCollection[] = [ { - v: 3, + v: 4, name: "Echo", folders: [], requests: [ @@ -50,12 +50,12 @@ export const REST_COLLECTIONS_MOCK: HoppCollection[] = [ export const GQL_COLLECTIONS_MOCK: HoppCollection[] = [ { - v: 3, + v: 4, name: "Echo", folders: [], requests: [ { - v: 6, + v: 7, name: "Echo test", url: "https://echo.hoppscotch.io/graphql", headers: [], @@ -156,7 +156,7 @@ export const GQL_HISTORY_MOCK: GQLHistoryEntry[] = [ { v: 1, request: { - v: 6, + v: 7, name: "Untitled", url: "https://echo.hoppscotch.io/graphql", query: "query Request { url }", @@ -177,7 +177,7 @@ export const GQL_TAB_STATE_MOCK: PersistableTabState = { tabID: "5edbe8d4-65c9-4381-9354-5f1bf05d8ccc", doc: { request: { - v: 6, + v: 7, name: "Untitled", url: "https://echo.hoppscotch.io/graphql", headers: [], diff --git a/packages/hoppscotch-data/src/collection/index.ts b/packages/hoppscotch-data/src/collection/index.ts index 474222409..0dca4cd26 100644 --- a/packages/hoppscotch-data/src/collection/index.ts +++ b/packages/hoppscotch-data/src/collection/index.ts @@ -3,6 +3,7 @@ import { InferredEntity, createVersionedEntity } from "verzod" import V1_VERSION from "./v/1" import V2_VERSION from "./v/2" import V3_VERSION from "./v/3" +import V4_VERSION from "./v/4" import { z } from "zod" import { translateToNewRequest } from "../rest" @@ -13,11 +14,12 @@ const versionedObject = z.object({ }) export const HoppCollection = createVersionedEntity({ - latestVersion: 3, + latestVersion: 4, versionMap: { 1: V1_VERSION, 2: V2_VERSION, 3: V3_VERSION, + 4: V4_VERSION, }, getVersion(data) { const versionCheck = versionedObject.safeParse(data) @@ -33,7 +35,7 @@ export const HoppCollection = createVersionedEntity({ export type HoppCollection = InferredEntity -export const CollectionSchemaVersion = 3 +export const CollectionSchemaVersion = 4 /** * Generates a Collection object. This ignores the version number object diff --git a/packages/hoppscotch-data/src/collection/v/3.ts b/packages/hoppscotch-data/src/collection/v/3.ts index 841dcb516..776abc107 100644 --- a/packages/hoppscotch-data/src/collection/v/3.ts +++ b/packages/hoppscotch-data/src/collection/v/3.ts @@ -12,7 +12,7 @@ import { import { v2_baseCollectionSchema, V2_SCHEMA } from "./2" -const v3_baseCollectionSchema = v2_baseCollectionSchema.extend({ +export const v3_baseCollectionSchema = v2_baseCollectionSchema.extend({ v: z.literal(3), // AWS Signature Authorization type addition diff --git a/packages/hoppscotch-data/src/collection/v/4.ts b/packages/hoppscotch-data/src/collection/v/4.ts new file mode 100644 index 000000000..b66076835 --- /dev/null +++ b/packages/hoppscotch-data/src/collection/v/4.ts @@ -0,0 +1,37 @@ +import { defineVersion } from "verzod" +import { z } from "zod" + +import { HoppGQLAuth } from "../../graphql/v/7" +import { HoppRESTAuth } from "../../rest/v/8" + +import { V3_SCHEMA, v3_baseCollectionSchema } from "./3" + +const v4_baseCollectionSchema = v3_baseCollectionSchema.extend({ + v: z.literal(4), + auth: z.union([HoppRESTAuth, HoppGQLAuth]), +}) + +type Input = z.input & { + folders: Input[] +} + +type Output = z.output & { + folders: Output[] +} + +const V4_SCHEMA: z.ZodType = + v4_baseCollectionSchema.extend({ + folders: z.lazy(() => z.array(V4_SCHEMA)), + }) + +export default defineVersion({ + initial: false, + schema: V4_SCHEMA, + // @ts-expect-error + up(old: z.infer) { + return { + ...old, + v: 4 as const, + } + }, +}) diff --git a/packages/hoppscotch-data/src/graphql/index.ts b/packages/hoppscotch-data/src/graphql/index.ts index 5144712c4..56f2dd647 100644 --- a/packages/hoppscotch-data/src/graphql/index.ts +++ b/packages/hoppscotch-data/src/graphql/index.ts @@ -6,6 +6,7 @@ import V3_VERSION from "./v/3" import V4_VERSION from "./v/4" import V5_VERSION from "./v/5" import V6_VERSION from "./v/6" +import V7_VERSION from "./v/7" export { HoppGQLAuthBasic, @@ -16,16 +17,17 @@ export { export { HoppGQLAuthAPIKey } from "./v/4" -export { GQLHeader, HoppGQLAuth, HoppGQLAuthOAuth2 } from "./v/6" +export { GQLHeader } from "./v/6" +export { HoppGQLAuth, HoppGQLAuthOAuth2 } from "./v/7" -export const GQL_REQ_SCHEMA_VERSION = 6 +export const GQL_REQ_SCHEMA_VERSION = 7 const versionedObject = z.object({ v: z.number(), }) export const HoppGQLRequest = createVersionedEntity({ - latestVersion: 6, + latestVersion: 7, versionMap: { 1: V1_VERSION, 2: V2_VERSION, @@ -33,6 +35,7 @@ export const HoppGQLRequest = createVersionedEntity({ 4: V4_VERSION, 5: V5_VERSION, 6: V6_VERSION, + 7: V7_VERSION, }, getVersion(x) { const result = versionedObject.safeParse(x) diff --git a/packages/hoppscotch-data/src/graphql/v/3.ts b/packages/hoppscotch-data/src/graphql/v/3.ts index 60fb87ecf..d1f9b02b3 100644 --- a/packages/hoppscotch-data/src/graphql/v/3.ts +++ b/packages/hoppscotch-data/src/graphql/v/3.ts @@ -2,7 +2,7 @@ import { z } from "zod" import { defineVersion } from "verzod" -import { HoppRESTAuthOAuth2 } from "../../rest" +import { HoppRESTAuthOAuth2 } from "../../rest/v/3" import { HoppGQLAuthAPIKey, HoppGQLAuthBasic, @@ -12,7 +12,7 @@ import { V2_SCHEMA, } from "./2" -export { HoppRESTAuthOAuth2 as HoppGQLAuthOAuth2 } from "../../rest" +export { HoppRESTAuthOAuth2 as HoppGQLAuthOAuth2 } from "../../rest/v/3" export type HoppGqlAuthOAuth2 = z.infer diff --git a/packages/hoppscotch-data/src/graphql/v/4.ts b/packages/hoppscotch-data/src/graphql/v/4.ts index 71a0933f0..ca62b0105 100644 --- a/packages/hoppscotch-data/src/graphql/v/4.ts +++ b/packages/hoppscotch-data/src/graphql/v/4.ts @@ -2,7 +2,7 @@ import { z } from "zod" import { defineVersion } from "verzod" -import { HoppRESTAuthOAuth2 } from "../../rest" +import { HoppRESTAuthOAuth2 } from "../../rest/v/5" import { HoppGQLAuthAPIKey as HoppGQLAuthAPIKeyOld, HoppGQLAuthBasic, @@ -12,7 +12,7 @@ import { } from "./2" import { V3_SCHEMA } from "./3" -export { HoppRESTAuthOAuth2 as HoppGQLAuthOAuth2 } from "../../rest" +export { HoppRESTAuthOAuth2 as HoppGQLAuthOAuth2 } from "../../rest/v/5" export const HoppGQLAuthAPIKey = HoppGQLAuthAPIKeyOld.extend({ addTo: z.enum(["HEADERS", "QUERY_PARAMS"]).catch("HEADERS"), diff --git a/packages/hoppscotch-data/src/graphql/v/6.ts b/packages/hoppscotch-data/src/graphql/v/6.ts index 66b41e26f..24255eba2 100644 --- a/packages/hoppscotch-data/src/graphql/v/6.ts +++ b/packages/hoppscotch-data/src/graphql/v/6.ts @@ -2,13 +2,13 @@ import { defineVersion } from "verzod" import { z } from "zod" import { HoppRESTAuthAWSSignature } from "./../../rest/v/7" import { - HoppGQLAuthAPIKey, HoppGQLAuthBasic, HoppGQLAuthBearer, HoppGQLAuthInherit, HoppGQLAuthNone, } from "./2" import { HoppGQLAuthOAuth2, V5_SCHEMA } from "./5" +import { HoppGQLAuthAPIKey } from "./4" export { HoppRESTAuthOAuth2 as HoppGQLAuthOAuth2 } from "../../rest/v/7" diff --git a/packages/hoppscotch-data/src/graphql/v/7.ts b/packages/hoppscotch-data/src/graphql/v/7.ts new file mode 100644 index 000000000..2d72008d6 --- /dev/null +++ b/packages/hoppscotch-data/src/graphql/v/7.ts @@ -0,0 +1,49 @@ +import { defineVersion } from "verzod" +import { z } from "zod" + +import { + HoppGQLAuthBasic, + HoppGQLAuthBearer, + HoppGQLAuthInherit, + HoppGQLAuthNone, +} from "./2" +import { HoppGQLAuthAPIKey } from "./4" +import { HoppGQLAuthAWSSignature, V6_SCHEMA } from "./6" +import { HoppRESTAuthOAuth2 } from "./../../rest/v/7" + +export { HoppRESTAuthOAuth2 as HoppGQLAuthOAuth2 } from "../../rest/v/7" + +export const HoppGQLAuth = z + .discriminatedUnion("authType", [ + HoppGQLAuthNone, + HoppGQLAuthInherit, + HoppGQLAuthBasic, + HoppGQLAuthBearer, + HoppRESTAuthOAuth2, + HoppGQLAuthAPIKey, + HoppGQLAuthAWSSignature, + ]) + .and( + z.object({ + authActive: z.boolean(), + }) + ) + +export type HoppGQLAuth = z.infer + +export const V7_SCHEMA = V6_SCHEMA.extend({ + v: z.literal(7), + auth: HoppGQLAuth, +}) + +export default defineVersion({ + schema: V7_SCHEMA, + initial: false, + up(old: z.infer) { + return { + ...old, + v: 7 as const, + // no need to update anything for HoppGQLAuth, because we loosened the previous schema by making `clientSecret` optional + } + }, +}) diff --git a/packages/hoppscotch-data/src/rest/index.ts b/packages/hoppscotch-data/src/rest/index.ts index 0c26cb35a..16b984151 100644 --- a/packages/hoppscotch-data/src/rest/index.ts +++ b/packages/hoppscotch-data/src/rest/index.ts @@ -13,9 +13,8 @@ import V3_VERSION from "./v/3" import V4_VERSION from "./v/4" import V5_VERSION from "./v/5" import V6_VERSION, { HoppRESTReqBody } from "./v/6" -import V7_VERSION, { HoppRESTAuth } from "./v/7" - -import { HoppRESTParams, HoppRESTHeaders } from "./v/7" +import V7_VERSION, { HoppRESTHeaders, HoppRESTParams } from "./v/7" +import V8_VERSION, { HoppRESTAuth } from "./v/8" export * from "./content-types" @@ -27,32 +26,37 @@ export { HoppRESTAuthNone, HoppRESTReqBodyFormData, } from "./v/1" -export { - ClientCredentialsGrantTypeParams, - ImplicitOauthFlowParams, - PasswordGrantTypeParams, -} from "./v/3" export { HoppRESTRequestVariables } from "./v/2" + +export { ImplicitOauthFlowParams } from "./v/3" + export { HoppRESTAuthAPIKey } from "./v/4" export { AuthCodeGrantTypeParams } from "./v/5" + export { HoppRESTReqBody } from "./v/6" + export { - HoppRESTAuth, HoppRESTAuthAWSSignature, - HoppRESTAuthOAuth2, HoppRESTHeaders, HoppRESTParams, } from "./v/7" +export { + ClientCredentialsGrantTypeParams, + HoppRESTAuth, + HoppRESTAuthOAuth2, + PasswordGrantTypeParams, +} from "./v/8" + const versionedObject = z.object({ // v is a stringified number v: z.string().regex(/^\d+$/).transform(Number), }) export const HoppRESTRequest = createVersionedEntity({ - latestVersion: 7, + latestVersion: 8, versionMap: { 0: V0_VERSION, 1: V1_VERSION, @@ -62,6 +66,7 @@ export const HoppRESTRequest = createVersionedEntity({ 5: V5_VERSION, 6: V6_VERSION, 7: V7_VERSION, + 8: V8_VERSION, }, getVersion(data) { // For V1 onwards we have the v string storing the number @@ -103,7 +108,7 @@ const HoppRESTRequestEq = Eq.struct({ ), }) -export const RESTReqSchemaVersion = "7" +export const RESTReqSchemaVersion = "8" export type HoppRESTParam = HoppRESTRequest["params"][number] export type HoppRESTHeader = HoppRESTRequest["headers"][number] diff --git a/packages/hoppscotch-data/src/rest/v/8.ts b/packages/hoppscotch-data/src/rest/v/8.ts new file mode 100644 index 000000000..46fa70689 --- /dev/null +++ b/packages/hoppscotch-data/src/rest/v/8.ts @@ -0,0 +1,79 @@ +import { defineVersion } from "verzod" +import { z } from "zod" + +import { + HoppRESTAuthAPIKey, + HoppRESTAuthBasic, + HoppRESTAuthBearer, + HoppRESTAuthInherit, + HoppRESTAuthNone, +} from "./1" + +import { + ClientCredentialsGrantTypeParams as ClientCredentialsGrantTypeParamsOld, + ImplicitOauthFlowParams, + PasswordGrantTypeParams as PasswordGrantTypeParamsOld, +} from "./3" + +import { + AuthCodeGrantTypeParams, + HoppRESTAuthAWSSignature, + V7_SCHEMA, +} from "./7" + +export const ClientCredentialsGrantTypeParams = + ClientCredentialsGrantTypeParamsOld.extend({ + clientSecret: z.string().optional(), + }) + +export const PasswordGrantTypeParams = PasswordGrantTypeParamsOld.extend({ + clientSecret: z.string().optional(), +}) + +export const HoppRESTAuthOAuth2 = z.object({ + authType: z.literal("oauth-2"), + grantTypeInfo: z.discriminatedUnion("grantType", [ + AuthCodeGrantTypeParams, + ClientCredentialsGrantTypeParams, + PasswordGrantTypeParams, + ImplicitOauthFlowParams, + ]), + addTo: z.enum(["HEADERS", "QUERY_PARAMS"]).catch("HEADERS"), +}) + +export type HoppRESTAuthOAuth2 = z.infer + +export const HoppRESTAuth = z + .discriminatedUnion("authType", [ + HoppRESTAuthNone, + HoppRESTAuthInherit, + HoppRESTAuthBasic, + HoppRESTAuthBearer, + HoppRESTAuthOAuth2, + HoppRESTAuthAPIKey, + HoppRESTAuthAWSSignature, + ]) + .and( + z.object({ + authActive: z.boolean(), + }) + ) + +export type HoppRESTAuth = z.infer + +const V8_SCHEMA = V7_SCHEMA.extend({ + v: z.literal("8"), + auth: HoppRESTAuth, +}) + +export default defineVersion({ + schema: V8_SCHEMA, + initial: false, + up(old: z.infer) { + return { + ...old, + v: "8" as const, + // no need to update anything for HoppRESTAuth, because we loosened the previous schema by making `clientSecret` optional + } + }, +}) diff --git a/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts b/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts index 417d42193..e57a1113e 100644 --- a/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts +++ b/packages/hoppscotch-selfhost-web/src/platform/collections/collections.platform.ts @@ -129,7 +129,7 @@ function exportedCollectionToHoppCollection( return { id: restCollection.id, - v: 3, + v: 4, name: restCollection.name, folders: restCollection.folders.map((folder) => exportedCollectionToHoppCollection(folder, collectionType) @@ -189,7 +189,7 @@ function exportedCollectionToHoppCollection( return { id: gqlCollection.id, - v: 3, + v: 4, name: gqlCollection.name, folders: gqlCollection.folders.map((folder) => exportedCollectionToHoppCollection(folder, collectionType) @@ -377,7 +377,7 @@ function setupUserCollectionCreatedSubscription() { name: res.right.userCollectionCreated.title, folders: [], requests: [], - v: 3, + v: 4, auth: data.auth, headers: addDescriptionField(data.headers), }) @@ -385,7 +385,7 @@ function setupUserCollectionCreatedSubscription() { name: res.right.userCollectionCreated.title, folders: [], requests: [], - v: 3, + v: 4, auth: data.auth, headers: addDescriptionField(data.headers), }) From e4d9f82a75f9f6ed1d107f7eadee85a90d6e4ddd Mon Sep 17 00:00:00 2001 From: Kishan Jadav Date: Mon, 30 Sep 2024 09:47:34 +0100 Subject: [PATCH 067/159] feat: support for predefined variables (#3886) Co-authored-by: Anwarul Islam Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com> --- .../hoppscotch-common/assets/scss/styles.scss | 14 + .../components/environments/my/Details.vue | 4 +- .../src/components/http/Headers.vue | 1 + .../src/components/http/Parameters.vue | 1 + .../src/components/http/RawBody.vue | 1 + .../src/components/http/RequestVariables.vue | 1 + .../src/components/http/URLEncodedParams.vue | 1 + .../src/components/smart/EnvInput.vue | 12 +- .../src/composables/codemirror.ts | 12 + .../extensions/HoppPredefinedVariables.ts | 142 +++++++ .../src/newstore/environments.ts | 38 +- .../hoppscotch-data/src/environment/index.ts | 27 +- packages/hoppscotch-data/src/index.ts | 1 + .../src/predefinedVariables.ts | 370 ++++++++++++++++++ 14 files changed, 608 insertions(+), 17 deletions(-) create mode 100644 packages/hoppscotch-common/src/helpers/editor/extensions/HoppPredefinedVariables.ts create mode 100644 packages/hoppscotch-data/src/predefinedVariables.ts diff --git a/packages/hoppscotch-common/assets/scss/styles.scss b/packages/hoppscotch-common/assets/scss/styles.scss index 258992de7..526992436 100644 --- a/packages/hoppscotch-common/assets/scss/styles.scss +++ b/packages/hoppscotch-common/assets/scss/styles.scss @@ -609,3 +609,17 @@ details[open] summary .indicator { .gql-operation-highlight { @apply opacity-100; } + +.predefined-variable-highlight { + color: inherit; + + &.predefined-variable-valid { + @apply bg-yellow-500; + @apply hover:bg-yellow-600; + } + + &.predefined-variable-invalid { + @apply hover:bg-red-300; + @apply bg-red-300; + } +} diff --git a/packages/hoppscotch-common/src/components/environments/my/Details.vue b/packages/hoppscotch-common/src/components/environments/my/Details.vue index 09ec87098..36d37cc59 100644 --- a/packages/hoppscotch-common/src/components/environments/my/Details.vue +++ b/packages/hoppscotch-common/src/components/environments/my/Details.vue @@ -261,7 +261,7 @@ const clearIcon = refAutoReset( 1000 ) -const globalVars = useReadonlyStream(globalEnv$, {} as GlobalEnvironment) +const globalEnv = useReadonlyStream(globalEnv$, {} as GlobalEnvironment) type SelectedEnv = "variables" | "secret" @@ -319,7 +319,7 @@ const liveEnvs = computed(() => { } return [ ...vars.value.map((x) => ({ ...x.env, source: editingName.value! })), - ...globalVars.value.variables.map((x) => ({ ...x, source: "Global" })), + ...globalEnv.value.variables.map((x) => ({ ...x, source: "Global" })), ] }) diff --git a/packages/hoppscotch-common/src/components/http/Headers.vue b/packages/hoppscotch-common/src/components/http/Headers.vue index 03936ae49..d7e2b110e 100644 --- a/packages/hoppscotch-common/src/components/http/Headers.vue +++ b/packages/hoppscotch-common/src/components/http/Headers.vue @@ -343,6 +343,7 @@ useCodemirror( linter, completer: null, environmentHighlights: true, + predefinedVariablesHighlights: true, }) ) diff --git a/packages/hoppscotch-common/src/components/http/Parameters.vue b/packages/hoppscotch-common/src/components/http/Parameters.vue index 8434150d7..3a0a12210 100644 --- a/packages/hoppscotch-common/src/components/http/Parameters.vue +++ b/packages/hoppscotch-common/src/components/http/Parameters.vue @@ -161,6 +161,7 @@ useCodemirror( linter, completer: null, environmentHighlights: true, + predefinedVariablesHighlights: true, }) ) diff --git a/packages/hoppscotch-common/src/components/http/RawBody.vue b/packages/hoppscotch-common/src/components/http/RawBody.vue index 7def623dc..42fc11c9f 100644 --- a/packages/hoppscotch-common/src/components/http/RawBody.vue +++ b/packages/hoppscotch-common/src/components/http/RawBody.vue @@ -160,6 +160,7 @@ useCodemirror( linter: langLinter, completer: null, environmentHighlights: true, + predefinedVariablesHighlights: true, }) ) diff --git a/packages/hoppscotch-common/src/components/http/RequestVariables.vue b/packages/hoppscotch-common/src/components/http/RequestVariables.vue index 352e390b5..3343a8634 100644 --- a/packages/hoppscotch-common/src/components/http/RequestVariables.vue +++ b/packages/hoppscotch-common/src/components/http/RequestVariables.vue @@ -234,6 +234,7 @@ useCodemirror( linter, completer: null, environmentHighlights: true, + predefinedVariablesHighlights: true, }) ) diff --git a/packages/hoppscotch-common/src/components/http/URLEncodedParams.vue b/packages/hoppscotch-common/src/components/http/URLEncodedParams.vue index 1048b6b54..2903b0c0c 100644 --- a/packages/hoppscotch-common/src/components/http/URLEncodedParams.vue +++ b/packages/hoppscotch-common/src/components/http/URLEncodedParams.vue @@ -246,6 +246,7 @@ useCodemirror( linter, completer: null, environmentHighlights: true, + predefinedVariablesHighlights: true, }) ) diff --git a/packages/hoppscotch-common/src/components/smart/EnvInput.vue b/packages/hoppscotch-common/src/components/smart/EnvInput.vue index 88a4469fc..f4a4297ba 100644 --- a/packages/hoppscotch-common/src/components/smart/EnvInput.vue +++ b/packages/hoppscotch-common/src/components/smart/EnvInput.vue @@ -78,6 +78,7 @@ import { clone } from "lodash-es" import { history, historyKeymap } from "@codemirror/commands" import { inputTheme } from "~/helpers/editor/themes/baseTheme" import { HoppReactiveEnvPlugin } from "~/helpers/editor/extensions/HoppEnvironment" +import { HoppPredefinedVariablesPlugin } from "~/helpers/editor/extensions/HoppPredefinedVariables" import { useReadonlyStream } from "@composables/stream" import { AggregateEnvironment, aggregateEnvs$ } from "~/newstore/environments" import { platform } from "~/platform" @@ -103,6 +104,7 @@ const props = withDefaults( focus?: boolean selectTextOnMount?: boolean environmentHighlights?: boolean + predefinedVariablesHighlights?: boolean readonly?: boolean autoCompleteSource?: string[] inspectionResults?: InspectorResult[] | undefined @@ -118,6 +120,7 @@ const props = withDefaults( focus: false, readonly: false, environmentHighlights: true, + predefinedVariablesHighlights: true, autoCompleteSource: undefined, inspectionResult: undefined, inspectionResults: undefined, @@ -396,20 +399,22 @@ function envAutoCompletion(context: CompletionContext) { info: env?.value ?? "", apply: env?.key ? `<<${env.key}>>` : "", })) - .filter((x) => x) + .filter(Boolean) const nodeBefore = syntaxTree(context.state).resolveInner(context.pos, -1) const textBefore = context.state.sliceDoc(nodeBefore.from, context.pos) - const tagBefore = /<<\w*$/.exec(textBefore) + const tagBefore = /<<\$?\w*$/.exec(textBefore) // Update regex to match <<$ as well + if (!tagBefore && !context.explicit) return null return { from: tagBefore ? nodeBefore.from + tagBefore.index : context.pos, options: options, - validFor: /^(<<\w*)?$/, + validFor: /^(<<\$?\w*)?$/, } } const envTooltipPlugin = new HoppReactiveEnvPlugin(envVars, view) +const predefinedVariablePlugin = new HoppPredefinedVariablesPlugin() function handleTextSelection() { const selection = view.value?.state.selection.main @@ -490,6 +495,7 @@ const getExtensions = (readonly: boolean): Extension => { position: "absolute", }), props.environmentHighlights ? envTooltipPlugin : [], + props.predefinedVariablesHighlights ? predefinedVariablePlugin : [], placeholderExt(props.placeholder), EditorView.domEventHandlers({ paste(ev) { diff --git a/packages/hoppscotch-common/src/composables/codemirror.ts b/packages/hoppscotch-common/src/composables/codemirror.ts index 713a82852..bef6de5a8 100644 --- a/packages/hoppscotch-common/src/composables/codemirror.ts +++ b/packages/hoppscotch-common/src/composables/codemirror.ts @@ -47,6 +47,7 @@ import { useDebounceFn } from "@vueuse/core" // TODO: Migrate from legacy mode import * as E from "fp-ts/Either" +import { HoppPredefinedVariablesPlugin } from "~/helpers/editor/extensions/HoppPredefinedVariables" type ExtendedEditorConfig = { mode: string @@ -63,6 +64,12 @@ type CodeMirrorOptions = { // NOTE: This property is not reactive environmentHighlights: boolean + /** + * Whether or not to highlight predefined variables, such as: `<<$guid>>`. + * - These are special variables that starts with a dolar sign. + */ + predefinedVariablesHighlights?: boolean + additionalExts?: Extension[] contextMenuEnabled?: boolean @@ -251,6 +258,10 @@ export function useCodemirror( text: null, }) } + const predefinedVariable: HoppPredefinedVariablesPlugin | null = + options.predefinedVariablesHighlights + ? new HoppPredefinedVariablesPlugin() + : null function handleTextSelection() { const selection = view.value?.state.selection.main @@ -396,6 +407,7 @@ export function useCodemirror( ] if (environmentTooltip) extensions.push(environmentTooltip.extension) + if (predefinedVariable) extensions.push(predefinedVariable.extension) view.value = new EditorView({ parent: el, diff --git a/packages/hoppscotch-common/src/helpers/editor/extensions/HoppPredefinedVariables.ts b/packages/hoppscotch-common/src/helpers/editor/extensions/HoppPredefinedVariables.ts new file mode 100644 index 000000000..1405d000a --- /dev/null +++ b/packages/hoppscotch-common/src/helpers/editor/extensions/HoppPredefinedVariables.ts @@ -0,0 +1,142 @@ +import { Compartment } from "@codemirror/state" +import { + Decoration, + MatchDecorator, + ViewPlugin, + hoverTooltip, +} from "@codemirror/view" +import IconSquareAsterisk from "~icons/lucide/square-asterisk?raw" +import { HOPP_SUPPORTED_PREDEFINED_VARIABLES } from "@hoppscotch/data" + +const HOPP_PREDEFINED_VARIABLES_REGEX = /(<<\$[a-zA-Z0-9-_]+>>)/g + +const HOPP_PREDEFINED_VARIABLE_HIGHLIGHT = + "cursor-help transition rounded px-1 focus:outline-none mx-0.5 predefined-variable-highlight" +const HOPP_PREDEFINED_VARIABLE_HIGHLIGHT_VALID = "predefined-variable-valid" +const HOPP_PREDEFINED_VARIABLE_HIGHLIGHT_INVALID = "predefined-variable-invalid" + +const getMatchDecorator = () => { + return new MatchDecorator({ + regexp: HOPP_PREDEFINED_VARIABLES_REGEX, + decoration: (m) => checkPredefinedVariable(m[0]), + }) +} + +const cursorTooltipField = () => + hoverTooltip( + (view, pos, side) => { + const { from, to, text } = view.state.doc.lineAt(pos) + + // TODO: When Codemirror 6 allows this to work (not make the + // popups appear half of the time) use this implementation + // const wordSelection = view.state.wordAt(pos) + // if (!wordSelection) return null + // const word = view.state.doc.sliceString( + // wordSelection.from - 3, + // wordSelection.to + 2 + // ) + // if (!HOPP_PREDEFINED_VARIABLES_REGEX.test(word)) return null + + // Tracking the start and the end of the words + let start = pos + let end = pos + + while (start > from && /[a-zA-Z0-9-_]+/.test(text[start - from - 1])) + start-- + while (end < to && /[a-zA-Z0-9-_]+/.test(text[end - from])) end++ + + if ( + (start === pos && side < 0) || + (end === pos && side > 0) || + !HOPP_PREDEFINED_VARIABLES_REGEX.test( + text.slice(start - from - 3, end - from + 2) + ) + ) { + return null + } + + const variableName = text.slice(start - from - 1, end - from) + + const variable = HOPP_SUPPORTED_PREDEFINED_VARIABLES.find( + (VARIABLE) => VARIABLE.key === variableName + ) + + const variableIcon = `${IconSquareAsterisk}` + const variableDescription = + variable !== undefined + ? `${variableName} - ${variable.description}` + : `${variableName} is not a valid predefined variable.` + + return { + pos: start, + end: to, + above: true, + arrow: true, + create() { + const dom = document.createElement("div") + dom.className = "tippy-box" + dom.dataset.theme = "tooltip" + + const icon = document.createElement("span") + icon.innerHTML = variableIcon + icon.className = "mr-2" + + const tooltipContainer = document.createElement("span") + tooltipContainer.className = "tippy-content" + + tooltipContainer.appendChild(icon) + tooltipContainer.appendChild( + document.createTextNode(variableDescription) + ) + + dom.appendChild(tooltipContainer) + return { dom } + }, + } + }, + // HACK: This is a hack to fix hover tooltip not coming half of the time + // https://github.com/codemirror/tooltip/blob/765c463fc1d5afcc3ec93cee47d72606bed27e1d/src/tooltip.ts#L622 + // Still doesn't fix the not showing up some of the time issue, but this is atleast more consistent + { hoverTime: 1 } as any + ) + +const checkPredefinedVariable = (variable: string) => { + const inputVariableKey = variable.slice(2, -2) + + const className = HOPP_SUPPORTED_PREDEFINED_VARIABLES.find((v) => { + return v.key === inputVariableKey + }) + ? HOPP_PREDEFINED_VARIABLE_HIGHLIGHT_VALID + : HOPP_PREDEFINED_VARIABLE_HIGHLIGHT_INVALID + + return Decoration.mark({ + class: `${HOPP_PREDEFINED_VARIABLE_HIGHLIGHT} ${className}`, + }) +} + +export const predefinedVariableHighlightStyle = () => { + const decorator = getMatchDecorator() + + return ViewPlugin.define( + (view) => ({ + decorations: decorator.createDeco(view), + update(u) { + this.decorations = decorator.updateDeco(u, this.decorations) + }, + }), + { + decorations: (v) => v.decorations, + } + ) +} + +export class HoppPredefinedVariablesPlugin { + private compartment = new Compartment() + + get extension() { + return this.compartment.of([ + cursorTooltipField(), + predefinedVariableHighlightStyle(), + ]) + } +} diff --git a/packages/hoppscotch-common/src/newstore/environments.ts b/packages/hoppscotch-common/src/newstore/environments.ts index 3c04da409..6e3c3bf70 100644 --- a/packages/hoppscotch-common/src/newstore/environments.ts +++ b/packages/hoppscotch-common/src/newstore/environments.ts @@ -2,6 +2,7 @@ import { Environment, GlobalEnvironment, GlobalEnvironmentVariable, + HOPP_SUPPORTED_PREDEFINED_VARIABLES, } from "@hoppscotch/data" import { cloneDeep, isEqual } from "lodash-es" import { combineLatest, Observable } from "rxjs" @@ -407,24 +408,45 @@ export type AggregateEnvironment = { export const aggregateEnvs$: Observable = combineLatest( [currentEnvironment$, globalEnv$] ).pipe( - map(([selectedEnv, globalVars]) => { - const results: AggregateEnvironment[] = [] + map(([selectedEnv, globalEnv]) => { + const effectiveAggregateEnvs: AggregateEnvironment[] = [] + + // Ensure pre-defined variables are prioritised over other environment variables with the same name + HOPP_SUPPORTED_PREDEFINED_VARIABLES.forEach(({ key, getValue }) => { + effectiveAggregateEnvs.push({ + key, + value: getValue(), + secret: false, + sourceEnv: selectedEnv?.name ?? "Global", + }) + }) + + const aggregateEnvKeys = effectiveAggregateEnvs.map(({ key }) => key) selectedEnv?.variables.forEach((variable) => { const { key, secret } = variable const value = "value" in variable ? variable.value : "" - results.push({ key, value, secret, sourceEnv: selectedEnv.name }) + if (!aggregateEnvKeys.includes(key)) { + effectiveAggregateEnvs.push({ + key, + value, + secret, + sourceEnv: selectedEnv.name, + }) + } }) - globalVars.variables.forEach((variable) => { + globalEnv.variables.forEach((variable) => { const { key, secret } = variable const value = "value" in variable ? variable.value : "" - results.push({ key, value, secret, sourceEnv: "Global" }) + if (!aggregateEnvKeys.includes(key)) { + effectiveAggregateEnvs.push({ key, value, secret, sourceEnv: "Global" }) + } }) - return results + return effectiveAggregateEnvs }), distinctUntilChanged(isEqual) ) @@ -503,7 +525,7 @@ export function getAggregateEnvsWithSecrets() { export const aggregateEnvsWithSecrets$: Observable = combineLatest([currentEnvironment$, globalEnv$]).pipe( - map(([selectedEnv, globalVars]) => { + map(([selectedEnv, globalEnv]) => { const results: AggregateEnvironment[] = [] selectedEnv?.variables.map((x, index) => { let value @@ -523,7 +545,7 @@ export const aggregateEnvsWithSecrets$: Observable = }) }) - globalVars.variables.map((x, index) => { + globalEnv.variables.map((x, index) => { let value if (x.secret) { value = secretEnvironmentService.getSecretEnvironmentVariableValue( diff --git a/packages/hoppscotch-data/src/environment/index.ts b/packages/hoppscotch-data/src/environment/index.ts index 46c43aa82..dbd4954c1 100644 --- a/packages/hoppscotch-data/src/environment/index.ts +++ b/packages/hoppscotch-data/src/environment/index.ts @@ -6,6 +6,7 @@ import { z } from "zod" import V0_VERSION from "./v/0" import V1_VERSION, { uniqueID } from "./v/1" +import { HOPP_SUPPORTED_PREDEFINED_VARIABLES } from "../predefinedVariables" const versionedObject = z.object({ v: z.number(), @@ -58,12 +59,21 @@ export function parseBodyEnvVariablesE( while (result.match(REGEX_ENV_VAR) != null && depth <= ENV_MAX_EXPAND_LIMIT) { result = result.replace(REGEX_ENV_VAR, (key) => { - const found = env.find( - (envVar) => envVar.key === key.replace(/[<>]/g, "") + const variableName = key.replace(/[<>]/g, "") + + // Prioritise predefined variable values over normal environment variables processing. + const foundPredefinedVar = HOPP_SUPPORTED_PREDEFINED_VARIABLES.find( + (preVar) => preVar.key === variableName ) - if (found && "value" in found) { - return found.value + if (foundPredefinedVar) { + return foundPredefinedVar.getValue() + } + + const foundEnv = env.find((envVar) => envVar.key === variableName) + + if (foundEnv && "value" in foundEnv) { + return foundEnv.value } return key }) @@ -110,6 +120,15 @@ export function parseTemplateStringE( !isSecret ) { result = decodeURI(encodeURI(result)).replace(REGEX_ENV_VAR, (_, p1) => { + // Prioritise predefined variable values over normal environment variables processing. + const foundPredefinedVar = HOPP_SUPPORTED_PREDEFINED_VARIABLES.find( + (preVar) => preVar.key === p1 + ) + + if (foundPredefinedVar) { + return foundPredefinedVar.getValue() + } + const variable = variables.find((x) => x && x.key === p1) if (variable && "value" in variable) { diff --git a/packages/hoppscotch-data/src/index.ts b/packages/hoppscotch-data/src/index.ts index c37534c05..4576e4560 100644 --- a/packages/hoppscotch-data/src/index.ts +++ b/packages/hoppscotch-data/src/index.ts @@ -4,3 +4,4 @@ export * from "./collection" export * from "./rawKeyValue" export * from "./environment" export * from "./global-environment" +export * from "./predefinedVariables" diff --git a/packages/hoppscotch-data/src/predefinedVariables.ts b/packages/hoppscotch-data/src/predefinedVariables.ts new file mode 100644 index 000000000..07d219496 --- /dev/null +++ b/packages/hoppscotch-data/src/predefinedVariables.ts @@ -0,0 +1,370 @@ +export type PredefinedVariable = { + key: `$${string}` + description: string + getValue: () => string +} + +export const HOPP_SUPPORTED_PREDEFINED_VARIABLES: PredefinedVariable[] = [ + // Common + { + key: "$guid", + description: "A v4 style GUID.", + getValue: () => { + const characters = "0123456789abcdef" + let guid = "" + for (let i = 0; i < 36; i++) { + if (i === 8 || i === 13 || i === 18 || i === 23) { + guid += "-" + } else if (i === 14) { + guid += "4" + } else if (i === 19) { + guid += characters.charAt(8 + Math.floor(Math.random() * 4)) + } else { + guid += characters.charAt( + Math.floor(Math.random() * characters.length) + ) + } + } + return guid + }, + }, + { + key: "$nowISO", + description: "Current date and time in ISO-8601 format.", + getValue: () => new Date().toISOString(), + }, + { + key: "$timestamp", + description: "The current UNIX timestamp in seconds.", + getValue: () => Math.floor(Date.now() / 1000).toString(), + }, + + { + key: "$isoTimestamp", + description: "The current ISO timestamp at zero UTC.", + getValue: () => new Date().toISOString(), + }, + { + key: "$randomUUID", + description: "A random 36-character UUID.", + getValue: () => { + const characters = "0123456789abcdef" + let uuid = "" + for (let i = 0; i < 36; i++) { + if (i === 8 || i === 13 || i === 18 || i === 23) { + uuid += "-" + } else { + uuid += characters.charAt( + Math.floor(Math.random() * characters.length) + ) + } + } + return uuid + }, + }, + + // Text, numbers, and colors + { + key: "$randomAlphaNumeric", + description: "A random alpha-numeric character.", + getValue: () => { + const characters = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + return characters.charAt(Math.floor(Math.random() * characters.length)) + }, + }, + + { + key: "$randomBoolean", + description: "A random boolean value.", + getValue: () => (Math.random() < 0.5 ? "true" : "false"), + }, + + { + key: "$randomInt", + description: "A random integer between 0 and 1000.", + getValue: () => Math.floor(Math.random() * 1000).toString(), + }, + + { + key: "$randomColor", + description: "A random color.", + getValue: () => { + const colors = ["red", "green", "blue", "yellow", "purple", "orange"] + return colors[Math.floor(Math.random() * colors.length)] + }, + }, + + { + key: "$randomHexColor", + description: "A random hex value.", + getValue: () => { + const characters = "0123456789abcdef" + let color = "#" + for (let i = 0; i < 6; i++) { + color += characters.charAt( + Math.floor(Math.random() * characters.length) + ) + } + return color + }, + }, + + { + key: "$randomAbbreviation", + description: "A random abbreviation.", + getValue: () => { + const abbreviations = [ + "SQL", + "PCI", + "JSON", + "HTML", + "CSS", + "JS", + "TS", + "API", + ] + return abbreviations[Math.floor(Math.random() * abbreviations.length)] + }, + }, + + // Internet and IP addresses + { + key: "$randomIP", + description: "A random IPv4 address.", + getValue: () => { + const ip = Array.from({ length: 4 }, () => + Math.floor(Math.random() * 256) + ) + return ip.join(".") + }, + }, + + { + key: "$randomIPV6", + description: "A random IPv6 address.", + getValue: () => { + const ip = Array.from({ length: 8 }, () => + Math.floor(Math.random() * 65536).toString(16) + ) + return ip.join(":") + }, + }, + + { + key: "$randomMACAddress", + description: "A random MAC address.", + getValue: () => { + const mac = Array.from({ length: 6 }, () => + Math.floor(Math.random() * 256).toString(16) + ) + return mac.join(":") + }, + }, + + { + key: "$randomPassword", + description: "A random 15-character alpha-numeric password.", + getValue: () => { + const characters = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" + let password = "" + for (let i = 0; i < 15; i++) { + password += characters.charAt( + Math.floor(Math.random() * characters.length) + ) + } + return password + }, + }, + + { + key: "$randomLocale", + description: "A random two-letter language code (ISO 639-1).", + getValue: () => { + const locales = ["ny", "sr", "si"] + return locales[Math.floor(Math.random() * locales.length)] + }, + }, + + { + key: "$randomUserAgent", + description: "A random user agent.", + getValue: () => { + const userAgents = [ + "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.9.8; rv:15.6) Gecko/20100101 Firefox/15.6.6", + "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.6) Gecko/20100101 Firefox/15.6.6", + "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.6) Gecko/20100101 Firefox/15.6.6", + ] + return userAgents[Math.floor(Math.random() * userAgents.length)] + }, + }, + { + key: "$randomProtocol", + description: "A random internet protocol.", + getValue: () => { + const protocols = ["http", "https"] + return protocols[Math.floor(Math.random() * protocols.length)] + }, + }, + + { + key: "$randomSemver", + description: "A random semantic version number.", + getValue: () => { + const semver = Array.from({ length: 3 }, () => + Math.floor(Math.random() * 10) + ) + return semver.join(".") + }, + }, + + // Names + { + key: "$randomFirstName", + description: "A random first name.", + getValue: () => { + const firstNames = [ + "Ethan", + "Chandler", + "Megane", + "John", + "Jane", + "Alice", + "Bob", + ] + return firstNames[Math.floor(Math.random() * firstNames.length)] + }, + }, + { + key: "$randomLastName", + description: "A random last name.", + getValue: () => { + const lastNames = [ + "Schaden", + "Schneider", + "Willms", + "Doe", + "Smith", + "Johnson", + ] + return lastNames[Math.floor(Math.random() * lastNames.length)] + }, + }, + { + key: "$randomFullName", + description: "A random first and last name.", + getValue: () => { + const firstNames = [ + "Ethan", + "Chandler", + "Megane", + "John", + "Jane", + "Alice", + "Bob", + ] + const lastNames = [ + "Schaden", + "Schneider", + "Willms", + "Doe", + "Smith", + "Johnson", + ] + return `${firstNames[Math.floor(Math.random() * firstNames.length)]} ${ + lastNames[Math.floor(Math.random() * lastNames.length)] + }` + }, + }, + { + key: "$randomNamePrefix", + description: "A random name prefix.", + getValue: () => { + const prefixes = ["Dr.", "Ms.", "Mr.", "Mrs.", "Miss", "Prof."] + return prefixes[Math.floor(Math.random() * prefixes.length)] + }, + }, + { + key: "$randomNameSuffix", + description: "A random name suffix.", + getValue: () => { + const suffixes = ["I", "MD", "DDS", "PhD", "Esq.", "Jr."] + return suffixes[Math.floor(Math.random() * suffixes.length)] + }, + }, + + // Addresses + { + key: "$randomCity", + description: "A random city name.", + getValue: () => { + const cities = [ + "New York", + "Los Angeles", + "Chicago", + "Houston", + "Phoenix", + "Philadelphia", + ] + return cities[Math.floor(Math.random() * cities.length)] + }, + }, + + // profession + { + key: "$randomJobArea", + description: "A random job area.", + getValue: () => { + const jobAreas = [ + "Mobility", + "Intranet", + "Configuration", + "Development", + "Design", + "Testing", + ] + return jobAreas[Math.floor(Math.random() * jobAreas.length)] + }, + }, + { + key: "$randomJobDescriptor", + description: "A random job descriptor.", + getValue: () => { + const jobDescriptors = [ + "Forward", + "Corporate", + "Senior", + "Junior", + "Lead", + "Principal", + ] + return jobDescriptors[Math.floor(Math.random() * jobDescriptors.length)] + }, + }, + { + key: "$randomJobTitle", + description: "A random job title.", + getValue: () => { + const jobTitles = [ + "International Creative Liaison", + "Global Branding Officer", + "Dynamic Data Specialist", + "Internal Communications Consultant", + "Productivity Analyst", + "Regional Applications Developer", + ] + return jobTitles[Math.floor(Math.random() * jobTitles.length)] + }, + }, + { + key: "$randomJobType", + description: "A random job type.", + getValue: () => { + const jobTypes = ["Supervisor", "Manager", "Coordinator", "Director"] + return jobTypes[Math.floor(Math.random() * jobTypes.length)] + }, + }, + + // TODO: Support various other predefined variables +] From fdf5bf34ed900a7148dd04dc15c33702480f5590 Mon Sep 17 00:00:00 2001 From: Akash K <57758277+amk-dev@users.noreply.github.com> Date: Mon, 30 Sep 2024 18:42:09 +0530 Subject: [PATCH 068/159] feat: support import collections between workspaces (#4377) Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com> --- packages/hoppscotch-common/locales/en.json | 9 +- .../hoppscotch-common/src/components.d.ts | 1 + .../components/collections/ImportExport.vue | 36 +- .../importExport/ImportExportList.vue | 20 +- .../ImportExportSteps/AllCollectionImport.vue | 366 ++++++++++++++++++ .../src/helpers/teams/TeamCollection.ts | 21 + .../helpers/teams/TeamCollectionAdapter.ts | 2 +- .../src/helpers/teams/TeamRequest.ts | 21 + .../src/helpers/teams/TeamsSearch.service.ts | 48 +-- 9 files changed, 447 insertions(+), 77 deletions(-) create mode 100644 packages/hoppscotch-common/src/components/importExport/ImportExportSteps/AllCollectionImport.vue diff --git a/packages/hoppscotch-common/locales/en.json b/packages/hoppscotch-common/locales/en.json index 312a8ff2d..c036de5b7 100644 --- a/packages/hoppscotch-common/locales/en.json +++ b/packages/hoppscotch-common/locales/en.json @@ -4,6 +4,9 @@ "autoscroll": "Autoscroll", "cancel": "Cancel", "choose_file": "Choose a file", + "choose_workspace": "Choose a workspace", + "choose_collection": "Choose a collection", + "select_workspace": "Select a workspace", "clear": "Clear", "clear_all": "Clear all", "clear_history": "Clear all History", @@ -460,6 +463,8 @@ "from_json_description": "Import from Hoppscotch collection file", "from_my_collections": "Import from Personal Collections", "from_my_collections_description": "Import from Personal Collections file", + "from_all_collections": "Import from Another Workspace", + "from_all_collections_description": "Import any collection from Another Workspace to the current workspace", "from_openapi": "Import from OpenAPI", "from_openapi_description": "Import from OpenAPI specification file (YML/JSON)", "from_postman": "Import from Postman", @@ -947,7 +952,9 @@ "subscribed_success": "Successfully subscribed to topic: {topic}", "unsubscribed_failed": "Failed to unsubscribe from topic: {topic}", "unsubscribed_success": "Successfully unsubscribed from topic: {topic}", - "waiting_send_request": "Waiting to send request" + "waiting_send_request": "Waiting to send request", + "loading_workspaces": "Loading workspaces", + "loading_collections_in_workspace": "Loading collections in workspace" }, "support": { "changelog": "Read more about latest releases", diff --git a/packages/hoppscotch-common/src/components.d.ts b/packages/hoppscotch-common/src/components.d.ts index 06dfe2ae5..e51899b8d 100644 --- a/packages/hoppscotch-common/src/components.d.ts +++ b/packages/hoppscotch-common/src/components.d.ts @@ -186,6 +186,7 @@ declare module 'vue' { ImportExportBase: typeof import('./components/importExport/Base.vue')['default'] ImportExportImportExportList: typeof import('./components/importExport/ImportExportList.vue')['default'] ImportExportImportExportSourcesList: typeof import('./components/importExport/ImportExportSourcesList.vue')['default'] + ImportExportImportExportStepsAllCollectionImport: typeof import('./components/importExport/ImportExportSteps/AllCollectionImport.vue')['default'] ImportExportImportExportStepsFileImport: typeof import('./components/importExport/ImportExportSteps/FileImport.vue')['default'] ImportExportImportExportStepsMyCollectionImport: typeof import('./components/importExport/ImportExportSteps/MyCollectionImport.vue')['default'] ImportExportImportExportStepsUrlImport: typeof import('./components/importExport/ImportExportSteps/UrlImport.vue')['default'] diff --git a/packages/hoppscotch-common/src/components/collections/ImportExport.vue b/packages/hoppscotch-common/src/components/collections/ImportExport.vue index 4287fde90..80a67abc4 100644 --- a/packages/hoppscotch-common/src/components/collections/ImportExport.vue +++ b/packages/hoppscotch-common/src/components/collections/ImportExport.vue @@ -29,7 +29,7 @@ import { import { defineStep } from "~/composables/step-components" -import MyCollectionImport from "~/components/importExport/ImportExportSteps/MyCollectionImport.vue" +import AllCollectionImport from "~/components/importExport/ImportExportSteps/AllCollectionImport.vue" import { useI18n } from "~/composables/i18n" import { useToast } from "~/composables/toast" import { appendRESTCollections, restCollections$ } from "~/newstore/collections" @@ -61,7 +61,7 @@ const isPostmanImporterInProgress = ref(false) const isInsomniaImporterInProgress = ref(false) const isOpenAPIImporterInProgress = ref(false) const isRESTImporterInProgress = ref(false) -const isPersonalCollectionImporterInProgress = ref(false) +const isAllCollectionImporterInProgress = ref(false) const isHarImporterInProgress = ref(false) const isGistImporterInProgress = ref(false) @@ -209,19 +209,19 @@ const HoppRESTImporter: ImporterOrExporter = { }), } -const HoppMyCollectionImporter: ImporterOrExporter = { +const HoppAllCollectionImporter: ImporterOrExporter = { metadata: { - id: "hopp_my_collection", - name: "import.from_my_collections", - title: "import.from_my_collections_description", + id: "hopp_all_collection", + name: "import.from_all_collections", + title: "import.from_all_collections_description", icon: IconUser, - disabled: false, - applicableTo: ["team-workspace"], + disabled: !currentUser.value, + applicableTo: ["personal-workspace", "team-workspace"], }, - component: defineStep("my_collection_import", MyCollectionImport, () => ({ - loading: isPersonalCollectionImporterInProgress.value, - async onImportFromMyCollection(content) { - isPersonalCollectionImporterInProgress.value = true + component: defineStep("all_collection_import", AllCollectionImport, () => ({ + loading: isAllCollectionImporterInProgress.value, + async onImportCollection(content) { + isAllCollectionImporterInProgress.value = true await handleImportToStore([content]) @@ -232,7 +232,7 @@ const HoppMyCollectionImporter: ImporterOrExporter = { platform: "rest", }) - isPersonalCollectionImporterInProgress.value = false + isAllCollectionImporterInProgress.value = false }, })), } @@ -351,7 +351,7 @@ const HoppInsomniaImporter: ImporterOrExporter = { name: "import.from_insomnia", title: "import.from_insomnia_description", icon: IconInsomnia, - disabled: true, + disabled: false, applicableTo: ["personal-workspace", "team-workspace", "url-import"], }, component: FileSource({ @@ -387,7 +387,7 @@ const HoppGistImporter: ImporterOrExporter = { name: "import.from_gist", title: "import.from_gist_description", icon: IconGithub, - disabled: true, + disabled: false, applicableTo: ["personal-workspace", "team-workspace", "url-import"], }, component: GistSource({ @@ -596,7 +596,7 @@ const HARImporter: ImporterOrExporter = { const importerModules = computed(() => { const enabledImporters = [ HoppRESTImporter, - HoppMyCollectionImporter, + HoppAllCollectionImporter, HoppOpenAPIImporter, HoppPostmanImporter, HoppInsomniaImporter, @@ -607,6 +607,10 @@ const importerModules = computed(() => { const isTeams = props.collectionsType.type === "team-collections" return enabledImporters.filter((importer) => { + if (importer.metadata.disabled) { + return false + } + return isTeams ? importer.metadata.applicableTo.includes("team-workspace") : importer.metadata.applicableTo.includes("personal-workspace") diff --git a/packages/hoppscotch-common/src/components/importExport/ImportExportList.vue b/packages/hoppscotch-common/src/components/importExport/ImportExportList.vue index e26599b72..af99299b5 100644 --- a/packages/hoppscotch-common/src/components/importExport/ImportExportList.vue +++ b/packages/hoppscotch-common/src/components/importExport/ImportExportList.vue @@ -1,18 +1,6 @@ {{ request.method.toUpperCase() }} diff --git a/packages/hoppscotch-common/src/components/collections/AddRequest.vue b/packages/hoppscotch-common/src/components/collections/AddRequest.vue index ae3ebd537..8633cf823 100644 --- a/packages/hoppscotch-common/src/components/collections/AddRequest.vue +++ b/packages/hoppscotch-common/src/components/collections/AddRequest.vue @@ -92,6 +92,9 @@ watch( () => props.show, (show) => { if (show) { + if (tabs.currentActiveTab.value.document.type === "example-response") + return + editingName.value = tabs.currentActiveTab.value.document.request.name } } diff --git a/packages/hoppscotch-common/src/components/collections/Collection.vue b/packages/hoppscotch-common/src/components/collections/Collection.vue index 60860a1b0..0faf43bb6 100644 --- a/packages/hoppscotch-common/src/components/collections/Collection.vue +++ b/packages/hoppscotch-common/src/components/collections/Collection.vue @@ -62,7 +62,7 @@