feat(common): use jq for JSON response filtering (#5703)

Co-authored-by: James George <25279263+jamesgeorge007@users.noreply.github.com>
This commit is contained in:
Gerard Balaoro 2026-01-15 17:32:56 +08:00 committed by GitHub
parent bbb7fdf819
commit bdc2d33f50
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
34 changed files with 94 additions and 104 deletions

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Reaksie liggaam", "body": "Reaksie liggaam",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Opskrifte", "headers": "Opskrifte",
"html": "HTML", "html": "HTML",
"image": "Beeld", "image": "Beeld",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "صوت", "audio": "صوت",
"body": "Body", "body": "Body",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Headers", "headers": "Headers",
"html": "HTML", "html": "HTML",
"image": "صورة", "image": "صورة",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Cos de resposta", "body": "Cos de resposta",
"filter_response_body": "Filtrar el cos de la resposta JSON (utilitza la sintaxi JSONPath)", "filter_response_body": "Filtrar el cos de la resposta JSON (utilitza la sintaxi jq)",
"headers": "Capçaleres", "headers": "Capçaleres",
"html": "HTML", "html": "HTML",
"image": "Imatge", "image": "Imatge",

View file

@ -1182,7 +1182,7 @@
"body": "响应体", "body": "响应体",
"duplicated": "响应重名", "duplicated": "响应重名",
"duplicate_name_error": "有同名的响应已存在", "duplicate_name_error": "有同名的响应已存在",
"filter_response_body": "筛选JSON响应本体使用JSONPath语法)", "filter_response_body": "筛选JSON响应本体使用jq语法)",
"headers": "响应头", "headers": "响应头",
"request_headers": "请求头", "request_headers": "请求头",
"html": "HTML", "html": "HTML",

View file

@ -625,7 +625,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Tělo odpovědi", "body": "Tělo odpovědi",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Záhlaví", "headers": "Záhlaví",
"html": "HTML", "html": "HTML",
"image": "Obrázek", "image": "Obrázek",

View file

@ -620,7 +620,7 @@
"response": { "response": {
"audio": "Lyd", "audio": "Lyd",
"body": "Svarbesked", "body": "Svarbesked",
"filter_response_body": "Filtrer JSON-svarbesked (bruger JSONPath-syntaks)", "filter_response_body": "Filtrer JSON-svarbesked (bruger jq-syntaks)",
"headers": "Headers", "headers": "Headers",
"html": "HTML", "html": "HTML",
"image": "Billede", "image": "Billede",

View file

@ -727,7 +727,7 @@
"body": "Antworttext", "body": "Antworttext",
"duplicated": "Antwort dupliziert", "duplicated": "Antwort dupliziert",
"duplicate_name_error": "Antwort mit demselben Namen existiert bereits", "duplicate_name_error": "Antwort mit demselben Namen existiert bereits",
"filter_response_body": "JSON-Antwortkörper filtern (verwendet JSONPath-Syntax)", "filter_response_body": "JSON-Antwortkörper filtern (verwendet jq-Syntax)",
"headers": "Header", "headers": "Header",
"html": "HTML", "html": "HTML",
"image": "Bild", "image": "Bild",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Σώμα απόκρισης", "body": "Σώμα απόκρισης",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Κεφαλίδες", "headers": "Κεφαλίδες",
"html": "HTML", "html": "HTML",
"image": "Εικόνα", "image": "Εικόνα",

View file

@ -1202,7 +1202,7 @@
"body": "Response Body", "body": "Response Body",
"duplicated": "Response duplicated", "duplicated": "Response duplicated",
"duplicate_name_error": "Same name response already exists", "duplicate_name_error": "Same name response already exists",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Headers", "headers": "Headers",
"request_headers": "Request Headers", "request_headers": "Request Headers",
"html": "HTML", "html": "HTML",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Cuerpo de respuesta", "body": "Cuerpo de respuesta",
"filter_response_body": "Filtrar el cuerpo de la respuesta JSON (utiliza la sintaxis JSONPath)", "filter_response_body": "Filtrar el cuerpo de la respuesta JSON (utiliza la sintaxis jq)",
"headers": "Encabezados", "headers": "Encabezados",
"html": "HTML", "html": "HTML",
"image": "Imagen", "image": "Imagen",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Vastauselin", "body": "Vastauselin",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Otsikot", "headers": "Otsikot",
"html": "HTML", "html": "HTML",
"image": "Kuva", "image": "Kuva",

View file

@ -930,7 +930,7 @@
"body": "Coprs de la réponse", "body": "Coprs de la réponse",
"duplicated": "Réponse dupliquée", "duplicated": "Réponse dupliquée",
"duplicate_name_error": "Une réponse avec le même nom existe déjà", "duplicate_name_error": "Une réponse avec le même nom existe déjà",
"filter_response_body": "Filtrer le corps de la réponse JSON (utilise la syntaxe JSONPath)", "filter_response_body": "Filtrer le corps de la réponse JSON (utilise la syntaxe jq)",
"headers": "En-têtes", "headers": "En-têtes",
"request_headers": "En-têtes de requête", "request_headers": "En-têtes de requête",
"html": "HTML", "html": "HTML",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "גוף תגובה", "body": "גוף תגובה",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "כותרות", "headers": "כותרות",
"html": "HTML", "html": "HTML",
"image": "תמונה", "image": "תמונה",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Hang", "audio": "Hang",
"body": "Válasz törzse", "body": "Válasz törzse",
"filter_response_body": "JSON-válasz törzsének szűrése (JSONPath szintaxist használ)", "filter_response_body": "JSON-válasz törzsének szűrése (jq szintaxist használ)",
"headers": "Fejlécek", "headers": "Fejlécek",
"html": "HTML", "html": "HTML",
"image": "Kép", "image": "Kép",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Response Body", "body": "Response Body",
"filter_response_body": "Filter body respons JSON (menggunakan sintaks JSONPath)", "filter_response_body": "Filter body respons JSON (menggunakan sintaks jq)",
"headers": "Headers", "headers": "Headers",
"html": "HTML", "html": "HTML",
"image": "Gambar", "image": "Gambar",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Corpo della risposta", "body": "Corpo della risposta",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Intestazioni", "headers": "Intestazioni",
"html": "HTML", "html": "HTML",
"image": "Immagine", "image": "Immagine",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "レスポンスボディ", "body": "レスポンスボディ",
"filter_response_body": "JSONレスポンスボディをフィルタ (JSONPathシンタックスを使用)", "filter_response_body": "JSONレスポンスボディをフィルタ (jqシンタックスを使用)",
"headers": "ヘッダー", "headers": "ヘッダー",
"html": "HTML", "html": "HTML",
"image": "画像", "image": "画像",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "응답 본문", "body": "응답 본문",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "헤더", "headers": "헤더",
"html": "HTML", "html": "HTML",
"image": "이미지", "image": "이미지",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Reactie inhoud", "body": "Reactie inhoud",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Headers", "headers": "Headers",
"html": "HTML", "html": "HTML",
"image": "Afbeelding", "image": "Afbeelding",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Svarkropp", "body": "Svarkropp",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Overskrifter", "headers": "Overskrifter",
"html": "HTML", "html": "HTML",
"image": "Bilde", "image": "Bilde",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Ciało odpowiedzi", "body": "Ciało odpowiedzi",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Nagłówki", "headers": "Nagłówki",
"html": "HTML", "html": "HTML",
"image": "Obraz", "image": "Obraz",

View file

@ -727,7 +727,7 @@
"body": "Corpo de Resposta", "body": "Corpo de Resposta",
"duplicated": "Resposta duplicada", "duplicated": "Resposta duplicada",
"duplicate_name_error": "Já existe uma resposta com o mesmo nome", "duplicate_name_error": "Já existe uma resposta com o mesmo nome",
"filter_response_body": "Filtar corpo de resposta JSON (utiliza sintaxe JSONPath)", "filter_response_body": "Filtar corpo de resposta JSON (utiliza sintaxe jq)",
"headers": "Cabeçalhos", "headers": "Cabeçalhos",
"request_headers": "Cabeçalhos de Requisição", "request_headers": "Cabeçalhos de Requisição",
"html": "HTML", "html": "HTML",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Corpo de Resposta", "body": "Corpo de Resposta",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Cabeçalhos", "headers": "Cabeçalhos",
"html": "HTML", "html": "HTML",
"image": "Imagem", "image": "Imagem",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Corpul de răspuns", "body": "Corpul de răspuns",
"filter_response_body": "Filtrează corpul răspunsului JSON (folosește sintaxa JSONPath)", "filter_response_body": "Filtrează corpul răspunsului JSON (folosește sintaxa jq)",
"headers": "Anteturi", "headers": "Anteturi",
"html": "HTML", "html": "HTML",
"image": "Imagine", "image": "Imagine",

View file

@ -618,7 +618,7 @@
"response": { "response": {
"audio": "Аудио", "audio": "Аудио",
"body": "Тело ответа", "body": "Тело ответа",
"filter_response_body": "Отфильтровать ответ в формате JSON (используется синтаксис JSONPath)", "filter_response_body": "Отфильтровать ответ в формате JSON (используется синтаксис jq)",
"headers": "Заголовки", "headers": "Заголовки",
"html": "HTML", "html": "HTML",
"image": "Изображение", "image": "Изображение",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Тело за одговор", "body": "Тело за одговор",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Заглавља", "headers": "Заглавља",
"html": "ХТМЛ", "html": "ХТМЛ",
"image": "Слика", "image": "Слика",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Svarskommitté", "body": "Svarskommitté",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Filter JSON response body (uses jq syntax)",
"headers": "Rubriker", "headers": "Rubriker",
"html": "HTML", "html": "HTML",
"image": "Bild", "image": "Bild",

View file

@ -618,7 +618,7 @@
"response": { "response": {
"audio": "Ses", "audio": "Ses",
"body": "Yanıt gövdesi", "body": "Yanıt gövdesi",
"filter_response_body": "JSON yanıt gövdesini filtrele (JSONPath sözdizimi kullanır)", "filter_response_body": "JSON yanıt gövdesini filtrele (jq sözdizimi kullanır)",
"headers": "Başlıklar", "headers": "Başlıklar",
"html": "HTML", "html": "HTML",
"image": "Resim", "image": "Resim",

View file

@ -639,7 +639,7 @@
"response": { "response": {
"audio": "音訊", "audio": "音訊",
"body": "回應本體", "body": "回應本體",
"filter_response_body": "篩選 JSON 回應本體 (使用 JSONPath 語法)", "filter_response_body": "篩選 JSON 回應本體 (使用 jq 語法)",
"headers": "回應標頭", "headers": "回應標頭",
"html": "HTML", "html": "HTML",
"image": "影像", "image": "影像",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Audio", "audio": "Audio",
"body": "Орган реагування", "body": "Орган реагування",
"filter_response_body": "Фільтр тіла відповідей JSON (використовує синтаксис JSONPath)", "filter_response_body": "Фільтр тіла відповідей JSON (використовує синтаксис jq)",
"headers": "Заголовки", "headers": "Заголовки",
"html": "HTML", "html": "HTML",
"image": "Зображення", "image": "Зображення",

View file

@ -623,7 +623,7 @@
"response": { "response": {
"audio": "Âm thanh", "audio": "Âm thanh",
"body": "Nội dung Phản hồi", "body": "Nội dung Phản hồi",
"filter_response_body": "Lọc nội dung phản hồi JSON (sử dụng cú pháp JSONPath)", "filter_response_body": "Lọc nội dung phản hồi JSON (sử dụng cú pháp jq)",
"headers": "Headers", "headers": "Headers",
"html": "HTML", "html": "HTML",
"image": "Hình ảnh", "image": "Hình ảnh",

View file

@ -76,10 +76,10 @@
"highlightjs-curl": "1.3.0", "highlightjs-curl": "1.3.0",
"insomnia-importers": "3.6.0", "insomnia-importers": "3.6.0",
"io-ts": "2.2.22", "io-ts": "2.2.22",
"jq-wasm": "1.1.0-jq-1.8.1",
"js-md5": "0.8.3", "js-md5": "0.8.3",
"js-yaml": "4.1.1", "js-yaml": "4.1.1",
"jsonc-parser": "3.3.1", "jsonc-parser": "3.3.1",
"jsonpath-plus": "10.3.0",
"lodash-es": "4.17.22", "lodash-es": "4.17.22",
"lossless-json": "4.3.0", "lossless-json": "4.3.0",
"markdown-it": "14.1.0", "markdown-it": "14.1.0",

View file

@ -118,23 +118,30 @@
</span> </span>
<div <div
v-if="filterResponseError" v-if="filterResponseError"
class="flex items-center justify-center rounded px-2 py-1 text-tiny text-accentContrast" v-tippy="{
theme: 'tooltip',
content: filterResponseError.error,
placement: 'bottom',
}"
role="alert"
aria-live="assertive"
class="flex max-w-[10rem] cursor-help items-center justify-center rounded px-2 py-1 text-tiny text-accentContrast sm:max-w-[16rem]"
:class="{ :class="{
'bg-red-500': 'bg-red-500':
filterResponseError.type === 'JSON_PARSE_FAILED' || filterResponseError.type === 'JSON_PARSE_FAILED' ||
filterResponseError.type === 'JSON_PATH_QUERY_ERROR', filterResponseError.type === 'JSON_QUERY_FAILED',
'bg-amber-500': filterResponseError.type === 'RESPONSE_EMPTY', 'bg-amber-500': filterResponseError.type === 'RESPONSE_EMPTY',
}" }"
> >
<icon-lucide-info class="svg-icons mr-1.5" /> <icon-lucide-info class="svg-icons mr-1.5 flex-shrink-0" />
<span>{{ filterResponseError.error }}</span> <span class="truncate">{{ filterResponseError.error }}</span>
</div> </div>
<HoppButtonSecondary <HoppButtonSecondary
v-if="showResponse" v-if="showResponse"
v-tippy="{ theme: 'tooltip' }" v-tippy="{ theme: 'tooltip' }"
:title="t('app.wiki')" :title="t('app.wiki')"
:icon="IconHelpCircle" :icon="IconHelpCircle"
to="https://github.com/JSONPath-Plus/JSONPath" to="https://jqlang.org/manual/"
blank blank
/> />
</div> </div>
@ -265,7 +272,8 @@ import * as O from "fp-ts/Option"
import * as E from "fp-ts/Either" import * as E from "fp-ts/Either"
import { pipe } from "fp-ts/function" import { pipe } from "fp-ts/function"
import { computed, ref, reactive } from "vue" import { computed, ref, reactive } from "vue"
import { JSONPath } from "jsonpath-plus" import { computedAsync, refDebounced } from "@vueuse/core"
import * as jq from "jq-wasm"
import { useCodemirror } from "@composables/codemirror" import { useCodemirror } from "@composables/codemirror"
import { HoppRESTResponse } from "~/helpers/types/HoppRESTResponse" import { HoppRESTResponse } from "~/helpers/types/HoppRESTResponse"
import jsonParse, { JSONObjectMember, JSONValue } from "~/helpers/jsonParse" import jsonParse, { JSONObjectMember, JSONValue } from "~/helpers/jsonParse"
@ -326,10 +334,11 @@ const isHttpResponse = computed(() => {
const toggleFilter = ref(false) const toggleFilter = ref(false)
const filterQueryText = ref("") const filterQueryText = ref("")
const debouncedFilterQuery = refDebounced(filterQueryText, 300)
type BodyParseError = type BodyParseError =
| { type: "JSON_PARSE_FAILED" } | { type: "JSON_PARSE_FAILED" }
| { type: "JSON_PATH_QUERY_FAILED"; error: Error } | { type: "JSON_QUERY_FAILED"; error: Error }
const responseJsonObject = computed(() => { const responseJsonObject = computed(() => {
if (isHttpResponse.value) { if (isHttpResponse.value) {
@ -362,28 +371,41 @@ const responseName = computed(() => {
const { responseBodyText } = useResponseBody(props.response) const { responseBodyText } = useResponseBody(props.response)
const jsonResponseBodyText = computed(() => { const jsonResponseBodyText = computedAsync(
if (filterQueryText.value.length > 0 && responseJsonObject.value) { async (): Promise<E.Either<BodyParseError, string | object>> => {
return pipe( if (debouncedFilterQuery.value.length > 0 && responseJsonObject.value) {
responseJsonObject.value, if (E.isLeft(responseJsonObject.value)) {
E.chain((parsedJSON) => return responseJsonObject.value
E.tryCatch( }
() =>
JSONPath({ try {
path: filterQueryText.value, const input = JSON.parse(
json: JSON.parse(LJSON.stringify(parsedJSON as any) || "{}"), LJSON.stringify(responseJsonObject.value.right as any) || "{}"
}),
(err): BodyParseError => ({
type: "JSON_PATH_QUERY_FAILED",
error: err as Error,
})
) )
), const { exitCode, stdout, stderr } = await jq.raw(
E.map((result: any) => result as string | object) input,
) debouncedFilterQuery.value
} )
return E.right(responseBodyText.value)
}) if (exitCode !== 0) {
// Extract first line of jq error for user-friendly message
const errorMessage = stderr?.split("\n")[0]?.trim() || "Syntax Error"
throw new Error(errorMessage)
}
return E.right(stdout as string | object)
} catch (err) {
return E.left({
type: "JSON_QUERY_FAILED",
error: err as Error,
})
}
}
return E.right(responseBodyText.value)
},
E.right(responseBodyText.value)
)
const jsonBodyText = computed(() => { const jsonBodyText = computed(() => {
const { responseBodyText } = useResponseBody( const { responseBodyText } = useResponseBody(
@ -395,7 +417,7 @@ const jsonBodyText = computed(() => {
E.getOrElse(() => responseBodyText.value) E.getOrElse(() => responseBodyText.value)
) )
// If the rawValue is already an object (from JSONPath filtering), stringify it directly // If the rawValue is already an object (from JSON filtering), stringify it directly
if (typeof rawValue === "object" && rawValue !== null) { if (typeof rawValue === "object" && rawValue !== null) {
return JSON.stringify(rawValue, null, 2) return JSON.stringify(rawValue, null, 2)
} }
@ -404,7 +426,7 @@ const jsonBodyText = computed(() => {
const stringValue = rawValue as string const stringValue = rawValue as string
// If we're filtering, the string should already be clean JSON (no lossless numbers) // If we're filtering, the string should already be clean JSON (no lossless numbers)
if (filterQueryText.value.length > 0) { if (debouncedFilterQuery.value.length > 0) {
return pipe( return pipe(
stringValue, stringValue,
O.tryCatchK(JSON.parse), O.tryCatchK(JSON.parse),
@ -436,8 +458,8 @@ const filterResponseError = computed(() =>
E.match( E.match(
(e) => { (e) => {
switch (e.type) { switch (e.type) {
case "JSON_PATH_QUERY_FAILED": case "JSON_QUERY_FAILED":
return { type: "JSON_PATH_QUERY_ERROR", error: e.error.message } return { type: "JSON_QUERY_FAILED", error: e.error.message }
case "JSON_PARSE_FAILED": case "JSON_PARSE_FAILED":
return { return {
type: "JSON_PARSE_FAILED", type: "JSON_PARSE_FAILED",

View file

@ -644,6 +644,9 @@ importers:
io-ts: io-ts:
specifier: 2.2.22 specifier: 2.2.22
version: 2.2.22(fp-ts@2.16.11) version: 2.2.22(fp-ts@2.16.11)
jq-wasm:
specifier: 1.1.0-jq-1.8.1
version: 1.1.0-jq-1.8.1
js-md5: js-md5:
specifier: 0.8.3 specifier: 0.8.3
version: 0.8.3 version: 0.8.3
@ -653,9 +656,6 @@ importers:
jsonc-parser: jsonc-parser:
specifier: 3.3.1 specifier: 3.3.1
version: 3.3.1 version: 3.3.1
jsonpath-plus:
specifier: 10.3.0
version: 10.3.0
lodash-es: lodash-es:
specifier: 4.17.22 specifier: 4.17.22
version: 4.17.22 version: 4.17.22
@ -4383,18 +4383,6 @@ packages:
'@jsdevtools/ono@7.1.3': '@jsdevtools/ono@7.1.3':
resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==} resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==}
'@jsep-plugin/assignment@1.3.0':
resolution: {integrity: sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==}
engines: {node: '>= 10.16.0'}
peerDependencies:
jsep: ^0.4.0||^1.0.0
'@jsep-plugin/regex@1.0.4':
resolution: {integrity: sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==}
engines: {node: '>= 10.16.0'}
peerDependencies:
jsep: ^0.4.0||^1.0.0
'@lezer/common@1.3.0': '@lezer/common@1.3.0':
resolution: {integrity: sha512-L9X8uHCYU310o99L3/MpJKYxPzXPOS7S0NmBaM7UO/x2Kb2WbmMLSkfvdr1KxRIFYOpbY0Jhn7CfLSUDzL8arQ==} resolution: {integrity: sha512-L9X8uHCYU310o99L3/MpJKYxPzXPOS7S0NmBaM7UO/x2Kb2WbmMLSkfvdr1KxRIFYOpbY0Jhn7CfLSUDzL8arQ==}
@ -9362,6 +9350,9 @@ packages:
resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==}
engines: {node: '>=10'} engines: {node: '>=10'}
jq-wasm@1.1.0-jq-1.8.1:
resolution: {integrity: sha512-lWfu34lpDFIygOYcL5TzxhZIApDR9iR5XywcVoyUAZ6jlQrj8HKHOKeCcHgUm2dE9RVdbP3eqNAKGLuj+k4seQ==}
js-base64@3.7.8: js-base64@3.7.8:
resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==} resolution: {integrity: sha512-hNngCeKxIUQiEUN3GPJOkz4wF/YvdUdbNL9hsBcMQTkKzboD7T/q3OYOuuPZLUE6dBxSGpwhk5mwuDud7JVAow==}
@ -9391,10 +9382,6 @@ packages:
canvas: canvas:
optional: true optional: true
jsep@1.4.0:
resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==}
engines: {node: '>= 10.16.0'}
jsesc@3.1.0: jsesc@3.1.0:
resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -9444,11 +9431,6 @@ packages:
resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
engines: {'0': node >= 0.2.0} engines: {'0': node >= 0.2.0}
jsonpath-plus@10.3.0:
resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==}
engines: {node: '>=18.0.0'}
hasBin: true
jsonpointer@5.0.1: jsonpointer@5.0.1:
resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -17231,14 +17213,6 @@ snapshots:
'@jsdevtools/ono@7.1.3': {} '@jsdevtools/ono@7.1.3': {}
'@jsep-plugin/assignment@1.3.0(jsep@1.4.0)':
dependencies:
jsep: 1.4.0
'@jsep-plugin/regex@1.0.4(jsep@1.4.0)':
dependencies:
jsep: 1.4.0
'@lezer/common@1.3.0': {} '@lezer/common@1.3.0': {}
'@lezer/generator@1.8.0': '@lezer/generator@1.8.0':
@ -23215,6 +23189,8 @@ snapshots:
joycon@3.1.1: {} joycon@3.1.1: {}
jq-wasm@1.1.0-jq-1.8.1: {}
js-base64@3.7.8: {} js-base64@3.7.8: {}
js-md5@0.8.3: {} js-md5@0.8.3: {}
@ -23260,8 +23236,6 @@ snapshots:
- supports-color - supports-color
- utf-8-validate - utf-8-validate
jsep@1.4.0: {}
jsesc@3.1.0: {} jsesc@3.1.0: {}
json-buffer@3.0.1: {} json-buffer@3.0.1: {}
@ -23302,12 +23276,6 @@ snapshots:
jsonparse@1.3.1: {} jsonparse@1.3.1: {}
jsonpath-plus@10.3.0:
dependencies:
'@jsep-plugin/assignment': 1.3.0(jsep@1.4.0)
'@jsep-plugin/regex': 1.0.4(jsep@1.4.0)
jsep: 1.4.0
jsonpointer@5.0.1: {} jsonpointer@5.0.1: {}
jsonwebtoken@9.0.2: jsonwebtoken@9.0.2: