Просмотр исходного кода

feat: support for comments on `application/json` request body (#4335)

Anwarul Islam 5 месяцев назад
Родитель
Сommit
dcdcdeb1db

+ 1 - 0
packages/hoppscotch-common/package.json

@@ -41,6 +41,7 @@
     "@hoppscotch/ui": "0.2.0",
     "@hoppscotch/ui": "0.2.0",
     "@hoppscotch/vue-toasted": "0.1.0",
     "@hoppscotch/vue-toasted": "0.1.0",
     "@lezer/highlight": "1.2.0",
     "@lezer/highlight": "1.2.0",
+    "@shopify/lang-jsonc": "1.0.0",
     "@unhead/vue": "1.8.8",
     "@unhead/vue": "1.8.8",
     "@urql/core": "4.2.0",
     "@urql/core": "4.2.0",
     "@urql/devtools": "2.0.3",
     "@urql/devtools": "2.0.3",

+ 2 - 2
packages/hoppscotch-common/src/components/http/RawBody.vue

@@ -99,7 +99,7 @@ import { pluckRef } from "@composables/ref"
 import { useI18n } from "@composables/i18n"
 import { useI18n } from "@composables/i18n"
 import { useToast } from "@composables/toast"
 import { useToast } from "@composables/toast"
 import { isJSONContentType } from "~/helpers/utils/contenttypes"
 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 { readFileAsText } from "~/helpers/functional/files"
 import xmlFormat from "xml-formatter"
 import xmlFormat from "xml-formatter"
 import { useNestedSetting } from "~/composables/settings"
 import { useNestedSetting } from "~/composables/settings"
@@ -140,7 +140,7 @@ const rawInputEditorLang = computed(() =>
   getEditorLangForMimeType(body.value.contentType)
   getEditorLangForMimeType(body.value.contentType)
 )
 )
 const langLinter = computed(() =>
 const langLinter = computed(() =>
-  isJSONContentType(body.value.contentType) ? jsonLinter : null
+  isJSONContentType(body.value.contentType) ? jsoncLinter : null
 )
 )
 
 
 const WRAP_LINES = useNestedSetting("WRAP_LINES", "httpRequestBody")
 const WRAP_LINES = useNestedSetting("WRAP_LINES", "httpRequestBody")

+ 11 - 4
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 { watch, ref, Ref, onMounted, onBeforeUnmount } from "vue"
 import { javascriptLanguage } from "@codemirror/lang-javascript"
 import { javascriptLanguage } from "@codemirror/lang-javascript"
 import { xmlLanguage } from "@codemirror/lang-xml"
 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 { GQLLanguage } from "@hoppscotch/codemirror-lang-graphql"
 import { html } from "@codemirror/legacy-modes/mode/xml"
 import { html } from "@codemirror/legacy-modes/mode/xml"
 import { shell } from "@codemirror/legacy-modes/mode/shell"
 import { shell } from "@codemirror/legacy-modes/mode/shell"
@@ -51,6 +51,7 @@ import { HoppPredefinedVariablesPlugin } from "~/helpers/editor/extensions/HoppP
 
 
 type ExtendedEditorConfig = {
 type ExtendedEditorConfig = {
   mode: string
   mode: string
+  useLang: boolean
   placeholder: string
   placeholder: string
   readOnly: boolean
   readOnly: boolean
   lineWrapping: boolean
   lineWrapping: boolean
@@ -158,7 +159,7 @@ const hoppLang = (
 
 
 const getLanguage = (langMime: string): Language | null => {
 const getLanguage = (langMime: string): Language | null => {
   if (isJSONContentType(langMime)) {
   if (isJSONContentType(langMime)) {
-    return jsonLanguage
+    return jsoncLanguage
   } else if (langMime === "application/javascript") {
   } else if (langMime === "application/javascript") {
     return javascriptLanguage
     return javascriptLanguage
   } else if (langMime === "graphql") {
   } else if (langMime === "graphql") {
@@ -227,6 +228,8 @@ export function useCodemirror(
 
 
   // Set default value for contextMenuEnabled if not provided
   // Set default value for contextMenuEnabled if not provided
   options.contextMenuEnabled = options.contextMenuEnabled ?? true
   options.contextMenuEnabled = options.contextMenuEnabled ?? true
+  options.extendedEditorConfig.useLang =
+    options.extendedEditorConfig.useLang ?? true
 
 
   const additionalExts = new Compartment()
   const additionalExts = new Compartment()
   const language = new Compartment()
   const language = new Compartment()
@@ -371,7 +374,9 @@ export function useCodemirror(
       ),
       ),
       language.of(
       language.of(
         getEditorLanguage(
         getEditorLanguage(
-          options.extendedEditorConfig.mode ?? "",
+          options.extendedEditorConfig.useLang
+            ? (options.extendedEditorConfig.mode as any) ?? ""
+            : "",
           options.linter ?? undefined,
           options.linter ?? undefined,
           options.completer ?? undefined
           options.completer ?? undefined
         )
         )
@@ -480,7 +485,9 @@ export function useCodemirror(
       view.value?.dispatch({
       view.value?.dispatch({
         effects: language.reconfigure(
         effects: language.reconfigure(
           getEditorLanguage(
           getEditorLanguage(
-            (options.extendedEditorConfig.mode as any) ?? "",
+            options.extendedEditorConfig.useLang
+              ? (options.extendedEditorConfig.mode as any) ?? ""
+              : "",
             options.linter ?? undefined,
             options.linter ?? undefined,
             options.completer ?? undefined
             options.completer ?? undefined
           )
           )

+ 45 - 0
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([
+      <LinterResult>{
+        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

+ 425 - 0
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
+}

+ 14 - 2
packages/hoppscotch-common/src/helpers/utils/EffectiveURL.ts

@@ -27,6 +27,8 @@ import { map } from "rxjs/operators"
 import { arrayFlatMap, arraySort } from "../functional/array"
 import { arrayFlatMap, arraySort } from "../functional/array"
 import { toFormData } from "../functional/formData"
 import { toFormData } from "../functional/formData"
 import { tupleWithSameKeysToRecord } from "../functional/record"
 import { tupleWithSameKeysToRecord } from "../functional/record"
+import { isJSONContentType } from "./contenttypes"
+import { removeComments } from "../editor/linting/jsonc"
 
 
 export interface EffectiveHoppRESTRequest extends HoppRESTRequest {
 export interface EffectiveHoppRESTRequest extends HoppRESTRequest {
   /**
   /**
@@ -379,9 +381,14 @@ export const resolvesEnvsInBody = (
     }
     }
   }
   }
 
 
+  let bodyContent = ""
+
+  if (isJSONContentType(body.contentType))
+    bodyContent = removeComments(body.body)
+
   return {
   return {
     contentType: body.contentType,
     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
   // body can be null if the content-type is not set
-  return parseBodyEnvVariables(request.body.body ?? "", envVariables)
+  return parseBodyEnvVariables(bodyContent, envVariables)
 }
 }
 
 
 /**
 /**

+ 39 - 64
pnpm-lock.yaml

@@ -380,7 +380,7 @@ importers:
         version: 3.2.5
         version: 3.2.5
       tsup:
       tsup:
         specifier: 8.0.2
         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:
       typescript:
         specifier: 5.3.3
         specifier: 5.3.3
         version: 5.3.3
         version: 5.3.3
@@ -450,6 +450,9 @@ importers:
       '@lezer/highlight':
       '@lezer/highlight':
         specifier: 1.2.0
         specifier: 1.2.0
         version: 1.2.0
         version: 1.2.0
+      '@shopify/lang-jsonc':
+        specifier: 1.0.0
+        version: 1.0.0
       '@unhead/vue':
       '@unhead/vue':
         specifier: 1.8.8
         specifier: 1.8.8
         version: 1.8.8(vue@3.3.9(typescript@5.3.2))
         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)
         version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)
       vite-plugin-checker:
       vite-plugin-checker:
         specifier: 0.6.2
         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:
       vite-plugin-fonts:
         specifier: 0.7.0
         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))
         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
         version: 2.8.4
       ts-jest:
       ts-jest:
         specifier: 27.1.5
         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:
       typescript:
         specifier: 4.9.5
         specifier: 4.9.5
         version: 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)
         version: 0.14.9(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16)
       unplugin-vue-components:
       unplugin-vue-components:
         specifier: 0.21.0
         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:
       vite:
         specifier: 4.5.0
         specifier: 4.5.0
         version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.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))
         version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))
       vite-plugin-inspect:
       vite-plugin-inspect:
         specifier: 0.7.38
         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:
       vite-plugin-pages:
         specifier: 0.26.0
         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))
         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)
         version: 0.17.4(@vue/compiler-sfc@3.3.10)(vue-template-compiler@2.7.16)
       unplugin-vue-components:
       unplugin-vue-components:
         specifier: 0.25.2
         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:
       vite:
         specifier: 4.5.0
         specifier: 4.5.0
         version: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.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))
         version: 1.0.11(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))
       vite-plugin-inspect:
       vite-plugin-inspect:
         specifier: 0.7.42
         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:
       vite-plugin-pages:
         specifier: 0.31.0
         specifier: 0.31.0
         version: 0.31.0(@vue/compiler-sfc@3.3.10)(vite@4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0))
         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))
         version: 0.1.0(vue@3.3.9(typescript@4.9.3))
       '@intlify/unplugin-vue-i18n':
       '@intlify/unplugin-vue-i18n':
         specifier: 1.2.0
         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':
       '@types/cors':
         specifier: 2.8.13
         specifier: 2.8.13
         version: 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)
         version: 0.14.9(@vue/compiler-sfc@3.2.45)(vue-template-compiler@2.7.16)
       unplugin-vue-components:
       unplugin-vue-components:
         specifier: 0.21.0
         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:
       vue:
         specifier: 3.3.9
         specifier: 3.3.9
         version: 3.3.9(typescript@4.9.3)
         version: 3.3.9(typescript@4.9.3)
@@ -4348,6 +4351,9 @@ packages:
   '@selderee/plugin-htmlparser2@0.11.0':
   '@selderee/plugin-htmlparser2@0.11.0':
     resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==}
     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':
   '@sinclair/typebox@0.24.51':
     resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==}
     resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==}
 
 
@@ -15988,11 +15994,11 @@ snapshots:
 
 
   '@intlify/shared@9.8.0': {}
   '@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:
     dependencies:
       '@intlify/bundle-utils': 7.5.1(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))
       '@intlify/bundle-utils': 7.5.1(vue-i18n@9.2.2(vue@3.3.9(typescript@4.9.3)))
       '@intlify/shared': 9.13.1
       '@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
       '@vue/compiler-sfc': 3.3.10
       debug: 4.3.4(supports-color@9.4.0)
       debug: 4.3.4(supports-color@9.4.0)
       fast-glob: 3.3.2
       fast-glob: 3.3.2
@@ -16918,6 +16924,11 @@ snapshots:
       domhandler: 5.0.3
       domhandler: 5.0.3
       selderee: 0.11.0
       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.24.51': {}
 
 
   '@sinclair/typebox@0.27.8': {}
   '@sinclair/typebox@0.27.8': {}
@@ -24529,12 +24540,12 @@ snapshots:
       postcss: 8.4.32
       postcss: 8.4.32
       ts-node: 10.9.1(@swc/core@1.4.2)(@types/node@18.18.8)(typescript@5.3.2)
       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:
     dependencies:
       lilconfig: 3.1.1
       lilconfig: 3.1.1
       yaml: 2.4.2
       yaml: 2.4.2
     optionalDependencies:
     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)
       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):
   postcss-merge-longhand@7.0.2(postcss@8.4.40):
@@ -26159,7 +26170,7 @@ snapshots:
 
 
   ts-interface-checker@0.1.13: {}
   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:
     dependencies:
       bs-logger: 0.2.6
       bs-logger: 0.2.6
       fast-json-stable-stringify: 2.1.0
       fast-json-stable-stringify: 2.1.0
@@ -26174,7 +26185,6 @@ snapshots:
     optionalDependencies:
     optionalDependencies:
       '@babel/core': 7.24.5
       '@babel/core': 7.24.5
       '@types/jest': 27.5.2
       '@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):
   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:
     dependencies:
@@ -26380,7 +26390,7 @@ snapshots:
 
 
   tslib@2.6.2: {}
   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:
     dependencies:
       bundle-require: 4.1.0(esbuild@0.19.12)
       bundle-require: 4.1.0(esbuild@0.19.12)
       cac: 6.7.14
       cac: 6.7.14
@@ -26390,7 +26400,7 @@ snapshots:
       execa: 5.1.1
       execa: 5.1.1
       globby: 11.1.0
       globby: 11.1.0
       joycon: 3.1.1
       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
       resolve-from: 5.0.0
       rollup: 4.17.2
       rollup: 4.17.2
       source-map: 0.8.0-beta.0
       source-map: 0.8.0-beta.0
@@ -26398,7 +26408,7 @@ snapshots:
       tree-kill: 1.2.2
       tree-kill: 1.2.2
     optionalDependencies:
     optionalDependencies:
       '@swc/core': 1.4.2
       '@swc/core': 1.4.2
-      postcss: 8.4.32
+      postcss: 8.4.40
       typescript: 5.3.3
       typescript: 5.3.3
     transitivePeerDependencies:
     transitivePeerDependencies:
       - supports-color
       - supports-color
@@ -26619,7 +26629,7 @@ snapshots:
     transitivePeerDependencies:
     transitivePeerDependencies:
       - supports-color
       - 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:
     dependencies:
       '@antfu/utils': 0.5.2
       '@antfu/utils': 0.5.2
       '@rollup/pluginutils': 4.2.1
       '@rollup/pluginutils': 4.2.1
@@ -26630,7 +26640,7 @@ snapshots:
       magic-string: 0.26.7
       magic-string: 0.26.7
       minimatch: 5.1.6
       minimatch: 5.1.6
       resolve: 1.22.8
       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)
       vue: 3.3.9(typescript@4.9.3)
     optionalDependencies:
     optionalDependencies:
       '@babel/parser': 7.24.5
       '@babel/parser': 7.24.5
@@ -26641,7 +26651,7 @@ snapshots:
       - vite
       - vite
       - webpack
       - 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:
     dependencies:
       '@antfu/utils': 0.5.2
       '@antfu/utils': 0.5.2
       '@rollup/pluginutils': 4.2.1
       '@rollup/pluginutils': 4.2.1
@@ -26652,7 +26662,7 @@ snapshots:
       magic-string: 0.26.7
       magic-string: 0.26.7
       minimatch: 5.1.6
       minimatch: 5.1.6
       resolve: 1.22.8
       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)
       vue: 3.3.9(typescript@4.9.5)
     optionalDependencies:
     optionalDependencies:
       '@babel/parser': 7.24.5
       '@babel/parser': 7.24.5
@@ -26663,25 +26673,6 @@ snapshots:
       - vite
       - vite
       - webpack
       - 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)):
   unplugin-vue-components@0.25.2(@babel/parser@7.24.5)(rollup@4.17.2)(vue@3.3.9(typescript@5.3.2)):
     dependencies:
     dependencies:
       '@antfu/utils': 0.7.7
       '@antfu/utils': 0.7.7
@@ -26701,7 +26692,7 @@ snapshots:
       - rollup
       - rollup
       - supports-color
       - 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:
     dependencies:
       acorn: 8.11.3
       acorn: 8.11.3
       chokidar: 3.6.0
       chokidar: 3.6.0
@@ -26709,11 +26700,11 @@ snapshots:
       webpack-virtual-modules: 0.4.6
       webpack-virtual-modules: 0.4.6
     optionalDependencies:
     optionalDependencies:
       esbuild: 0.20.2
       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)
       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)
       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:
     dependencies:
       acorn: 8.11.3
       acorn: 8.11.3
       chokidar: 3.6.0
       chokidar: 3.6.0
@@ -26721,7 +26712,7 @@ snapshots:
       webpack-virtual-modules: 0.4.6
       webpack-virtual-modules: 0.4.6
     optionalDependencies:
     optionalDependencies:
       esbuild: 0.20.2
       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)
       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)
       webpack: 5.91.0(@swc/core@1.4.2)(esbuild@0.20.2)
 
 
@@ -26866,7 +26857,7 @@ snapshots:
       - supports-color
       - supports-color
       - terser
       - 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:
     dependencies:
       '@babel/code-frame': 7.24.2
       '@babel/code-frame': 7.24.2
       ansi-escapes: 4.3.2
       ansi-escapes: 4.3.2
@@ -26888,7 +26879,6 @@ snapshots:
       vscode-uri: 3.0.8
       vscode-uri: 3.0.8
     optionalDependencies:
     optionalDependencies:
       eslint: 8.57.0
       eslint: 8.57.0
-      meow: 8.1.2
       optionator: 0.9.4
       optionator: 0.9.4
       typescript: 5.3.2
       typescript: 5.3.2
       vue-tsc: 1.8.24(typescript@5.3.2)
       vue-tsc: 1.8.24(typescript@5.3.2)
@@ -26934,25 +26924,10 @@ snapshots:
     dependencies:
     dependencies:
       vite: 4.5.0(@types/node@18.18.8)(sass@1.69.5)(terser@5.31.0)
       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:
     dependencies:
       '@antfu/utils': 0.7.7
       '@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)
       debug: 4.3.4(supports-color@9.4.0)
       error-stack-parser-es: 0.1.1
       error-stack-parser-es: 0.1.1
       fs-extra: 11.2.0
       fs-extra: 11.2.0