chore: merge main into next

This commit is contained in:
jamesgeorge007 2025-03-19 16:52:23 +05:30
commit d8e297f61e
52 changed files with 2561 additions and 1990 deletions

View file

@ -10,14 +10,13 @@ on:
jobs:
build:
# strategy:
# matrix:
# platform: [
# { platform: linux/amd64, cache: docker-release-amd64 },
# { platform: linux/arm64, cache: docker-release-arm64 },
# ]
strategy:
matrix:
platform: [
{ platform: linux/amd64, cache: docker-release-amd64, artifactSuffix: amd64 },
{ platform: linux/arm64, cache: docker-release-arm64, artifactSuffix: arm64 },
]
runs-on: ubuntu-latest
# continue-on-error: true # We can continue each platform deployment if the other fails
steps:
- name: Checkout
uses: actions/checkout@v4
@ -37,85 +36,147 @@ jobs:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push the backend container
- name: Build and push the backend container by digest
id: backend-build
uses: docker/build-push-action@v4
if: false # TODO: Temporary, remove later
with:
context: .
file: ./prod.Dockerfile
target: backend
push: true
# cache-from: type=gha,timeout=200m,scope=${{ matrix.platform.cache }}
# cache-to: type=gha,mode=max,timeout=200m,scope=${{ matrix.platform.cache }}
cache-from: type=gha,timeout=200m,scope=docker-release-allarch
cache-to: type=gha,mode=max,timeout=200m,scope=docker-release-allarch
# platforms: |
# ${{ matrix.platform.platform }}
cache-from: type=gha,timeout=200m,scope=${{ matrix.platform.cache }}
cache-to: type=gha,mode=max,timeout=200m,scope=${{ matrix.platform.cache }}
platforms: |
linux/amd64
linux/arm64
${{ matrix.platform.platform }}
tags: |
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_BACKEND_CONTAINER_NAME }}:latest
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_BACKEND_CONTAINER_NAME }}:${{ github.ref_name }}
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_BACKEND_CONTAINER_NAME }}
outputs: type=image,push-by-digest=true,name-canonical=true,push=true
- name: Build and push the frontend container
- name: Build and push the frontend container by digest
id: frontend-build
uses: docker/build-push-action@v4
if: false # TODO: Temporary, remove later
with:
context: .
file: ./prod.Dockerfile
target: app
push: true
# cache-from: type=gha,timeout=200m,scope=${{ matrix.platform.cache }}
# cache-to: type=gha,mode=max,timeout=200m,scope=${{ matrix.platform.cache }}
cache-from: type=gha,timeout=200m,scope=docker-release-allarch
cache-to: type=gha,mode=max,timeout=200m,scope=docker-release-allarch
# platforms: |
# ${{ matrix.platform.platform }}
cache-from: type=gha,timeout=200m,scope=${{ matrix.platform.cache }}
cache-to: type=gha,mode=max,timeout=200m,scope=${{ matrix.platform.cache }}
platforms: |
linux/amd64
linux/arm64
${{ matrix.platform.platform }}
tags: |
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}:latest
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}:${{ github.ref_name }}
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}
outputs: type=image,push-by-digest=true,name-canonical=true,push=true
- name: Build and push the admin dashboard container
- name: Build and push the admin dashboard container by digest
id: sh_admin-build
uses: docker/build-push-action@v4
with:
context: .
file: ./prod.Dockerfile
target: sh_admin
push: true
# cache-from: type=gha,timeout=200m,scope=${{ matrix.platform.cache }}
# cache-to: type=gha,mode=max,timeout=200m,scope=${{ matrix.platform.cache }}
cache-from: type=gha,timeout=200m,scope=docker-release-allarch
cache-to: type=gha,mode=max,timeout=200m,scope=docker-release-allarch
# platforms: |
# ${{ matrix.platform.platform }}
cache-from: type=gha,timeout=200m,scope=${{ matrix.platform.cache }}
cache-to: type=gha,mode=max,timeout=200m,scope=${{ matrix.platform.cache }}
platforms: |
linux/amd64
linux/arm64
${{ matrix.platform.platform }}
tags: |
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}:latest
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}:${{ github.ref_name }}
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}
outputs: type=image,push-by-digest=true,name-canonical=true,push=true
- name: Build and push the AIO container
- name: Build and push the AIO container by digest
id: aio-build
uses: docker/build-push-action@v4
with:
context: .
file: ./prod.Dockerfile
target: aio
push: true
# cache-from: type=gha,timeout=200m,scope=${{ matrix.platform.cache }}
# cache-to: type=gha,mode=max,timeout=200m,scope=${{ matrix.platform.cache }}
cache-from: type=gha,timeout=200m,scope=docker-release-allarch
cache-to: type=gha,mode=max,timeout=200m,scope=docker-release-allarch
# platforms: |
# ${{ matrix.platform.platform }}
cache-from: type=gha,timeout=200m,scope=${{ matrix.platform.cache }}
cache-to: type=gha,mode=max,timeout=200m,scope=${{ matrix.platform.cache }}
platforms: |
linux/amd64
linux/arm64
${{ matrix.platform.platform }}
tags: |
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_AIO_CONTAINER_NAME }}:latest
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_AIO_CONTAINER_NAME }}:${{ github.ref_name }}
${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_AIO_CONTAINER_NAME }}
outputs: type=image,push-by-digest=true,name-canonical=true,push=true
- name: Make digest files
run: |
backend_digest="${{ steps.backend-build.outputs.digest }}"
frontend_digest="${{ steps.frontend-build.outputs.digest }}"
sh_admin_digest="${{ steps.sh_admin-build.outputs.digest }}"
aio_digest="${{ steps.aio-build.outputs.digest }}"
mkdir -p digests/backend digests/frontend digests/sh_admin digests/aio
touch "digests/backend/${backend_digest#sha256:}"
touch "digests/frontend/${frontend_digest#sha256:}"
touch "digests/sh_admin/${sh_admin_digest#sha256:}"
touch "digests/aio/${aio_digest#sha256:}"
- name: Upload digests files as artifacts
uses: actions/upload-artifact@v4
with:
name: release-docker-build-digests-${{ github.ref_name }}-${{ matrix.platform.artifactSuffix }}
path: digests/*
if-no-files-found: error
retention-days: 1
assemble-and-push-to-docker-hub:
runs-on: ubuntu-latest
needs:
- build
steps:
- name: Download digests from artifacts
uses: actions/download-artifact@v4
with:
path: digests
pattern: release-docker-build-digests-${{ github.ref_name }}-*
merge-multiple: true
- name: Setup QEMU
uses: docker/setup-qemu-action@v3
- name: Setup Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: "[Backend] - Create manifest list and push"
working-directory: digests/backend
run: |
docker buildx imagetools create -t ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_BACKEND_CONTAINER_NAME }}:${{ github.ref_name }} \
$(printf '${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_BACKEND_CONTAINER_NAME }}@sha256:%s ' *)
docker buildx imagetools create -t ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_BACKEND_CONTAINER_NAME }}:latest \
$(printf '${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_BACKEND_CONTAINER_NAME }}@sha256:%s ' *)
- name: "[Frontend] - Create manifest list and push"
working-directory: digests/frontend
run: |
docker buildx imagetools create -t ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}:${{ github.ref_name }} \
$(printf '${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}@sha256:%s ' *)
docker buildx imagetools create -t ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}:latest \
$(printf '${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}@sha256:%s ' *)
- name: "[SH Admin] - Create manifest list and push"
working-directory: digests/sh_admin
run: |
docker buildx imagetools create -t ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}:${{ github.ref_name }} \
$(printf '${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}@sha256:%s ' *)
docker buildx imagetools create -t ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}:latest \
$(printf '${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}@sha256:%s ' *)
- name: "[AIO] - Create manifest list and push"
working-directory: digests/aio
run: |
docker buildx imagetools create -t ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_AIO_CONTAINER_NAME }}:${{ github.ref_name }} \
$(printf '${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_AIO_CONTAINER_NAME }}@sha256:%s ' *)
docker buildx imagetools create -t ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_AIO_CONTAINER_NAME }}:latest \
$(printf '${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_AIO_CONTAINER_NAME }}@sha256:%s ' *)

View file

@ -36,6 +36,7 @@ function runChildProcessWithPrefix(command, args, prefix) {
const envFileContent = Object.entries(process.env)
.filter(([env]) => env.startsWith("VITE_"))
.sort(([envA], [envB]) => envA.localeCompare(envB))
.map(([env, val]) => `${env}=${
(val.startsWith("\"") && val.endsWith("\""))
? val

View file

@ -1,7 +1,7 @@
{
"name": "hoppscotch-agent",
"private": true,
"version": "0.1.6",
"version": "0.1.7",
"type": "module",
"scripts": {
"dev": "vite",

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
[package]
name = "hoppscotch-agent"
version = "0.1.6"
version = "0.1.7"
description = "A cross-platform HTTP request agent for Hoppscotch for advanced request handling including custom headers, certificates, proxies, and local system integration."
authors = ["AndrewBastin", "CuriousCorrelation"]
edition = "2021"

View file

@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2.0.0-rc",
"productName": "Hoppscotch Agent",
"version": "0.1.6",
"version": "0.1.7",
"identifier": "io.hoppscotch.agent",
"build": {
"beforeDevCommand": "pnpm dev",

View file

@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2.0.0-rc",
"productName": "Hoppscotch Agent Portable",
"version": "0.1.6",
"version": "0.1.7",
"identifier": "io.hoppscotch.agent",
"build": {
"beforeDevCommand": "pnpm dev",

View file

@ -1,6 +1,6 @@
{
"name": "hoppscotch-backend",
"version": "2025.2.2",
"version": "2025.2.3",
"description": "",
"author": "",
"private": true,

View file

@ -1225,6 +1225,7 @@
"published_error": "Something went wrong while publishing msg: {topic} to topic: {message}",
"published_message": "Published message: {message} to topic: {topic}",
"reconnection_error": "Failed to reconnect",
"saved": "Saved",
"show": "Show",
"subscribed_failed": "Failed to subscribe to topic: {topic}",
"subscribed_success": "Successfully subscribed to topic: {topic}",

View file

@ -1,7 +1,7 @@
{
"name": "@hoppscotch/common",
"private": true,
"version": "2025.2.2",
"version": "2025.2.3",
"scripts": {
"dev": "pnpm exec npm-run-all -p -l dev:*",
"test": "vitest --run",
@ -125,7 +125,7 @@
"@graphql-codegen/urql-introspection": "3.0.0",
"@graphql-typed-document-node/core": "3.2.0",
"@iconify-json/lucide": "1.2.9",
"@intlify/vite-plugin-vue-i18n": "7.0.0",
"@intlify/unplugin-vue-i18n": "6.0.4",
"@relmify/jest-fp-ts": "2.1.1",
"@rushstack/eslint-patch": "1.10.4",
"@types/har-format": "1.2.16",

View file

@ -23,7 +23,6 @@ declare module 'vue' {
AppGitHubStarButton: typeof import('./components/app/GitHubStarButton.vue')['default']
AppHeader: typeof import('./components/app/Header.vue')['default']
AppInspection: typeof import('./components/app/Inspection.vue')['default']
AppInterceptor: typeof import('./components/app/Interceptor.vue')['default']
AppKernelInterceptor: typeof import('./components/app/KernelInterceptor.vue')['default']
AppLogo: typeof import('./components/app/Logo.vue')['default']
AppMarkdown: typeof import('./components/app/Markdown.vue')['default']

View file

@ -1,60 +0,0 @@
<template>
<div class="flex flex-col space-y-2">
<div v-if="isTooltipComponent" class="flex flex-col px-4 pt-2">
<h2 class="inline-flex pb-1 font-semibold text-secondaryDark">
{{ t("settings.interceptor") }}
</h2>
<p class="inline-flex text-tiny">
{{ t("settings.interceptor_description") }}
</p>
</div>
<div>
<div
v-for="interceptor in interceptors"
:key="interceptor.interceptorID"
class="flex flex-col"
>
<HoppSmartRadio
:value="interceptor.interceptorID"
:label="unref(interceptor.name(t))"
:selected="interceptorSelection === interceptor.interceptorID"
:class="{
'!px-0 hover:bg-transparent': !isTooltipComponent,
}"
@change="interceptorSelection = interceptor.interceptorID"
/>
<component
:is="interceptor.selectorSubtitle"
v-if="interceptor.selectorSubtitle"
/>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import { useI18n } from "@composables/i18n"
import { useService } from "dioc/vue"
import { Ref, unref } from "vue"
import { InterceptorService } from "~/services/interceptor.service"
const t = useI18n()
withDefaults(
defineProps<{
isTooltipComponent?: boolean
}>(),
{
isTooltipComponent: true,
}
)
const interceptorService = useService(InterceptorService)
const interceptorSelection =
interceptorService.currentInterceptorID as Ref<string>
const interceptors = interceptorService.availableInterceptors
</script>

View file

@ -14,7 +14,9 @@
:text="t('cookies.modal.interceptor_no_support')"
>
<template #body>
<AppInterceptor class="rounded border border-dividerLight p-2" />
<AppKernelInterceptor
class="rounded border border-dividerLight p-2"
/>
</template>
</HoppSmartPlaceholder>
<div v-else class="flex flex-col">

View file

@ -57,7 +57,9 @@
:text="t('helpers.network_fail')"
>
<template #body>
<AppInterceptor class="rounded border border-dividerLight p-2" />
<AppKernelInterceptor
class="rounded border border-dividerLight p-2"
/>
</template>
</HoppSmartPlaceholder>
<HoppSmartPlaceholder

View file

@ -101,7 +101,8 @@ const urlFetchLogic =
const responsePayload = parseBodyAsJSON<unknown>(res.right.body)
if (O.isSome(responsePayload)) {
return E.right(responsePayload)
// stringify the response payload
return E.right(JSON.stringify(responsePayload.value))
}
return E.left("REQUEST_FAILED")

View file

@ -98,6 +98,7 @@ import IconEyeOff from "~icons/lucide/eye-off"
import IconWrapText from "~icons/lucide/wrap-text"
import IconSave from "~icons/lucide/save"
import { HoppRESTRequestResponse } from "@hoppscotch/data"
import { computedAsync } from "@vueuse/core"
const t = useI18n()
const persistenceService = useService(PersistenceService)
@ -136,8 +137,12 @@ const { downloadIcon, downloadResponse } = useDownloadResponse(
request_name: responseName.value,
})
)
const defaultPreview =
(await persistenceService.getLocalConfig("lens_html_preview")) === "true"
const defaultPreview = computedAsync(
async () =>
(await persistenceService.getLocalConfig("lens_html_preview")) === "true",
false
)
const { previewFrame, previewEnabled, togglePreview } = usePreview(
defaultPreview,

View file

@ -1,7 +1,7 @@
import { HoppRESTResponse } from "@helpers/types/HoppRESTResponse"
import { copyToClipboard } from "@helpers/utils/clipboard"
import { refAutoReset } from "@vueuse/core"
import { computed, ComputedRef, onMounted, ref, Ref } from "vue"
import { computed, ComputedRef, ref, Ref, watch } from "vue"
import jsonToLanguage from "~/helpers/utils/json-to-language"
import { platform } from "~/platform"
@ -88,7 +88,7 @@ export function useDownloadResponse(
}
export function usePreview(
previewEnabledDefault: boolean,
previewEnabled: Ref<boolean>,
responseBodyText: Ref<string>
): {
previewFrame: Ref<HTMLIFrameElement | null>
@ -96,18 +96,8 @@ export function usePreview(
togglePreview: () => void
} {
const previewFrame: Ref<HTMLIFrameElement | null> = ref(null)
const previewEnabled = ref(previewEnabledDefault)
const url = ref("")
// `previewFrame` is a template ref that gets attached to the `iframe` element when the component mounts
// Ensures the HTML content is rendered immediately after a request, persists between tab switches, and is not limited to preview toggles
onMounted(() => updatePreviewFrame())
// Prevent updating the `iframe` element attributes during preview toggle actions after they are set initially
const shouldUpdatePreviewFrame = computed(
() => previewFrame.value?.getAttribute("data-previewing-url") !== url.value
)
const updatePreviewFrame = () => {
if (
previewEnabled.value &&
@ -126,9 +116,35 @@ export function usePreview(
// Finally, set the iframe source to the resulting HTML.
previewFrame.value.srcdoc = previewDocument.documentElement.outerHTML
previewFrame.value.setAttribute("data-previewing-url", url.value)
// Enable sandboxing for the iframe but this can have security implications
// https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox
// https://stackoverflow.com/a/30785417
// previewFrame.value.setAttribute(
// "sandbox",
// "allow-scripts allow-same-origin"
// )
}
}
// `previewFrame` is a template ref that gets attached to the `iframe` element when the component mounts
// Ensures the HTML content is rendered immediately after a request, persists between tab switches, and is not limited to preview toggles
// Also watches for changes in the `previewEnabled` state to update the `iframe` element attributes
watch(
previewEnabled,
() => {
updatePreviewFrame()
},
{
immediate: true,
}
)
// Prevent updating the `iframe` element attributes during preview toggle actions after they are set initially
const shouldUpdatePreviewFrame = computed(
() => previewFrame.value?.getAttribute("data-previewing-url") !== url.value
)
const togglePreview = () => {
previewEnabled.value = !previewEnabled.value
updatePreviewFrame()

View file

@ -130,32 +130,30 @@ const convertSecurity = (
pipe(
O.fromNullable(security),
O.chain((security) => {
return pipe(
const certificatesOption = pipe(
O.fromNullable(security.certificates),
O.chain((certificates) =>
pipe(
O.Do,
O.bind("client", () => convertClientCert(certificates.client)),
O.bind("ca", () => convertCaCerts(certificates.ca)),
O.map((convertedCerts) => ({
certificates: {
client: convertedCerts.client,
ca: convertedCerts.ca,
},
// Default to `false` if not explicitly set
verifyHost: security.verifyHost ?? false,
verifyPeer: security.verifyPeer ?? false,
}))
)
),
// If no certificates but security object exists, still return verify settings
O.alt(() =>
O.some({
verifyHost: security.verifyHost ?? false,
verifyPeer: security.verifyPeer ?? false,
})
)
O.chain((certificates) => {
const clientCert = convertClientCert(certificates.client)
const caCerts = convertCaCerts(certificates.ca)
// Include if at least one certificate exists
return O.isSome(clientCert) || O.isSome(caCerts)
? O.some({
...(O.isSome(clientCert) ? { client: clientCert.value } : {}),
...(O.isSome(caCerts) ? { ca: caCerts.value } : {}),
})
: O.none
})
)
return O.some({
...(O.isSome(certificatesOption)
? { certificates: certificatesOption.value }
: {}),
// Default to `false` if not explicitly set,
// if no certificates but security object exists, still return verify settings
verifyHost: security.verifyHost ?? false,
verifyPeer: security.verifyPeer ?? false,
})
}),
// If no security object at all, return default settings
O.alt(() =>

View file

@ -48,11 +48,13 @@ export function GistSource(metadata: {
loading: metadata.isLoading?.value,
}))
}
const fetchGistFromUrl = async (url: string) => {
// Extract the gist ID from the URL (eg. https://gist.github.com/username/gistID/...)
const gistID = url.split("/")[4]
const { response } = interceptorService.execute({
id: Date.now(),
url: `https://api.github.com/gists/${url.split("/").pop()}`,
url: `https://api.github.com/gists/${gistID}`,
method: "GET",
version: "HTTP/1.1",
headers: {
@ -69,7 +71,7 @@ const fetchGistFromUrl = async (url: string) => {
const responsePayload = parseBodyAsJSON<unknown>(res.right.body)
if (O.isSome(responsePayload)) {
return E.right(responsePayload)
return E.right(responsePayload.value)
}
return E.left("REQUEST_FAILED")

View file

@ -745,7 +745,9 @@ const parseOpenAPIUrl = (
**/
if (objectHasProperty(doc, "swagger")) {
return `${doc.host}${doc.basePath}`
const { host = "<<baseUrl>>", basePath = "" } =
doc satisfies OpenAPIV2.Document
return `${host}${basePath}`
}
/**

View file

@ -13,6 +13,8 @@ import { getService } from "./dioc"
import FALLBACK_LANG_MESSAGES from "../../locales/en.json"
import messages from "@intlify/unplugin-vue-i18n/messages"
/*
In context of this file, we have 2 main kinds of things.
1. Locale -> A locale is termed as the i18n entries present in the /locales folder
@ -140,6 +142,7 @@ export default <HoppModule>{
fallbackLocale: "en",
legacy: false,
allowComposition: true,
messages,
})
app.use(i18n)

View file

@ -340,13 +340,13 @@ export class ProxyKernelInterceptorService
// NOTE: This should be conditional but seems to be hit always,
// see std/interceptor/proxy.ts for more info. Also see the above similar note.
if (parsedProxyResponse.isBinary) {
const decodedData = decodeB64StringToArrayBuffer(
parsedProxyResponse.data
const decodedData = new Uint8Array(
decodeB64StringToArrayBuffer(parsedProxyResponse.data)
)
// NOTE: This is also for backwards compat,
// better solution would be to ask for raw bytes from proxyscotch.
const jsonResult = parseBytesToJSON(new Uint8Array(decodedData))
const jsonResult = parseBytesToJSON(decodedData)
if (O.isSome(jsonResult)) {
return E.right({
@ -382,7 +382,7 @@ export class ProxyKernelInterceptorService
statusText: parsedProxyResponse.statusText,
headers: parsedProxyResponse.headers,
body: {
body: parsedProxyResponse.data,
body: new TextEncoder().encode(parsedProxyResponse.data),
mediaType:
parsedProxyResponse.headers["content-type"] || "text/plain",
},

View file

@ -48,7 +48,7 @@ export class InstanceSwitcherService extends Service<ConnectionState> {
const instance: VendoredInstance = {
type: "vendored",
displayName: "Hoppscotch",
version: "25.2.2",
version: "25.2.3",
}
this.state$.next({
@ -121,7 +121,7 @@ export class InstanceSwitcherService extends Service<ConnectionState> {
const instance: VendoredInstance = {
type: "vendored",
displayName: "Hoppscotch",
version: "25.2.2",
version: "25.2.3",
}
this.state$.next({

View file

@ -303,6 +303,7 @@ const refreshToken = async ({
id: Date.now(),
url: tokenEndpoint,
method: "POST",
version: "HTTP/1.1",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json",

View file

@ -126,6 +126,7 @@ const handleRedirectForAuthCodeOauthFlow = async (localConfig: string) => {
id: Date.now(),
url: decodedLocalConfig.data.tokenEndpoint,
method: "POST",
version: "HTTP/1.1",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json",

View file

@ -154,6 +154,7 @@ const handleRedirectForAuthCodeOauthFlow = async (localConfig: string) => {
id: Date.now(),
url: decodedLocalConfig.data.tokenEndpoint,
method: "POST",
version: "HTTP/1.1",
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json",

View file

@ -1,7 +1,7 @@
{
"name": "hoppscotch-desktop",
"private": true,
"version": "25.2.2",
"version": "25.2.3",
"type": "module",
"scripts": {
"dev": "vite",

View file

@ -188,7 +188,7 @@ checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf"
dependencies = [
"cfg-if",
"crossbeam-utils",
"hashbrown",
"hashbrown 0.14.5",
"lock_api",
"once_cell",
"parking_lot_core",
@ -238,6 +238,12 @@ dependencies = [
"log",
]
[[package]]
name = "equivalent"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "fnv"
version = "1.0.7"
@ -292,6 +298,12 @@ version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
[[package]]
name = "hashbrown"
version = "0.15.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
[[package]]
name = "heck"
version = "0.5.0"
@ -464,6 +476,17 @@ dependencies = [
"icu_properties",
]
[[package]]
name = "indexmap"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058"
dependencies = [
"equivalent",
"hashbrown 0.15.2",
"serde",
]
[[package]]
name = "infer"
version = "0.16.0"
@ -730,6 +753,7 @@ dependencies = [
"env_logger",
"http",
"http-serde",
"indexmap",
"infer",
"lazy_static",
"log",

View file

@ -30,3 +30,4 @@ strum = { version = "0.26.3", features = ["derive"] }
bytes = { version = "1.9.0", features = ["serde"] }
mime = "0.3.17"
url = "2.5.4"
indexmap = { version = "2.8.0", features = ["serde"] }

View file

@ -1,5 +1,6 @@
use curl::easy::Easy;
use http::HeaderName;
use indexmap::IndexMap;
use std::{collections::HashMap, path::Path};
use crate::{
@ -26,15 +27,25 @@ impl<'a> ContentHandler<'a> {
);
for (key, value) in new_headers {
if let Ok(header_name) = HeaderName::from_bytes(key.as_bytes()) {
let canonical_name = header_name.to_string();
self.headers.insert(canonical_name, value);
let key_lower = key.to_lowercase();
if !self
.headers
.iter()
.any(|(k, _)| k.to_lowercase() == key_lower)
{
let canonical_key = HeaderName::from_bytes(key.as_bytes())
.map(|name| name.to_string())
.unwrap_or_else(|_| key);
tracing::debug!(key = %canonical_key, value = %value, "Adding header");
self.headers.insert(canonical_key, value);
} else {
self.headers.insert(key, value);
tracing::debug!(key = %key, "Skipping duplicate header (case-insensitive match exists)");
}
}
tracing::info!(merged_headers = ?self.headers, "Headers merged");
tracing::trace!(merged_headers = ?self.headers, "Headers after merge");
}
#[tracing::instrument(skip(self), level = "debug")]
@ -188,7 +199,7 @@ impl<'a> ContentHandler<'a> {
fn set_form_content(
&mut self,
content: &HashMap<String, Vec<FormValue>>,
content: &IndexMap<String, Vec<FormValue>>,
media_type: &MediaType,
) -> Result<()> {
let mut headers = HashMap::new();
@ -264,7 +275,7 @@ impl<'a> ContentHandler<'a> {
fn set_multipart_content(
&mut self,
content: &HashMap<String, Vec<FormValue>>,
content: &IndexMap<String, Vec<FormValue>>,
media_type: &MediaType,
) -> Result<()> {
self.set_form_content(content, media_type)

View file

@ -1,6 +1,8 @@
use std::collections::HashMap;
use std::str::FromStr;
use curl::easy::{Easy, List};
use http::{HeaderMap, HeaderName, HeaderValue};
use crate::error::{RelayError, Result};
@ -20,19 +22,28 @@ impl<'a> HeadersBuilder<'a> {
return Ok(());
};
let header_count = headers.len();
let mut header_map = HeaderMap::new();
for (key, value) in headers {
if let (Ok(name), Ok(val)) = (HeaderName::from_str(key), HeaderValue::from_str(value)) {
header_map.insert(name, val);
}
}
let header_count = header_map.len();
tracing::info!(header_count, "Building header list");
let list = headers
let list = header_map
.iter()
.map(|(key, value)| {
let key_str = key.as_str();
let value_str = value.to_str().unwrap_or("");
tracing::debug!(
?key,
value_count = value.len(),
?value,
key = ?key_str,
value_count = value_str.len(),
value = ?value_str,
"Processing headers"
);
let header = format!("{key}: {value}");
let header = format!("{}: {}", key_str, value_str);
tracing::debug!(%header, "Adding header");
header
})

View file

@ -2,6 +2,7 @@ use std::collections::HashMap;
use bytes::Bytes;
use http::{Method, StatusCode, Version};
use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
use strum::{Display, EnumString};
use time::OffsetDateTime;
@ -49,9 +50,7 @@ pub enum MediaType {
#[serde(tag = "kind", rename_all = "camelCase")]
pub enum FormValue {
#[serde(rename_all = "camelCase")]
Text {
value: String,
},
Text { value: String },
#[serde(rename_all = "camelCase")]
File {
filename: String,
@ -60,7 +59,7 @@ pub enum FormValue {
},
}
pub type FormData = HashMap<String, Vec<FormValue>>;
pub type FormData = IndexMap<String, Vec<FormValue>>;
#[derive(Debug, Serialize, Deserialize, Clone)]
#[serde(tag = "kind", rename_all = "camelCase")]

File diff suppressed because it is too large Load diff

View file

@ -1949,7 +1949,7 @@ dependencies = [
"futures-core",
"futures-sink",
"http",
"indexmap 2.7.0",
"indexmap 2.8.0",
"slab",
"tokio",
"tokio-util",
@ -2023,7 +2023,7 @@ dependencies = [
[[package]]
name = "hoppscotch-desktop"
version = "25.2.2"
version = "25.2.3"
dependencies = [
"axum",
"portpicker",
@ -2398,9 +2398,9 @@ dependencies = [
[[package]]
name = "indexmap"
version = "2.7.0"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f"
checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058"
dependencies = [
"equivalent",
"hashbrown 0.15.2",
@ -3580,7 +3580,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016"
dependencies = [
"base64 0.22.1",
"indexmap 2.7.0",
"indexmap 2.8.0",
"quick-xml 0.32.0",
"serde",
"time",
@ -3956,7 +3956,7 @@ checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "relay"
version = "0.1.1"
source = "git+https://github.com/CuriousCorrelation/relay.git#b744a64c0e40829a44a562e51f9d18b4696d2ba4"
source = "git+https://github.com/CuriousCorrelation/relay.git#78f2360c022e974c34413d68355dcbc625ba1acd"
dependencies = [
"bytes",
"curl",
@ -3964,6 +3964,7 @@ dependencies = [
"env_logger",
"http",
"http-serde",
"indexmap 2.8.0",
"infer",
"lazy_static",
"log",
@ -4385,7 +4386,7 @@ dependencies = [
"chrono",
"hex",
"indexmap 1.9.3",
"indexmap 2.7.0",
"indexmap 2.8.0",
"serde",
"serde_derive",
"serde_json",
@ -5081,7 +5082,7 @@ dependencies = [
[[package]]
name = "tauri-plugin-relay"
version = "0.1.0"
source = "git+https://github.com/CuriousCorrelation/tauri-plugin-relay#124133dd126da3e0ed25ce578420c0ea2671e38e"
source = "git+https://github.com/CuriousCorrelation/tauri-plugin-relay#86e1ccf327e60442c6ae9c2911d9359bf9e32c1b"
dependencies = [
"relay",
"serde",
@ -5511,7 +5512,7 @@ version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [
"indexmap 2.7.0",
"indexmap 2.8.0",
"serde",
"serde_spanned",
"toml_datetime",
@ -5524,7 +5525,7 @@ version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338"
dependencies = [
"indexmap 2.7.0",
"indexmap 2.8.0",
"serde",
"serde_spanned",
"toml_datetime",
@ -6842,7 +6843,7 @@ dependencies = [
"displaydoc",
"flate2",
"hmac",
"indexmap 2.7.0",
"indexmap 2.8.0",
"lzma-rs",
"memchr",
"pbkdf2",

View file

@ -1,6 +1,6 @@
[package]
name = "hoppscotch-desktop"
version = "25.2.2"
version = "25.2.3"
description = "Desktop App for hoppscotch.io"
authors = ["CuriousCorrelation"]
edition = "2021"

View file

@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "Hoppscotch",
"version": "25.2.2",
"version": "25.2.3",
"identifier": "io.hoppscotch.desktop",
"build": {
"beforeDevCommand": "pnpm dev",

View file

@ -5,6 +5,8 @@ export type PluginRequest = Request
export type PluginResponse = Response
import * as E from 'fp-ts/Either'
import * as O from 'fp-ts/Option'
import { pipe } from 'fp-ts/function'
export type Method =
| "GET" // Retrieve resource
@ -495,13 +497,42 @@ export const body = {
}),
}
export const transform = {
text: (content: string): string => content,
json: <T>(content: T): T => content,
xml: (content: string): string => content,
form: (content: FormData): FormData => content,
binary: (content: Uint8Array): Uint8Array => content,
multipart: (content: FormData): FormData => content,
stream: (content: ReadableStream): ReadableStream => content,
urlencoded: (arg: string | Record<string, any>): string =>
pipe(
arg,
(input) => typeof input === 'string'
? O.some(input)
: O.none,
O.getOrElse(() => {
const params = new URLSearchParams()
const obj = arg as Record<string, any>
Object.entries(obj)
.filter(([_, value]) => value !== undefined && value !== null)
.forEach(([key, value]) =>
params.append(key, value.toString())
)
return params.toString()
})
)
}
export const content = {
text: (
content: string,
mediaType?: MediaType.TEXT_PLAIN | MediaType.TEXT_HTML | MediaType.TEXT_CSS | MediaType.TEXT_CSV
): ContentType => ({
kind: "text",
content,
content: transform.text(content),
mediaType: mediaType ?? MediaType.TEXT_PLAIN
}),
@ -510,7 +541,7 @@ export const content = {
mediaType?: MediaType.APPLICATION_JSON | MediaType.APPLICATION_LD_JSON | MediaType.APPLICATION_JSON
): ContentType => ({
kind: "json",
content,
content: transform.json(content),
mediaType: mediaType ?? MediaType.APPLICATION_JSON
}),
@ -519,13 +550,13 @@ export const content = {
mediaType?: MediaType.APPLICATION_XML | MediaType.TEXT_XML
): ContentType => ({
kind: "xml",
content,
content: transform.xml(content),
mediaType: mediaType ?? MediaType.APPLICATION_XML
}),
form: (content: FormData): ContentType => ({
kind: "form",
content,
content: transform.form(content),
mediaType: MediaType.APPLICATION_FORM
}),
@ -535,26 +566,26 @@ export const content = {
filename?: string
): ContentType => ({
kind: "binary",
content,
content: transform.binary(content),
mediaType,
filename
}),
multipart: (content: FormData): ContentType => ({
kind: "multipart",
content,
content: transform.multipart(content),
mediaType: MediaType.MULTIPART_FORM
}),
urlencoded: (content: string): ContentType => ({
urlencoded: (content: string | Record<string, any>): ContentType => ({
kind: "urlencoded",
content,
content: transform.urlencoded(content),
mediaType: MediaType.APPLICATION_FORM
}),
stream: (content: ReadableStream, mediaType: string): ContentType => ({
kind: "stream",
content,
content: transform.stream(content),
mediaType
})
}

View file

@ -51,7 +51,7 @@
"@graphql-codegen/urql-introspection": "2.2.1",
"@graphql-typed-document-node/core": "3.2.0",
"@iconify-json/lucide": "1.1.144",
"@intlify/vite-plugin-vue-i18n": "7.0.0",
"@intlify/unplugin-vue-i18n": "6.0.4",
"@rushstack/eslint-patch": "1.3.3",
"@types/lodash-es": "4.17.10",
"@types/node": "18.18.8",

View file

@ -4,7 +4,7 @@ import { viteStaticCopy as StaticCopy } from "vite-plugin-static-copy"
import generateSitemap from "vite-plugin-pages-sitemap"
import HtmlConfig from "vite-plugin-html-config"
import Vue from "@vitejs/plugin-vue"
import VueI18n from "@intlify/vite-plugin-vue-i18n"
import VueI18n from "@intlify/unplugin-vue-i18n/vite"
import Components from "unplugin-vue-components/vite"
import Icons from "unplugin-icons/vite"
import Inspect from "vite-plugin-inspect"
@ -79,7 +79,7 @@ export default defineConfig({
dirs: "../hoppscotch-common/src/pages",
importMode: "async",
onRoutesGenerated(routes) {
return ((generateSitemap as any) as typeof generateSitemap)({
return (generateSitemap as any as typeof generateSitemap)({
routes,
nuxtStyle: true,
allowRobots: true,
@ -107,10 +107,7 @@ export default defineConfig({
}),
Components({
dts: "../hoppscotch-common/src/components.d.ts",
dirs: [
"../hoppscotch-common/src/components",
"./src/components"
],
dirs: ["../hoppscotch-common/src/components", "./src/components"],
directoryAsNamespace: true,
resolvers: [
IconResolver({

View file

@ -1,7 +1,7 @@
{
"name": "@hoppscotch/selfhost-web",
"private": true,
"version": "2025.2.2",
"version": "2025.2.3",
"type": "module",
"scripts": {
"dev:vite": "vite",
@ -32,12 +32,13 @@
"@hoppscotch/ui": "0.2.1",
"@import-meta-env/unplugin": "0.6.0",
"@tauri-apps/api": "2.1.1",
"@tauri-apps/plugin-shell": "2.0.1",
"@tauri-apps/plugin-dialog": "2.0.1",
"@tauri-apps/plugin-fs": "2.0.2",
"@tauri-apps/plugin-shell": "2.0.1",
"@vueuse/core": "10.5.0",
"axios": "1.7.7",
"buffer": "6.0.3",
"dioc": "3.0.2",
"fp-ts": "2.16.9",
"process": "0.11.10",
"rxjs": "7.8.1",
@ -46,7 +47,6 @@
"verzod": "0.2.4",
"vue": "3.5.12",
"workbox-window": "7.1.0",
"dioc": "3.0.2",
"zod": "3.23.8"
},
"devDependencies": {
@ -59,7 +59,7 @@
"@graphql-codegen/urql-introspection": "3.0.0",
"@graphql-typed-document-node/core": "3.2.0",
"@iconify-json/lucide": "1.2.8",
"@intlify/vite-plugin-vue-i18n": "7.0.0",
"@intlify/unplugin-vue-i18n": "6.0.4",
"@rushstack/eslint-patch": "1.10.4",
"@typescript-eslint/eslint-plugin": "8.9.0",
"@typescript-eslint/parser": "8.9.0",

View file

@ -4,6 +4,7 @@ import fs from "fs"
const envFileContent = Object.entries(process.env)
.filter(([env]) => env.startsWith("VITE_"))
.sort(([envA], [envB]) => envA.localeCompare(envB))
.map(
([env, val]) =>
`${env}=${val.startsWith('"') && val.endsWith('"') ? val : `"${val}"`}`

View file

@ -115,6 +115,7 @@ const recursivelySyncCollections = async (
collection.id = childCollectionId
collection.auth = returnedData.auth
collection.headers = returnedData.headers
parentCollectionID = childCollectionId
removeDuplicateGraphqlCollectionOrFolder(
childCollectionId,

View file

@ -120,6 +120,7 @@ const recursivelySyncCollections = async (
collection._ref_id = returnedData._ref_id ?? generateUniqueRefId("coll")
collection.auth = returnedData.auth
collection.headers = returnedData.headers
parentCollectionID = childCollectionId
removeDuplicateRESTCollectionOrFolder(
childCollectionId,

View file

@ -115,6 +115,7 @@ const recursivelySyncCollections = async (
collection.id = childCollectionId
collection.auth = returnedData.auth
collection.headers = returnedData.headers
parentCollectionID = childCollectionId
removeDuplicateGraphqlCollectionOrFolder(
childCollectionId,

View file

@ -120,6 +120,7 @@ const recursivelySyncCollections = async (
collection._ref_id = returnedData._ref_id ?? generateUniqueRefId("coll")
collection.auth = returnedData.auth
collection.headers = returnedData.headers
parentCollectionID = childCollectionId
removeDuplicateRESTCollectionOrFolder(
childCollectionId,

View file

@ -4,7 +4,7 @@ import { viteStaticCopy as StaticCopy } from "vite-plugin-static-copy"
import generateSitemap from "vite-plugin-pages-sitemap"
import HtmlConfig from "vite-plugin-html-config"
import Vue from "@vitejs/plugin-vue"
import VueI18n from "@intlify/vite-plugin-vue-i18n"
import VueI18n from "@intlify/unplugin-vue-i18n/vite"
import Components from "unplugin-vue-components/vite"
import Icons from "unplugin-icons/vite"
import Inspect from "vite-plugin-inspect"

View file

@ -47,7 +47,7 @@ pub struct Bundle {
impl Bundle {
pub fn new(bundle_version: Option<String>, content: Vec<u8>, signature: Signature, files: Vec<FileEntry>) -> Self {
let metadata = BundleMetadata {
version: "2025.2.2".to_string(),
version: "2025.2.3".to_string(),
created_at: Utc::now(),
signature,
manifest: Manifest { files },

View file

@ -54,7 +54,7 @@ impl Default for ServerConfig {
Self {
port: default_port(),
max_bundle_size: default_max_bundle_size(),
bundle_version: Some("2025.2.2".to_string()),
bundle_version: Some("2025.2.3".to_string()),
csp_directives: None,
signing_key: None,
verifying_key: None,
@ -75,7 +75,7 @@ impl ServerConfig {
Self {
signing_key: Some(key_pair.signing_key),
verifying_key: Some(key_pair.verifying_key),
bundle_version: Some("2025.2.2".to_string()),
bundle_version: Some("2025.2.3".to_string()),
frontend_path,
is_dev: cfg!(debug_assertions),
..Default::default()

View file

@ -1,7 +1,7 @@
{
"name": "hoppscotch-sh-admin",
"private": true,
"version": "2025.2.2",
"version": "2025.2.3",
"type": "module",
"scripts": {
"dev": "pnpm exec npm-run-all -p -l dev:*",
@ -19,7 +19,7 @@
"@graphql-typed-document-node/core": "3.2.0",
"@hoppscotch/ui": "0.2.1",
"@hoppscotch/vue-toasted": "0.1.0",
"@intlify/unplugin-vue-i18n": "5.2.0",
"@intlify/unplugin-vue-i18n": "6.0.4",
"@types/cors": "2.8.17",
"@urql/exchange-auth": "2.2.0",
"@urql/vue": "1.4.0",

View file

@ -34,6 +34,7 @@ function runChildProcessWithPrefix(command, args, prefix) {
const envFileContent = Object.entries(process.env)
.filter(([env]) => env.startsWith('VITE_'))
.sort(([envA], [envB]) => envA.localeCompare(envB))
.map(
([env, val]) =>
`${env}=${val.startsWith('"') && val.endsWith('"') ? val : `"${val}"`}`

View file

@ -14,7 +14,6 @@ declare module 'vue' {
AppSidebar: typeof import('./components/app/Sidebar.vue')['default']
AppToast: typeof import('./components/app/Toast.vue')['default']
DashboardMetricsCard: typeof import('./components/dashboard/MetricsCard.vue')['default']
FallbackComponent: typeof import('./components/FallbackComponent.vue')['default']
HoppButtonPrimary: typeof import('@hoppscotch/ui')['HoppButtonPrimary']
HoppButtonSecondary: typeof import('@hoppscotch/ui')['HoppButtonSecondary']
HoppSmartAnchor: typeof import('@hoppscotch/ui')['HoppSmartAnchor']
@ -43,7 +42,6 @@ declare module 'vue' {
IconLucideInfo: typeof import('~icons/lucide/info')['default']
IconLucideSearch: typeof import('~icons/lucide/search')['default']
IconLucideUser: typeof import('~icons/lucide/user')['default']
IconLucideX: typeof import('~icons/lucide/x')['default']
SettingsAuthProvider: typeof import('./components/settings/AuthProvider.vue')['default']
SettingsConfigurations: typeof import('./components/settings/Configurations.vue')['default']
SettingsDataSharing: typeof import('./components/settings/DataSharing.vue')['default']

View file

@ -770,9 +770,9 @@ importers:
'@iconify-json/lucide':
specifier: 1.2.9
version: 1.2.9
'@intlify/vite-plugin-vue-i18n':
specifier: 7.0.0
version: 7.0.0(vite@5.4.9(@types/node@22.9.3)(sass@1.79.5)(terser@5.34.1))(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))
'@intlify/unplugin-vue-i18n':
specifier: 6.0.4
version: 6.0.4(@vue/compiler-dom@3.5.12)(eslint@8.57.0)(rollup@4.24.0)(typescript@5.3.3)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))(vue@3.5.12(typescript@5.3.3))(webpack-sources@3.2.3)
'@relmify/jest-fp-ts':
specifier: 2.1.1
version: 2.1.1(fp-ts@2.16.9)(io-ts@2.2.21(fp-ts@2.16.9))
@ -1180,7 +1180,7 @@ importers:
dependencies:
'@hoppscotch/plugin-relay':
specifier: github:CuriousCorrelation/tauri-plugin-relay
version: '@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/124133dd126da3e0ed25ce578420c0ea2671e38e'
version: '@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/86e1ccf327e60442c6ae9c2911d9359bf9e32c1b'
'@tauri-apps/api':
specifier: 2.1.1
version: 2.1.1
@ -1333,9 +1333,9 @@ importers:
'@iconify-json/lucide':
specifier: 1.1.144
version: 1.1.144
'@intlify/vite-plugin-vue-i18n':
specifier: 7.0.0
version: 7.0.0(vite@4.5.0(@types/node@18.18.8)(sass@1.80.3)(terser@5.34.1))(vue-i18n@10.0.4(vue@3.5.12(typescript@4.9.5)))
'@intlify/unplugin-vue-i18n':
specifier: 6.0.4
version: 6.0.4(@vue/compiler-dom@3.5.12)(eslint@8.47.0)(rollup@2.79.2)(typescript@4.9.5)(vue-i18n@10.0.4(vue@3.5.12(typescript@4.9.5)))(vue@3.5.12(typescript@4.9.5))(webpack-sources@3.2.3)
'@rushstack/eslint-patch':
specifier: 1.3.3
version: 1.3.3
@ -1529,9 +1529,9 @@ importers:
'@iconify-json/lucide':
specifier: 1.2.8
version: 1.2.8
'@intlify/vite-plugin-vue-i18n':
specifier: 7.0.0
version: 7.0.0(vite@5.4.9(@types/node@22.9.3)(sass@1.80.3)(terser@5.34.1))(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))
'@intlify/unplugin-vue-i18n':
specifier: 6.0.4
version: 6.0.4(@vue/compiler-dom@3.5.12)(eslint@8.57.0)(rollup@4.24.0)(typescript@5.3.3)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))(vue@3.5.12(typescript@5.3.3))(webpack-sources@3.2.3)
'@rushstack/eslint-patch':
specifier: 1.10.4
version: 1.10.4
@ -1644,8 +1644,8 @@ importers:
specifier: 0.1.0
version: 0.1.0(vue@3.5.12(typescript@5.6.3))
'@intlify/unplugin-vue-i18n':
specifier: 5.2.0
version: 5.2.0(@vue/compiler-dom@3.5.12)(eslint@9.12.0(jiti@2.3.3))(rollup@4.24.0)(typescript@5.6.3)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)
specifier: 6.0.4
version: 6.0.4(@vue/compiler-dom@3.5.12)(eslint@9.12.0(jiti@2.3.3))(rollup@4.24.0)(typescript@5.6.3)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)
'@types/cors':
specifier: 2.8.17
version: 2.8.17
@ -1809,8 +1809,8 @@ packages:
resolution: {tarball: https://codeload.github.com/CuriousCorrelation/tauri-plugin-appload/tar.gz/1c2e8b19db7f1b6af6d00abb907f15cdc2017298}
version: 0.1.0
'@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/124133dd126da3e0ed25ce578420c0ea2671e38e':
resolution: {tarball: https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/124133dd126da3e0ed25ce578420c0ea2671e38e}
'@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/86e1ccf327e60442c6ae9c2911d9359bf9e32c1b':
resolution: {tarball: https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/86e1ccf327e60442c6ae9c2911d9359bf9e32c1b}
version: 0.1.0
'@alloc/quick-lru@5.2.0':
@ -4125,20 +4125,8 @@ packages:
'@import-meta-env/cli':
optional: true
'@intlify/bundle-utils@3.4.0':
resolution: {integrity: sha512-2UQkqiSAOSPEHMGWlybqWm4G2K0X+FyYho5AwXz6QklSX1EY5EDmOSxZmwscn2qmKBnp6OYsme5kUrnN9xrWzQ==}
engines: {node: '>= 12'}
peerDependencies:
petite-vue-i18n: '*'
vue-i18n: '*'
peerDependenciesMeta:
petite-vue-i18n:
optional: true
vue-i18n:
optional: true
'@intlify/bundle-utils@9.0.0-beta.0':
resolution: {integrity: sha512-xVaMrgbr60fYE1Jkq+k6grs2ZoXqh1EU71RVKkHkKh3KP7T6OYtG1Vbp1T09/jCUbv1GBd8Ir5WdZDyN+e8BpQ==}
'@intlify/bundle-utils@10.0.1':
resolution: {integrity: sha512-WkaXfSevtpgtUR4t8K2M6lbR7g03mtOxFeh+vXp5KExvPqS12ppaRj1QxzwRuRI5VUto54A22BjKoBMLyHILWQ==}
engines: {node: '>= 18'}
peerDependencies:
petite-vue-i18n: '*'
@ -4157,20 +4145,20 @@ packages:
resolution: {integrity: sha512-AFbhEo10DP095/45EauinQJ5hJ3rJUmuuqltGguvc3WsvezZN+g8qNHLGWKu60FHQVizMrQY7VJ+zVlBXlQQkQ==}
engines: {node: '>= 16'}
'@intlify/message-compiler@11.0.0-rc.1':
resolution: {integrity: sha512-TGw2uBfuTFTegZf/BHtUQBEKxl7Q/dVGLoqRIdw8lFsp9g/53sYn5iD+0HxIzdYjbWL6BTJMXCPUHp9PxDTRPw==}
'@intlify/message-compiler@11.1.2':
resolution: {integrity: sha512-T/xbNDzi+Yv0Qn2Dfz2CWCAJiwNgU5d95EhhAEf4YmOgjCKktpfpiUSmLcBvK1CtLpPQ85AMMQk/2NCcXnNj1g==}
engines: {node: '>= 16'}
'@intlify/shared@10.0.4':
resolution: {integrity: sha512-ukFn0I01HsSgr3VYhYcvkTCLS7rGa0gw4A4AMpcy/A9xx/zRJy7PS2BElMXLwUazVFMAr5zuiTk3MQeoeGXaJg==}
engines: {node: '>= 16'}
'@intlify/shared@11.0.0-rc.1':
resolution: {integrity: sha512-8tR1xe7ZEbkabTuE/tNhzpolygUn9OaYp9yuYAF4MgDNZg06C3Qny80bes2/e9/Wm3aVkPUlCw6WgU7mQd0yEg==}
'@intlify/shared@11.1.2':
resolution: {integrity: sha512-dF2iMMy8P9uKVHV/20LA1ulFLL+MKSbfMiixSmn6fpwqzvix38OIc7ebgnFbBqElvghZCW9ACtzKTGKsTGTWGA==}
engines: {node: '>= 16'}
'@intlify/unplugin-vue-i18n@5.2.0':
resolution: {integrity: sha512-pmRiPY2Nj9mmSrixT69aO45XxGUr5fDBy/IIw4ajLlDTJm5TSmQKA5YNdsH0uxVDCPWy5tlQrF18hkDwI7UJvg==}
'@intlify/unplugin-vue-i18n@6.0.4':
resolution: {integrity: sha512-QjNhbw7LkPe2vvoO9uDuq/omnHJg5dQUH9YViu+68+puM2ZQnk0sQDyWxnWLZ8+AiB+wDDOfW23t26VupLbiow==}
engines: {node: '>= 18'}
peerDependencies:
petite-vue-i18n: '*'
@ -4182,30 +4170,14 @@ packages:
vue-i18n:
optional: true
'@intlify/vite-plugin-vue-i18n@7.0.0':
resolution: {integrity: sha512-2TbDOQ8XD+vkc0s5OFmr+IY/k4mYMC7pzvx0xGQn+cU/ev314+yi7Z7N7rWcBgiYk1WOUalbGSo3d4nJDxOOyw==}
engines: {node: '>= 14.6'}
deprecated: This plugin support until Vite 3. If you would like to use on Vite 4, please use @intlify/unplugin-vue-i18n
peerDependencies:
petite-vue-i18n: '*'
vite: ^2.9.0 || ^3.0.0
vue-i18n: '*'
peerDependenciesMeta:
petite-vue-i18n:
optional: true
vite:
optional: true
vue-i18n:
optional: true
'@intlify/vue-i18n-extensions@7.0.0':
resolution: {integrity: sha512-MtvfJnb4aklpCU5Q/dkWkBT/vGsp3qERiPIwtTq5lX4PCLHtUprAJZp8wQj5ZcwDaFCU7+yVMjYbeXpIf927cA==}
'@intlify/vue-i18n-extensions@8.0.0':
resolution: {integrity: sha512-w0+70CvTmuqbskWfzeYhn0IXxllr6mU+IeM2MU0M+j9OW64jkrvqY+pYFWrUnIIC9bEdij3NICruicwd5EgUuQ==}
engines: {node: '>= 18'}
peerDependencies:
'@intlify/shared': ^9.0.0 || ^10.0.0
'@intlify/shared': ^9.0.0 || ^10.0.0 || ^11.0.0
'@vue/compiler-dom': ^3.0.0
vue: 3.5.12
vue-i18n: ^9.0.0 || ^10.0.0
vue-i18n: ^9.0.0 || ^10.0.0 || ^11.0.0
peerDependenciesMeta:
'@intlify/shared':
optional: true
@ -5649,6 +5621,10 @@ packages:
resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==}
engines: {node: ^18.18.0 || >=20.0.0}
'@typescript-eslint/scope-manager@8.26.1':
resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/scope-manager@8.8.1':
resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@ -5703,6 +5679,10 @@ packages:
resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==}
engines: {node: ^18.18.0 || >=20.0.0}
'@typescript-eslint/types@8.26.1':
resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/types@8.8.1':
resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@ -5729,6 +5709,12 @@ packages:
typescript:
optional: true
'@typescript-eslint/typescript-estree@8.26.1':
resolution: {integrity: sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <5.9.0'
'@typescript-eslint/typescript-estree@8.8.1':
resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@ -5779,6 +5765,10 @@ packages:
resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==}
engines: {node: ^18.18.0 || >=20.0.0}
'@typescript-eslint/visitor-keys@8.26.1':
resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/visitor-keys@8.8.1':
resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@ -7817,20 +7807,12 @@ packages:
resolution: {integrity: sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint-utils@2.1.0:
resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==}
engines: {node: '>=6'}
eslint-visitor-keys@1.3.0:
resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
engines: {node: '>=4'}
eslint-visitor-keys@3.4.3:
resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
eslint-visitor-keys@4.1.0:
resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==}
eslint-visitor-keys@4.2.0:
resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
eslint@8.47.0:
@ -7859,10 +7841,6 @@ packages:
resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
espree@6.2.1:
resolution: {integrity: sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==}
engines: {node: '>=6.0.0'}
espree@9.6.1:
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -9235,10 +9213,6 @@ packages:
engines: {node: '>=6'}
hasBin: true
jsonc-eslint-parser@1.4.1:
resolution: {integrity: sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==}
engines: {node: '>=8.10.0'}
jsonc-eslint-parser@2.4.0:
resolution: {integrity: sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@ -11835,6 +11809,12 @@ packages:
peerDependencies:
typescript: '>=4.2.0'
ts-api-utils@2.0.1:
resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==}
engines: {node: '>=18.12'}
peerDependencies:
typescript: '>=4.8.4'
ts-essentials@10.0.2:
resolution: {integrity: sha512-Xwag0TULqriaugXqVdDiGZ5wuZpqABZlpwQ2Ho4GDyiu/R2Xjkp/9+zcFxL7uzeLl/QCPrflnvpVYyS3ouT7Zw==}
peerDependencies:
@ -13141,9 +13121,6 @@ packages:
yaml-ast-parser@0.0.43:
resolution: {integrity: sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==}
yaml-eslint-parser@0.3.2:
resolution: {integrity: sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==}
yaml-eslint-parser@1.2.3:
resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==}
engines: {node: ^14.17.0 || >=16.0.0}
@ -13236,7 +13213,7 @@ snapshots:
dependencies:
'@tauri-apps/api': 2.1.1
'@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/124133dd126da3e0ed25ce578420c0ea2671e38e':
'@CuriousCorrelation/plugin-relay@https://codeload.github.com/CuriousCorrelation/tauri-plugin-relay/tar.gz/86e1ccf327e60442c6ae9c2911d9359bf9e32c1b':
dependencies:
'@tauri-apps/api': 2.1.1
@ -16247,35 +16224,43 @@ snapshots:
transitivePeerDependencies:
- webpack-sources
'@intlify/bundle-utils@3.4.0(vue-i18n@10.0.4(vue@3.5.12(typescript@4.9.5)))':
'@intlify/bundle-utils@10.0.1(vue-i18n@10.0.4(vue@3.5.12(typescript@4.9.5)))':
dependencies:
'@intlify/message-compiler': 11.0.0-rc.1
'@intlify/shared': 11.0.0-rc.1
jsonc-eslint-parser: 1.4.1
source-map: 0.6.1
yaml-eslint-parser: 0.3.2
optionalDependencies:
vue-i18n: 10.0.4(vue@3.5.12(typescript@4.9.5))
'@intlify/bundle-utils@3.4.0(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))':
dependencies:
'@intlify/message-compiler': 11.0.0-rc.1
'@intlify/shared': 11.0.0-rc.1
jsonc-eslint-parser: 1.4.1
source-map: 0.6.1
yaml-eslint-parser: 0.3.2
optionalDependencies:
vue-i18n: 10.0.4(vue@3.5.12(typescript@5.3.3))
'@intlify/bundle-utils@9.0.0-beta.0(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))':
dependencies:
'@intlify/message-compiler': 11.0.0-rc.1
'@intlify/shared': 11.0.0-rc.1
acorn: 8.12.1
'@intlify/message-compiler': 11.1.2
'@intlify/shared': 11.1.2
acorn: 8.14.0
escodegen: 2.1.0
estree-walker: 2.0.2
jsonc-eslint-parser: 2.4.0
mlly: 1.7.2
mlly: 1.7.4
source-map-js: 1.2.1
yaml-eslint-parser: 1.2.3
optionalDependencies:
vue-i18n: 10.0.4(vue@3.5.12(typescript@4.9.5))
'@intlify/bundle-utils@10.0.1(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))':
dependencies:
'@intlify/message-compiler': 11.1.2
'@intlify/shared': 11.1.2
acorn: 8.14.0
escodegen: 2.1.0
estree-walker: 2.0.2
jsonc-eslint-parser: 2.4.0
mlly: 1.7.4
source-map-js: 1.2.1
yaml-eslint-parser: 1.2.3
optionalDependencies:
vue-i18n: 10.0.4(vue@3.5.12(typescript@5.3.3))
'@intlify/bundle-utils@10.0.1(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))':
dependencies:
'@intlify/message-compiler': 11.1.2
'@intlify/shared': 11.1.2
acorn: 8.14.0
escodegen: 2.1.0
estree-walker: 2.0.2
jsonc-eslint-parser: 2.4.0
mlly: 1.7.4
source-map-js: 1.2.1
yaml-eslint-parser: 1.2.3
optionalDependencies:
@ -16291,30 +16276,86 @@ snapshots:
'@intlify/shared': 10.0.4
source-map-js: 1.2.1
'@intlify/message-compiler@11.0.0-rc.1':
'@intlify/message-compiler@11.1.2':
dependencies:
'@intlify/shared': 11.0.0-rc.1
'@intlify/shared': 11.1.2
source-map-js: 1.2.1
'@intlify/shared@10.0.4': {}
'@intlify/shared@11.0.0-rc.1': {}
'@intlify/shared@11.1.2': {}
'@intlify/unplugin-vue-i18n@5.2.0(@vue/compiler-dom@3.5.12)(eslint@9.12.0(jiti@2.3.3))(rollup@4.24.0)(typescript@5.6.3)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)':
'@intlify/unplugin-vue-i18n@6.0.4(@vue/compiler-dom@3.5.12)(eslint@8.47.0)(rollup@2.79.2)(typescript@4.9.5)(vue-i18n@10.0.4(vue@3.5.12(typescript@4.9.5)))(vue@3.5.12(typescript@4.9.5))(webpack-sources@3.2.3)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@2.3.3))
'@intlify/bundle-utils': 9.0.0-beta.0(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))
'@intlify/shared': 11.0.0-rc.1
'@intlify/vue-i18n-extensions': 7.0.0(@intlify/shared@11.0.0-rc.1)(@vue/compiler-dom@3.5.12)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))
'@rollup/pluginutils': 5.1.2(rollup@4.24.0)
'@typescript-eslint/scope-manager': 7.18.0
'@typescript-eslint/typescript-estree': 7.18.0(typescript@5.6.3)
debug: 4.3.7
'@eslint-community/eslint-utils': 4.4.0(eslint@8.47.0)
'@intlify/bundle-utils': 10.0.1(vue-i18n@10.0.4(vue@3.5.12(typescript@4.9.5)))
'@intlify/shared': 11.1.2
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.12)(vue-i18n@10.0.4(vue@3.5.12(typescript@4.9.5)))(vue@3.5.12(typescript@4.9.5))
'@rollup/pluginutils': 5.1.2(rollup@2.79.2)
'@typescript-eslint/scope-manager': 8.26.1
'@typescript-eslint/typescript-estree': 8.26.1(typescript@4.9.5)
debug: 4.4.0
fast-glob: 3.3.2
js-yaml: 4.1.0
json5: 2.2.3
pathe: 1.1.2
picocolors: 1.1.0
picocolors: 1.1.1
source-map-js: 1.2.1
unplugin: 1.14.1(webpack-sources@3.2.3)
vue: 3.5.12(typescript@4.9.5)
optionalDependencies:
vue-i18n: 10.0.4(vue@3.5.12(typescript@4.9.5))
transitivePeerDependencies:
- '@vue/compiler-dom'
- eslint
- rollup
- supports-color
- typescript
- webpack-sources
'@intlify/unplugin-vue-i18n@6.0.4(@vue/compiler-dom@3.5.12)(eslint@8.57.0)(rollup@4.24.0)(typescript@5.3.3)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))(vue@3.5.12(typescript@5.3.3))(webpack-sources@3.2.3)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
'@intlify/bundle-utils': 10.0.1(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))
'@intlify/shared': 11.1.2
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.12)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))(vue@3.5.12(typescript@5.3.3))
'@rollup/pluginutils': 5.1.2(rollup@4.24.0)
'@typescript-eslint/scope-manager': 8.26.1
'@typescript-eslint/typescript-estree': 8.26.1(typescript@5.3.3)
debug: 4.4.0
fast-glob: 3.3.2
js-yaml: 4.1.0
json5: 2.2.3
pathe: 1.1.2
picocolors: 1.1.1
source-map-js: 1.2.1
unplugin: 1.14.1(webpack-sources@3.2.3)
vue: 3.5.12(typescript@5.3.3)
optionalDependencies:
vue-i18n: 10.0.4(vue@3.5.12(typescript@5.3.3))
transitivePeerDependencies:
- '@vue/compiler-dom'
- eslint
- rollup
- supports-color
- typescript
- webpack-sources
'@intlify/unplugin-vue-i18n@6.0.4(@vue/compiler-dom@3.5.12)(eslint@9.12.0(jiti@2.3.3))(rollup@4.24.0)(typescript@5.6.3)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))(webpack-sources@3.2.3)':
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0(jiti@2.3.3))
'@intlify/bundle-utils': 10.0.1(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))
'@intlify/shared': 11.1.2
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.12)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))
'@rollup/pluginutils': 5.1.2(rollup@4.24.0)
'@typescript-eslint/scope-manager': 8.26.1
'@typescript-eslint/typescript-estree': 8.26.1(typescript@5.6.3)
debug: 4.4.0
fast-glob: 3.3.2
js-yaml: 4.1.0
json5: 2.2.3
pathe: 1.1.2
picocolors: 1.1.1
source-map-js: 1.2.1
unplugin: 1.14.1(webpack-sources@3.2.3)
vue: 3.5.12(typescript@5.6.3)
@ -16328,53 +16369,29 @@ snapshots:
- typescript
- webpack-sources
'@intlify/vite-plugin-vue-i18n@7.0.0(vite@4.5.0(@types/node@18.18.8)(sass@1.80.3)(terser@5.34.1))(vue-i18n@10.0.4(vue@3.5.12(typescript@4.9.5)))':
dependencies:
'@intlify/bundle-utils': 3.4.0(vue-i18n@10.0.4(vue@3.5.12(typescript@4.9.5)))
'@intlify/shared': 11.0.0-rc.1
'@rollup/pluginutils': 4.2.1
debug: 4.3.7
fast-glob: 3.3.2
source-map: 0.6.1
optionalDependencies:
vite: 4.5.0(@types/node@18.18.8)(sass@1.80.3)(terser@5.34.1)
vue-i18n: 10.0.4(vue@3.5.12(typescript@4.9.5))
transitivePeerDependencies:
- supports-color
'@intlify/vite-plugin-vue-i18n@7.0.0(vite@5.4.9(@types/node@22.9.3)(sass@1.79.5)(terser@5.34.1))(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))':
dependencies:
'@intlify/bundle-utils': 3.4.0(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))
'@intlify/shared': 11.0.0-rc.1
'@rollup/pluginutils': 4.2.1
debug: 4.3.7
fast-glob: 3.3.2
source-map: 0.6.1
optionalDependencies:
vite: 5.4.9(@types/node@22.9.3)(sass@1.79.5)(terser@5.34.1)
vue-i18n: 10.0.4(vue@3.5.12(typescript@5.3.3))
transitivePeerDependencies:
- supports-color
'@intlify/vite-plugin-vue-i18n@7.0.0(vite@5.4.9(@types/node@22.9.3)(sass@1.80.3)(terser@5.34.1))(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))':
dependencies:
'@intlify/bundle-utils': 3.4.0(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))
'@intlify/shared': 11.0.0-rc.1
'@rollup/pluginutils': 4.2.1
debug: 4.3.7
fast-glob: 3.3.2
source-map: 0.6.1
optionalDependencies:
vite: 5.4.9(@types/node@22.9.3)(sass@1.80.3)(terser@5.34.1)
vue-i18n: 10.0.4(vue@3.5.12(typescript@5.3.3))
transitivePeerDependencies:
- supports-color
'@intlify/vue-i18n-extensions@7.0.0(@intlify/shared@11.0.0-rc.1)(@vue/compiler-dom@3.5.12)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))':
'@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.12)(vue-i18n@10.0.4(vue@3.5.12(typescript@4.9.5)))(vue@3.5.12(typescript@4.9.5))':
dependencies:
'@babel/parser': 7.25.7
optionalDependencies:
'@intlify/shared': 11.0.0-rc.1
'@intlify/shared': 11.1.2
'@vue/compiler-dom': 3.5.12
vue: 3.5.12(typescript@4.9.5)
vue-i18n: 10.0.4(vue@3.5.12(typescript@4.9.5))
'@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.12)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.3.3)))(vue@3.5.12(typescript@5.3.3))':
dependencies:
'@babel/parser': 7.25.7
optionalDependencies:
'@intlify/shared': 11.1.2
'@vue/compiler-dom': 3.5.12
vue: 3.5.12(typescript@5.3.3)
vue-i18n: 10.0.4(vue@3.5.12(typescript@5.3.3))
'@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.12)(vue-i18n@10.0.4(vue@3.5.12(typescript@5.6.3)))(vue@3.5.12(typescript@5.6.3))':
dependencies:
'@babel/parser': 7.25.7
optionalDependencies:
'@intlify/shared': 11.1.2
'@vue/compiler-dom': 3.5.12
vue: 3.5.12(typescript@5.6.3)
vue-i18n: 10.0.4(vue@3.5.12(typescript@5.6.3))
@ -17966,6 +17983,11 @@ snapshots:
'@typescript-eslint/types': 7.18.0
'@typescript-eslint/visitor-keys': 7.18.0
'@typescript-eslint/scope-manager@8.26.1':
dependencies:
'@typescript-eslint/types': 8.26.1
'@typescript-eslint/visitor-keys': 8.26.1
'@typescript-eslint/scope-manager@8.8.1':
dependencies:
'@typescript-eslint/types': 8.8.1
@ -18040,6 +18062,8 @@ snapshots:
'@typescript-eslint/types@7.18.0': {}
'@typescript-eslint/types@8.26.1': {}
'@typescript-eslint/types@8.8.1': {}
'@typescript-eslint/types@8.9.0': {}
@ -18073,17 +18097,44 @@ snapshots:
transitivePeerDependencies:
- supports-color
'@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.3)':
'@typescript-eslint/typescript-estree@8.26.1(typescript@4.9.5)':
dependencies:
'@typescript-eslint/types': 7.18.0
'@typescript-eslint/visitor-keys': 7.18.0
debug: 4.3.7
globby: 11.1.0
'@typescript-eslint/types': 8.26.1
'@typescript-eslint/visitor-keys': 8.26.1
debug: 4.4.0
fast-glob: 3.3.2
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.6.3
ts-api-utils: 1.3.0(typescript@5.6.3)
optionalDependencies:
ts-api-utils: 2.0.1(typescript@4.9.5)
typescript: 4.9.5
transitivePeerDependencies:
- supports-color
'@typescript-eslint/typescript-estree@8.26.1(typescript@5.3.3)':
dependencies:
'@typescript-eslint/types': 8.26.1
'@typescript-eslint/visitor-keys': 8.26.1
debug: 4.4.0
fast-glob: 3.3.2
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.6.3
ts-api-utils: 2.0.1(typescript@5.3.3)
typescript: 5.3.3
transitivePeerDependencies:
- supports-color
'@typescript-eslint/typescript-estree@8.26.1(typescript@5.6.3)':
dependencies:
'@typescript-eslint/types': 8.26.1
'@typescript-eslint/visitor-keys': 8.26.1
debug: 4.4.0
fast-glob: 3.3.2
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.6.3
ts-api-utils: 2.0.1(typescript@5.6.3)
typescript: 5.6.3
transitivePeerDependencies:
- supports-color
@ -18202,6 +18253,11 @@ snapshots:
'@typescript-eslint/types': 7.18.0
eslint-visitor-keys: 3.4.3
'@typescript-eslint/visitor-keys@8.26.1':
dependencies:
'@typescript-eslint/types': 8.26.1
eslint-visitor-keys: 4.2.0
'@typescript-eslint/visitor-keys@8.8.1':
dependencies:
'@typescript-eslint/types': 8.8.1
@ -18974,10 +19030,6 @@ snapshots:
dependencies:
acorn: 8.12.1
acorn-jsx@5.3.2(acorn@7.4.1):
dependencies:
acorn: 7.4.1
acorn-jsx@5.3.2(acorn@8.12.1):
dependencies:
acorn: 8.12.1
@ -18998,7 +19050,8 @@ snapshots:
acorn@6.4.2: {}
acorn@7.4.1: {}
acorn@7.4.1:
optional: true
acorn@8.12.1: {}
@ -20923,15 +20976,9 @@ snapshots:
esrecurse: 4.3.0
estraverse: 5.3.0
eslint-utils@2.1.0:
dependencies:
eslint-visitor-keys: 1.3.0
eslint-visitor-keys@1.3.0: {}
eslint-visitor-keys@3.4.3: {}
eslint-visitor-keys@4.1.0: {}
eslint-visitor-keys@4.2.0: {}
eslint@8.47.0:
dependencies:
@ -21038,7 +21085,7 @@ snapshots:
debug: 4.4.0
escape-string-regexp: 4.0.0
eslint-scope: 8.1.0
eslint-visitor-keys: 4.1.0
eslint-visitor-keys: 4.2.0
espree: 10.2.0
esquery: 1.6.0
esutils: 2.0.3
@ -21064,13 +21111,7 @@ snapshots:
dependencies:
acorn: 8.14.0
acorn-jsx: 5.3.2(acorn@8.14.0)
eslint-visitor-keys: 4.1.0
espree@6.2.1:
dependencies:
acorn: 7.4.1
acorn-jsx: 5.3.2(acorn@7.4.1)
eslint-visitor-keys: 1.3.0
eslint-visitor-keys: 4.2.0
espree@9.6.1:
dependencies:
@ -22945,17 +22986,9 @@ snapshots:
json5@2.2.3: {}
jsonc-eslint-parser@1.4.1:
dependencies:
acorn: 7.4.1
eslint-utils: 2.1.0
eslint-visitor-keys: 1.3.0
espree: 6.2.1
semver: 6.3.1
jsonc-eslint-parser@2.4.0:
dependencies:
acorn: 8.12.1
acorn: 8.14.0
eslint-visitor-keys: 3.4.3
espree: 9.6.1
semver: 7.6.3
@ -26335,7 +26368,15 @@ snapshots:
dependencies:
typescript: 5.5.4
ts-api-utils@1.3.0(typescript@5.6.3):
ts-api-utils@2.0.1(typescript@4.9.5):
dependencies:
typescript: 4.9.5
ts-api-utils@2.0.1(typescript@5.3.3):
dependencies:
typescript: 5.3.3
ts-api-utils@2.0.1(typescript@5.6.3):
dependencies:
typescript: 5.6.3
@ -28233,12 +28274,6 @@ snapshots:
yaml-ast-parser@0.0.43: {}
yaml-eslint-parser@0.3.2:
dependencies:
eslint-visitor-keys: 1.3.0
lodash: 4.17.21
yaml: 1.10.2
yaml-eslint-parser@1.2.3:
dependencies:
eslint-visitor-keys: 3.4.3