diff --git a/packages/hoppscotch-common/package.json b/packages/hoppscotch-common/package.json index a13b589ea..0f9b45cc9 100644 --- a/packages/hoppscotch-common/package.json +++ b/packages/hoppscotch-common/package.json @@ -41,6 +41,7 @@ "@hoppscotch/ui": "0.2.0", "@hoppscotch/vue-toasted": "0.1.0", "@lezer/highlight": "1.2.0", + "@shopify/lang-jsonc": "1.0.0", "@unhead/vue": "1.8.8", "@urql/core": "4.2.0", "@urql/devtools": "2.0.3", diff --git a/packages/hoppscotch-common/src/components/http/RawBody.vue b/packages/hoppscotch-common/src/components/http/RawBody.vue index 35532f615..57f6b67ae 100644 --- a/packages/hoppscotch-common/src/components/http/RawBody.vue +++ b/packages/hoppscotch-common/src/components/http/RawBody.vue @@ -99,7 +99,7 @@ import { pluckRef } from "@composables/ref" import { useI18n } from "@composables/i18n" import { useToast } from "@composables/toast" import { isJSONContentType } from "~/helpers/utils/contenttypes" -import jsonLinter from "~/helpers/editor/linting/json" +import jsoncLinter from "~/helpers/editor/linting/jsonc" import { readFileAsText } from "~/helpers/functional/files" import xmlFormat from "xml-formatter" import { useNestedSetting } from "~/composables/settings" @@ -140,7 +140,7 @@ const rawInputEditorLang = computed(() => getEditorLangForMimeType(body.value.contentType) ) const langLinter = computed(() => - isJSONContentType(body.value.contentType) ? jsonLinter : null + isJSONContentType(body.value.contentType) ? jsoncLinter : null ) const WRAP_LINES = useNestedSetting("WRAP_LINES", "httpRequestBody") diff --git a/packages/hoppscotch-common/src/composables/codemirror.ts b/packages/hoppscotch-common/src/composables/codemirror.ts index f4c3a88dd..bef8141b4 100644 --- a/packages/hoppscotch-common/src/composables/codemirror.ts +++ b/packages/hoppscotch-common/src/composables/codemirror.ts @@ -25,7 +25,7 @@ import { linter } from "@codemirror/lint" import { watch, ref, Ref, onMounted, onBeforeUnmount } from "vue" import { javascriptLanguage } from "@codemirror/lang-javascript" import { xmlLanguage } from "@codemirror/lang-xml" -import { jsonLanguage } from "@codemirror/lang-json" +import { jsoncLanguage } from "@shopify/lang-jsonc" import { GQLLanguage } from "@hoppscotch/codemirror-lang-graphql" import { html } from "@codemirror/legacy-modes/mode/xml" import { shell } from "@codemirror/legacy-modes/mode/shell" @@ -51,6 +51,7 @@ import { HoppPredefinedVariablesPlugin } from "~/helpers/editor/extensions/HoppP type ExtendedEditorConfig = { mode: string + useLang: boolean placeholder: string readOnly: boolean lineWrapping: boolean @@ -158,7 +159,7 @@ const hoppLang = ( const getLanguage = (langMime: string): Language | null => { if (isJSONContentType(langMime)) { - return jsonLanguage + return jsoncLanguage } else if (langMime === "application/javascript") { return javascriptLanguage } else if (langMime === "graphql") { @@ -227,6 +228,8 @@ export function useCodemirror( // Set default value for contextMenuEnabled if not provided options.contextMenuEnabled = options.contextMenuEnabled ?? true + options.extendedEditorConfig.useLang = + options.extendedEditorConfig.useLang ?? true const additionalExts = new Compartment() const language = new Compartment() @@ -371,7 +374,9 @@ export function useCodemirror( ), language.of( getEditorLanguage( - options.extendedEditorConfig.mode ?? "", + options.extendedEditorConfig.useLang + ? (options.extendedEditorConfig.mode as any) ?? "" + : "", options.linter ?? undefined, options.completer ?? undefined ) @@ -480,7 +485,9 @@ export function useCodemirror( view.value?.dispatch({ effects: language.reconfigure( getEditorLanguage( - (options.extendedEditorConfig.mode as any) ?? "", + options.extendedEditorConfig.useLang + ? (options.extendedEditorConfig.mode as any) ?? "" + : "", options.linter ?? undefined, options.completer ?? undefined ) diff --git a/packages/hoppscotch-common/src/helpers/editor/linting/jsonc.ts b/packages/hoppscotch-common/src/helpers/editor/linting/jsonc.ts new file mode 100644 index 000000000..ac1bdf55f --- /dev/null +++ b/packages/hoppscotch-common/src/helpers/editor/linting/jsonc.ts @@ -0,0 +1,45 @@ +import { convertIndexToLineCh } from "../utils" +import { LinterDefinition, LinterResult } from "./linter" +import jsoncParse from "~/helpers/jsoncParse" + +const linter: LinterDefinition = (text) => { + try { + jsoncParse(text) + return Promise.resolve([]) + } catch (e: any) { + return Promise.resolve([ + { + from: convertIndexToLineCh(text, e.start), + to: convertIndexToLineCh(text, e.end), + message: e.message, + severity: "error", + }, + ]) + } +} + +/** + * Removes comments from a JSON string. + * @param jsonString The JSON string with comments. + * @returns The JSON string without comments. + */ + +const singleLineCommentPattern = /\/\/.*$/gm +const multiLineCommentPattern = /\/\*[\s\S]*?\*\//gm + +export function removeComments(jsonString: string): string { + // Remove single-line comments + jsonString = jsonString.replace(singleLineCommentPattern, "") + // Remove multi-line comments + jsonString = jsonString.replace(multiLineCommentPattern, "") + + jsonString = removeTrailingCommas(jsonString) + + return jsonString +} + +export function removeTrailingCommas(jsonString: string): string { + return jsonString.replace(/,(?=\s*?[\]}])/g, "") +} + +export default linter diff --git a/packages/hoppscotch-common/src/helpers/jsoncParse.ts b/packages/hoppscotch-common/src/helpers/jsoncParse.ts new file mode 100644 index 000000000..8d398e854 --- /dev/null +++ b/packages/hoppscotch-common/src/helpers/jsoncParse.ts @@ -0,0 +1,425 @@ +/** + * Copyright (c) 2019 GraphQL Contributors + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +/** + * This JSON parser simply walks the input, generating an AST. Use this in lieu + * of JSON.parse if you need character offset parse errors and an AST parse tree + * with location information. + * + * If an error is encountered, a SyntaxError will be thrown, with properties: + * + * - message: string + * - start: int - the start inclusive offset of the syntax error + * - end: int - the end exclusive offset of the syntax error + * + */ +type JSONEOFValue = { + kind: "EOF" + start: number + end: number +} + +type JSONNullValue = { + kind: "Null" + start: number + end: number +} + +type JSONNumberValue = { + kind: "Number" + start: number + end: number + value: number +} + +type JSONStringValue = { + kind: "String" + start: number + end: number + value: string +} + +type JSONBooleanValue = { + kind: "Boolean" + start: number + end: number + value: boolean +} + +type JSONPrimitiveValue = + | JSONNullValue + | JSONEOFValue + | JSONStringValue + | JSONNumberValue + | JSONBooleanValue + +export type JSONObjectValue = { + kind: "Object" + start: number + end: number + // eslint-disable-next-line no-use-before-define + members: JSONObjectMember[] +} + +export type JSONArrayValue = { + kind: "Array" + start: number + end: number + // eslint-disable-next-line no-use-before-define + values: JSONValue[] +} + +export type JSONValue = JSONObjectValue | JSONArrayValue | JSONPrimitiveValue + +export type JSONObjectMember = { + kind: "Member" + start: number + end: number + key: JSONStringValue + value: JSONValue +} + +export default function jsonParse( + str: string +): JSONObjectValue | JSONArrayValue { + string = str + strLen = str.length + start = end = lastEnd = -1 + ch() + lex() // Pass the allowComments flag to lex() + try { + const ast = parseObj() + expect("EOF") + return ast + } catch (e) { + // Try parsing expecting a root array + const ast = parseArr() + expect("EOF") + return ast + } +} + +let string: string +let strLen: number +let start: number +let end: number +let lastEnd: number +let code: number +let kind: string + +function parseObj(): JSONObjectValue { + const nodeStart = start + const members = [] + expect("{") + while (!skip("}")) { + members.push(parseMember()) + if (!skip(",")) { + expect("}") + break + } + } + return { + kind: "Object", + start: nodeStart, + end: lastEnd, + members, + } +} + +function parseMember(): JSONObjectMember { + const nodeStart = start + const key = kind === "String" ? (curToken() as JSONStringValue) : null + expect("String") + expect(":") + const value = parseVal() + return { + kind: "Member", + start: nodeStart, + end: lastEnd, + key: key!, + value, + } +} + +function parseArr(): JSONArrayValue { + const nodeStart = start + const values: JSONValue[] = [] + expect("[") + while (!skip("]")) { + values.push(parseVal()) + if (!skip(",")) { + expect("]") + break + } + } + return { + kind: "Array", + start: nodeStart, + end: lastEnd, + values, + } +} + +function parseVal(): JSONValue { + switch (kind) { + case "[": + return parseArr() + case "{": + return parseObj() + case "String": + case "Number": + case "Boolean": + case "Null": + // eslint-disable-next-line no-case-declarations + const token = curToken() + lex() + return token + } + return expect("Value") as never +} + +function curToken(): JSONPrimitiveValue { + return { + kind: kind as any, + start, + end, + value: JSON.parse(string.slice(start, end)), + } +} + +function expect(str: string) { + if (kind === str) { + lex() + return + } + + let found + if (kind === "EOF") { + found = "[end of file]" + } else if (end - start > 1) { + found = `\`${string.slice(start, end)}\`` + } else { + const match = string.slice(start).match(/^.+?\b/) + found = `\`${match ? match[0] : string[start]}\`` + } + + throw syntaxError(`Expected ${str} but found ${found}.`) +} + +type SyntaxError = { + message: string + start: number + end: number +} + +function syntaxError(message: string): SyntaxError { + return { message, start, end } +} + +function skip(k: string) { + if (kind === k) { + lex() + return true + } +} + +function ch() { + if (end < strLen) { + end++ + code = end === strLen ? 0 : string.charCodeAt(end) + } +} + +function lex() { + lastEnd = end + + // Skip whitespace and comments + while (true) { + // Skip whitespace (space, tab, newline, etc.) + while (code === 9 || code === 10 || code === 13 || code === 32) { + ch() + } + + // Check for single-line comment (//) + if (code === 47 && string.charCodeAt(end + 1) === 47) { + // 47 is '/' + while (code !== 10 && code !== 13 && code !== 0) { + // Skip until newline or EOF + ch() + } + continue // After skipping the comment, recheck for more whitespace/comments + } + + // Check for multi-line comment (/* */) + if (code === 47 && string.charCodeAt(end + 1) === 42) { + // 42 is '*' + ch() // Skip the '*' + ch() // Move past the opening '/*' + while ( + code !== 0 && + !(code === 42 && string.charCodeAt(end + 1) === 47) + ) { + // Look for '*/' + ch() + } + ch() // Skip the '*' + ch() // Move past the closing '*/' + continue // After skipping the comment, recheck for more whitespace/comments + } + + break // Exit loop when no more comments or whitespace + } + + if (code === 0) { + kind = "EOF" + return + } + + start = end + + switch (code) { + // Handle strings, numbers, booleans, null, etc. + case 34: // " + kind = "String" + return readString() + case 45: // - + case 48: // 0 + case 49: // 1 + case 50: // 2 + case 51: // 3 + case 52: // 4 + case 53: // 5 + case 54: // 6 + case 55: // 7 + case 56: // 8 + case 57: // 9 + kind = "Number" + return readNumber() + case 102: // 'f' for "false" + if (string.slice(start, start + 5) === "false") { + end += 4 + ch() + kind = "Boolean" + return + } + break + case 110: // 'n' for "null" + if (string.slice(start, start + 4) === "null") { + end += 3 + ch() + kind = "Null" + return + } + break + case 116: // 't' for "true" + if (string.slice(start, start + 4) === "true") { + end += 3 + ch() + kind = "Boolean" + return + } + break + } + + kind = string[start] + ch() +} + +function readString() { + ch() + while (code !== 34 && code > 31) { + if (code === (92 as any)) { + // \ + ch() + switch (code) { + case 34: // " + case 47: // / + case 92: // \ + case 98: // b + case 102: // f + case 110: // n + case 114: // r + case 116: // t + ch() + break + case 117: // u + ch() + readHex() + readHex() + readHex() + readHex() + break + default: + throw syntaxError("Bad character escape sequence.") + } + } else if (end === strLen) { + throw syntaxError("Unterminated string.") + } else { + ch() + } + } + + if (code === 34) { + ch() + return + } + + throw syntaxError("Unterminated string.") +} + +function readHex() { + if ( + (code >= 48 && code <= 57) || // 0-9 + (code >= 65 && code <= 70) || // A-F + (code >= 97 && code <= 102) // a-f + ) { + return ch() + } + throw syntaxError("Expected hexadecimal digit.") +} + +function readNumber() { + if (code === 45) { + // - + ch() + } + + if (code === 48) { + // 0 + ch() + } else { + readDigits() + } + + if (code === 46) { + // . + ch() + readDigits() + } + + if (code === 69 || code === 101) { + // E e + ch() + if (code === (43 as any) || code === (45 as any)) { + // + - + ch() + } + readDigits() + } +} + +function readDigits() { + if (code < 48 || code > 57) { + // 0 - 9 + throw syntaxError("Expected decimal digit.") + } + do { + ch() + } while (code >= 48 && code <= 57) // 0 - 9 +} diff --git a/packages/hoppscotch-common/src/helpers/utils/EffectiveURL.ts b/packages/hoppscotch-common/src/helpers/utils/EffectiveURL.ts index c1cc5a258..5b5e200b1 100644 --- a/packages/hoppscotch-common/src/helpers/utils/EffectiveURL.ts +++ b/packages/hoppscotch-common/src/helpers/utils/EffectiveURL.ts @@ -27,6 +27,8 @@ import { map } from "rxjs/operators" import { arrayFlatMap, arraySort } from "../functional/array" import { toFormData } from "../functional/formData" import { tupleWithSameKeysToRecord } from "../functional/record" +import { isJSONContentType } from "./contenttypes" +import { removeComments } from "../editor/linting/jsonc" export interface EffectiveHoppRESTRequest extends HoppRESTRequest { /** @@ -379,9 +381,14 @@ export const resolvesEnvsInBody = ( } } + let bodyContent = "" + + if (isJSONContentType(body.contentType)) + bodyContent = removeComments(body.body) + return { contentType: body.contentType, - body: parseTemplateString(body.body ?? "", env.variables, false, true), + body: parseTemplateString(bodyContent, env.variables, false, true), } } @@ -466,8 +473,13 @@ function getFinalBodyFromRequest( ) } + let bodyContent = request.body.body ?? "" + + if (isJSONContentType(request.body.contentType)) + bodyContent = removeComments(request.body.body) + // body can be null if the content-type is not set - return parseBodyEnvVariables(request.body.body ?? "", envVariables) + return parseBodyEnvVariables(bodyContent, envVariables) } /** diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 61e0f1cfd..f0fad8aa0 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 @@ -450,6 +450,9 @@ importers: '@lezer/highlight': specifier: 1.2.0 version: 1.2.0 + '@shopify/lang-jsonc': + specifier: 1.0.0 + version: 1.0.0 '@unhead/vue': specifier: 1.8.8 version: 1.8.8(vue@3.3.9(typescript@5.3.2)) @@ -792,7 +795,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)) @@ -911,7 +914,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 @@ -1095,7 +1098,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) @@ -1104,7 +1107,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)) @@ -1267,7 +1270,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) @@ -1279,7 +1282,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)) @@ -1321,7 +1324,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 @@ -1387,7 +1390,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) @@ -4348,6 +4351,9 @@ packages: '@selderee/plugin-htmlparser2@0.11.0': resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + '@shopify/lang-jsonc@1.0.0': + resolution: {integrity: sha512-Zvj0eerl0pKoY41no0DBayDT44PVkTx0hGuD98t3v2JSzqOcyvuP3HtW/NVi8StTbKPLWObX+gqZ+u+rUR2H3g==} + '@sinclair/typebox@0.24.51': resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} @@ -15988,11 +15994,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 @@ -16918,6 +16924,11 @@ snapshots: domhandler: 5.0.3 selderee: 0.11.0 + '@shopify/lang-jsonc@1.0.0': + dependencies: + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.3.14 + '@sinclair/typebox@0.24.51': {} '@sinclair/typebox@0.27.8': {} @@ -24529,12 +24540,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): @@ -26159,7 +26170,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 @@ -26174,7 +26185,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: @@ -26380,7 +26390,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 @@ -26390,7 +26400,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 @@ -26398,7 +26408,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 @@ -26619,7 +26629,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 @@ -26630,7 +26640,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 @@ -26641,7 +26651,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 @@ -26652,7 +26662,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 @@ -26663,25 +26673,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 @@ -26701,7 +26692,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 @@ -26709,11 +26700,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 @@ -26721,7 +26712,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) @@ -26866,7 +26857,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 @@ -26888,7 +26879,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) @@ -26934,25 +26924,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