]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
chore: Merge branch 'main' into minor
authorEvan You <evan@vuejs.org>
Wed, 7 Aug 2024 10:25:58 +0000 (18:25 +0800)
committerEvan You <evan@vuejs.org>
Wed, 7 Aug 2024 10:25:58 +0000 (18:25 +0800)
22 files changed:
1  2 
CHANGELOG.md
package.json
packages/compiler-core/package.json
packages/compiler-sfc/package.json
packages/dts-test/ref.test-d.ts
packages/dts-test/setupHelpers.test-d.ts
packages/reactivity/src/baseHandlers.ts
packages/reactivity/src/ref.ts
packages/runtime-core/__tests__/apiCreateApp.spec.ts
packages/runtime-core/__tests__/hydration.spec.ts
packages/runtime-core/src/apiInject.ts
packages/runtime-core/src/apiSetupHelpers.ts
packages/runtime-core/src/componentEmits.ts
packages/runtime-core/src/directives.ts
packages/runtime-core/src/helpers/renderSlot.ts
packages/runtime-core/src/hydration.ts
packages/runtime-core/src/index.ts
packages/runtime-core/src/renderer.ts
packages/runtime-dom/__tests__/customElement.spec.ts
packages/runtime-dom/src/helpers/useCssVars.ts
pnpm-lock.yaml
rollup.config.js

diff --cc CHANGELOG.md
index 08328b165d717586a301167c7d66726c3a11b36b,efa8639495887277804e0dd19aaa5ff970e259e5..317b52f5e32479178eaee2d62d28a75d3d43c157
@@@ -1,13 -1,16 +1,26 @@@
+ ## [3.4.36](https://github.com/vuejs/core/compare/v3.4.35...v3.4.36) (2024-08-06)
+ ### Bug Fixes
+ * **compiler-core:** fix expression transform for try...catch block params ([077a1ae](https://github.com/vuejs/core/commit/077a1aeb3c222b729a7e190f46864656ecc65325)), closes [#11465](https://github.com/vuejs/core/issues/11465) [#11467](https://github.com/vuejs/core/issues/11467)
+ * **compiler-core:** properly handle for loop variable declarations in expression transforms ([67bb820](https://github.com/vuejs/core/commit/67bb820904d53480fa37536fc3cb4109a4c6d3e2)), ref [#11467](https://github.com/vuejs/core/issues/11467)
+ * **compiler-ssr:** don't render v-if comments in TransitionGroup + static tag ([#11515](https://github.com/vuejs/core/issues/11515)) ([275354c](https://github.com/vuejs/core/commit/275354caba295a6fb50695b70e97888a33c504e0)), closes [#11514](https://github.com/vuejs/core/issues/11514)
+ * **hydration:** force hydrate custom element dynamic props ([7d473b7](https://github.com/vuejs/core/commit/7d473b7721b423050dba62823b16f3d39e640567)), closes [#7203](https://github.com/vuejs/core/issues/7203) [#8038](https://github.com/vuejs/core/issues/8038)
+ * **ssr:** respect textContent/innerHTML from getSSRProps in optimized SSR output ([79602f9](https://github.com/vuejs/core/commit/79602f9ecd9559954f844774a90286305b13e056)), closes [#8112](https://github.com/vuejs/core/issues/8112)
+ * **types/withDefaults:** ensure default values of type `any` do not include `undefined` ([#11490](https://github.com/vuejs/core/issues/11490)) ([4592b63](https://github.com/vuejs/core/commit/4592b63c6a8a3d69bfe4ac1f9458b4a86a9676a4))
 +# [3.5.0-alpha.5](https://github.com/vuejs/core/compare/v3.4.35...v3.5.0-alpha.5) (2024-07-31)
 +
 +
 +### Features
 +
 +* **hydration:** support suppressing hydration mismatch via data-allow-mismatch ([94fb2b8](https://github.com/vuejs/core/commit/94fb2b8106a66bcca1a3f922a246a29fdd1274b1))
 +* lazy hydration strategies for async components ([#11458](https://github.com/vuejs/core/issues/11458)) ([d14a11c](https://github.com/vuejs/core/commit/d14a11c1cdcee88452f17ce97758743c863958f4))
 +
 +
 +
  ## [3.4.35](https://github.com/vuejs/core/compare/v3.4.34...v3.4.35) (2024-07-31)
  
  
diff --cc package.json
index 196769442d21422eb7758c6cd1befcbb9c4dd316,87f10e911b09bd4e74ecc323022d196df626baab..a8326130b81df4e05343f7f81464f2e744f9a153
      "@rollup/plugin-json": "^6.1.0",
      "@rollup/plugin-node-resolve": "^15.2.3",
      "@rollup/plugin-replace": "5.0.4",
-     "@swc/core": "^1.7.3",
+     "@swc/core": "^1.7.6",
      "@types/hash-sum": "^1.0.2",
-     "@types/node": "^20.14.13",
+     "@types/node": "^20.14.14",
      "@types/semver": "^7.5.8",
 +    "@types/serve-handler": "^6.1.4",
      "@vitest/coverage-istanbul": "^1.6.0",
      "@vue/consolidate": "1.0.0",
      "conventional-changelog-cli": "^5.0.0",
Simple merge
Simple merge
index b6e055dfb4b608d81c05633d0c244ca5ef238295,1456c523239bda8a991ac4683d72ee28f032b610..89dbeacb38276fd2bfa952c9d63572160e684911
@@@ -174,36 -172,6 +174,41 @@@ describe('ref with generic', <T extend
    expectType<string>(ss.value.name)
  })
  
 +describe('allow getter and setter types to be unrelated', <T>() => {
 +  const a = { b: ref(0) }
 +  const c = ref(a)
 +  c.value = a
 +
 +  const d = {} as T
 +  const e = ref(d)
 +  e.value = d
++
++  const f = ref(ref(0))
++  expectType<number>(f.value)
++  // @ts-expect-error
++  f.value = ref(1)
 +})
 +
 +// computed
 +describe('allow computed getter and setter types to be unrelated', () => {
 +  const obj = ref({
 +    name: 'foo',
 +  })
 +
 +  const c = computed({
 +    get() {
 +      return JSON.stringify(obj.value)
 +    },
 +    set(val: typeof obj.value) {
 +      obj.value = val
 +    },
 +  })
 +
 +  c.value = { name: 'bar' } // object
 +
 +  expectType<string>(c.value)
 +})
 +
  // shallowRef
  type Status = 'initial' | 'ready' | 'invalidating'
  const shallowStatus = shallowRef<Status>('initial')
index 4cb2aa2c352cffed36eef0eb5139c8340f4f8cb1,3e9b05062f3991dbfed7272afd4585716d82a954..87b613e5773e58de09dbd747b522b059d285e1dc
@@@ -52,7 -108,7 +52,9 @@@ export function isRef(r: any): r is Re
   * @param value - The object to wrap in the ref.
   * @see {@link https://vuejs.org/api/reactivity-core.html#ref}
   */
- export function ref<T>(value: T): Ref<UnwrapRef<T>, UnwrapRef<T> | T>
 -export function ref<T>(value: T): Ref<UnwrapRef<T>>
++export function ref<T>(
++  value: T,
++): [T] extends [Ref] ? IfAny<T, Ref<T>, T> : Ref<UnwrapRef<T>, UnwrapRef<T> | T>
  export function ref<T = any>(): Ref<T | undefined>
  export function ref(value?: unknown) {
    return createRef(value, false)
Simple merge
Simple merge
index c4dc0f4e034f37acb73e02b08ded756920bf6cdc,449a85480c5ed80b3d9f078637e92d7dbb0203d2..81031b535565e65e53475357b305fb9aec2d0084
@@@ -903,259 -774,32 +904,288 @@@ describe('defineCustomElement', () => 
      })
    })
  
 +  describe('shadowRoot: false', () => {
 +    const E = defineCustomElement({
 +      shadowRoot: false,
 +      props: {
 +        msg: {
 +          type: String,
 +          default: 'hello',
 +        },
 +      },
 +      render() {
 +        return h('div', this.msg)
 +      },
 +    })
 +    customElements.define('my-el-shadowroot-false', E)
 +
 +    test('should work', async () => {
 +      function raf() {
 +        return new Promise(resolve => {
 +          requestAnimationFrame(resolve)
 +        })
 +      }
 +
 +      container.innerHTML = `<my-el-shadowroot-false></my-el-shadowroot-false>`
 +      const e = container.childNodes[0] as VueElement
 +      await raf()
 +      expect(e).toBeInstanceOf(E)
 +      expect(e._instance).toBeTruthy()
 +      expect(e.innerHTML).toBe(`<div>hello</div>`)
 +      expect(e.shadowRoot).toBe(null)
 +    })
 +
 +    const toggle = ref(true)
 +    const ES = defineCustomElement(
 +      {
 +        render() {
 +          return [
 +            renderSlot(this.$slots, 'default'),
 +            toggle.value ? renderSlot(this.$slots, 'named') : null,
 +            renderSlot(this.$slots, 'omitted', {}, () => [
 +              h('div', 'fallback'),
 +            ]),
 +          ]
 +        },
 +      },
 +      { shadowRoot: false },
 +    )
 +    customElements.define('my-el-shadowroot-false-slots', ES)
 +
 +    test('should render slots', async () => {
 +      container.innerHTML =
 +        `<my-el-shadowroot-false-slots>` +
 +        `<span>default</span>text` +
 +        `<div slot="named">named</div>` +
 +        `</my-el-shadowroot-false-slots>`
 +      const e = container.childNodes[0] as VueElement
 +      // native slots allocation does not affect innerHTML, so we just
 +      // verify that we've rendered the correct native slots here...
 +      expect(e.innerHTML).toBe(
 +        `<span>default</span>text` +
 +          `<div slot="named">named</div>` +
 +          `<div>fallback</div>`,
 +      )
 +
 +      toggle.value = false
 +      await nextTick()
 +      expect(e.innerHTML).toBe(
 +        `<span>default</span>text` + `<!---->` + `<div>fallback</div>`,
 +      )
 +    })
 +  })
 +
 +  describe('useCustomElementRoot', () => {
 +    test('should work for style injection', () => {
 +      const Foo = defineCustomElement({
 +        setup() {
 +          const root = useShadowRoot()!
 +          const style = document.createElement('style')
 +          style.innerHTML = `div { color: red; }`
 +          root.appendChild(style)
 +          return () => h('div', 'hello')
 +        },
 +      })
 +      customElements.define('my-el', Foo)
 +      container.innerHTML = `<my-el></my-el>`
 +      const el = container.childNodes[0] as VueElement
 +      const style = el.shadowRoot?.querySelector('style')!
 +      expect(style.textContent).toBe(`div { color: red; }`)
 +    })
 +  })
 +
 +  describe('expose', () => {
 +    test('expose attributes and callback', async () => {
 +      type SetValue = (value: string) => void
 +      let fn: MockedFunction<SetValue>
 +
 +      const E = defineCustomElement({
 +        setup(_, { expose }) {
 +          const value = ref('hello')
 +
 +          const setValue = (fn = vi.fn((_value: string) => {
 +            value.value = _value
 +          }))
 +
 +          expose({
 +            setValue,
 +            value,
 +          })
 +
 +          return () => h('div', null, [value.value])
 +        },
 +      })
 +      customElements.define('my-el-expose', E)
 +
 +      container.innerHTML = `<my-el-expose></my-el-expose>`
 +      const e = container.childNodes[0] as VueElement & {
 +        value: string
 +        setValue: MockedFunction<SetValue>
 +      }
 +      expect(e.shadowRoot!.innerHTML).toBe(`<div>hello</div>`)
 +      expect(e.value).toBe('hello')
 +      expect(e.setValue).toBe(fn!)
 +      e.setValue('world')
 +      expect(e.value).toBe('world')
 +      await nextTick()
 +      expect(e.shadowRoot!.innerHTML).toBe(`<div>world</div>`)
 +    })
 +
 +    test('warning when exposing an existing property', () => {
 +      const E = defineCustomElement({
 +        props: {
 +          value: String,
 +        },
 +        setup(props, { expose }) {
 +          expose({
 +            value: 'hello',
 +          })
 +
 +          return () => h('div', null, [props.value])
 +        },
 +      })
 +      customElements.define('my-el-expose-two', E)
 +
 +      container.innerHTML = `<my-el-expose-two value="world"></my-el-expose-two>`
 +
 +      expect(
 +        `[Vue warn]: Exposed property "value" already exists on custom element.`,
 +      ).toHaveBeenWarned()
 +    })
 +  })
 +
 +  test('async & nested custom elements', async () => {
 +    let fooVal: string | undefined = ''
 +    const E = defineCustomElement(
 +      defineAsyncComponent(() => {
 +        return Promise.resolve({
 +          setup(props) {
 +            provide('foo', 'foo')
 +          },
 +          render(this: any) {
 +            return h('div', null, [renderSlot(this.$slots, 'default')])
 +          },
 +        })
 +      }),
 +    )
 +
 +    const EChild = defineCustomElement({
 +      setup(props) {
 +        fooVal = inject('foo')
 +      },
 +      render(this: any) {
 +        return h('div', null, 'child')
 +      },
 +    })
 +    customElements.define('my-el-async-nested-ce', E)
 +    customElements.define('slotted-child', EChild)
 +    container.innerHTML = `<my-el-async-nested-ce><div><slotted-child></slotted-child></div></my-el-async-nested-ce>`
 +
 +    await new Promise(r => setTimeout(r))
 +    const e = container.childNodes[0] as VueElement
 +    expect(e.shadowRoot!.innerHTML).toBe(`<div><slot></slot></div>`)
 +    expect(fooVal).toBe('foo')
 +  })
 +
 +  test('async & multiple levels of nested custom elements', async () => {
 +    let fooVal: string | undefined = ''
 +    let barVal: string | undefined = ''
 +    const E = defineCustomElement(
 +      defineAsyncComponent(() => {
 +        return Promise.resolve({
 +          setup(props) {
 +            provide('foo', 'foo')
 +          },
 +          render(this: any) {
 +            return h('div', null, [renderSlot(this.$slots, 'default')])
 +          },
 +        })
 +      }),
 +    )
 +
 +    const EChild = defineCustomElement({
 +      setup(props) {
 +        provide('bar', 'bar')
 +      },
 +      render(this: any) {
 +        return h('div', null, [renderSlot(this.$slots, 'default')])
 +      },
 +    })
 +
 +    const EChild2 = defineCustomElement({
 +      setup(props) {
 +        fooVal = inject('foo')
 +        barVal = inject('bar')
 +      },
 +      render(this: any) {
 +        return h('div', null, 'child')
 +      },
 +    })
 +    customElements.define('my-el-async-nested-m-ce', E)
 +    customElements.define('slotted-child-m', EChild)
 +    customElements.define('slotted-child2-m', EChild2)
 +    container.innerHTML =
 +      `<my-el-async-nested-m-ce>` +
 +      `<div><slotted-child-m>` +
 +      `<slotted-child2-m></slotted-child2-m>` +
 +      `</slotted-child-m></div>` +
 +      `</my-el-async-nested-m-ce>`
 +
 +    await new Promise(r => setTimeout(r))
 +    const e = container.childNodes[0] as VueElement
 +    expect(e.shadowRoot!.innerHTML).toBe(`<div><slot></slot></div>`)
 +    expect(fooVal).toBe('foo')
 +    expect(barVal).toBe('bar')
 +  })
 +
 +  describe('configureApp', () => {
 +    test('should work', () => {
 +      const E = defineCustomElement(
 +        () => {
 +          const msg = inject('msg')
 +          return () => h('div', msg!)
 +        },
 +        {
 +          configureApp(app) {
 +            app.provide('msg', 'app-injected')
 +          },
 +        },
 +      )
 +      customElements.define('my-element-with-app', E)
 +
 +      container.innerHTML = `<my-element-with-app></my-element-with-app>`
 +      const e = container.childNodes[0] as VueElement
 +
 +      expect(e.shadowRoot?.innerHTML).toBe('<div>app-injected</div>')
 +    })
 +  })
++
+   // #9885
+   test('avoid double mount when prop is set immediately after mount', () => {
+     customElements.define(
+       'my-input-dupe',
+       defineCustomElement({
+         props: {
+           value: String,
+         },
+         render() {
+           return 'hello'
+         },
+       }),
+     )
+     createApp({
+       render() {
+         return h('div', [
+           h('my-input-dupe', {
+             onVnodeMounted(vnode) {
+               vnode.el!.value = 'fesfes'
+             },
+           }),
+         ])
+       },
+     }).mount(container)
+     expect(container.children[0].children[0].shadowRoot?.innerHTML).toBe(
+       'hello',
+     )
+   })
  })
diff --cc pnpm-lock.yaml
index f1e684a8084a540fbb07c158b10e511aee15f508,d12dc453c690339249b1a3d889ed2304303616a9..e33e0551dfce8af91bb3e054ef4e86579b4dd2a5
@@@ -17,7 -17,7 +17,7 @@@ catalogs
        version: 2.0.2
      magic-string:
        specifier: ^0.30.10
--      version: 0.30.10
++      version: 0.30.11
      source-map-js:
        specifier: ^1.2.0
        version: 1.2.0
@@@ -62,12 -62,9 +62,12 @@@ importers
        '@types/semver':
          specifier: ^7.5.8
          version: 7.5.8
 +      '@types/serve-handler':
 +        specifier: ^6.1.4
 +        version: 6.1.4
        '@vitest/coverage-istanbul':
          specifier: ^1.6.0
-         version: 1.6.0(vitest@1.6.0(@types/node@20.14.13)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1))
+         version: 1.6.0(vitest@1.6.0(@types/node@20.14.14)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1))
        '@vue/consolidate':
          specifier: 1.0.0
          version: 1.0.0
          version: 9.8.0
        eslint-plugin-import-x:
          specifier: ^3.1.0
 -        version: 3.1.0(eslint@9.8.0)(typescript@5.4.5)
 +        version: 3.1.0(eslint@9.8.0)(typescript@5.5.4)
        eslint-plugin-vitest:
          specifier: ^0.5.4
-         version: 0.5.4(eslint@9.8.0)(typescript@5.5.4)(vitest@1.6.0(@types/node@20.14.13)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1))
 -        version: 0.5.4(eslint@9.8.0)(typescript@5.4.5)(vitest@1.6.0(@types/node@20.14.14)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1))
++        version: 0.5.4(eslint@9.8.0)(typescript@5.5.4)(vitest@1.6.0(@types/node@20.14.14)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1))
        estree-walker:
          specifier: 'catalog:'
          version: 2.0.2
          specifier: ^3.0.3
          version: 3.0.3
        puppeteer:
-         specifier: ~22.14.0
-         version: 22.14.0(typescript@5.5.4)
+         specifier: ~22.15.0
 -        version: 22.15.0(typescript@5.4.5)
++        version: 22.15.0(typescript@5.5.4)
        rimraf:
-         specifier: ^5.0.9
-         version: 5.0.9
+         specifier: ^6.0.1
+         version: 6.0.1
        rollup:
-         specifier: ^4.19.1
-         version: 4.19.1
+         specifier: ^4.20.0
+         version: 4.20.0
        rollup-plugin-dts:
          specifier: ^6.1.1
-         version: 6.1.1(rollup@4.19.1)(typescript@5.5.4)
 -        version: 6.1.1(rollup@4.20.0)(typescript@5.4.5)
++        version: 6.1.1(rollup@4.20.0)(typescript@5.5.4)
        rollup-plugin-esbuild:
          specifier: ^6.1.1
-         version: 6.1.1(esbuild@0.23.0)(rollup@4.19.1)
+         version: 6.1.1(esbuild@0.23.0)(rollup@4.20.0)
        rollup-plugin-polyfill-node:
          specifier: ^0.13.0
-         version: 0.13.0(rollup@4.19.1)
+         version: 0.13.0(rollup@4.20.0)
        semver:
          specifier: ^7.6.3
          version: 7.6.3
          specifier: ^4.16.5
          version: 4.16.5
        typescript:
 -        specifier: ~5.4.5
 -        version: 5.4.5
 +        specifier: ~5.5.4
 +        version: 5.5.4
        typescript-eslint:
          specifier: ^8.0.0
 -        version: 8.0.0(eslint@9.8.0)(typescript@5.4.5)
 +        version: 8.0.0(eslint@9.8.0)(typescript@5.5.4)
        vite:
          specifier: 'catalog:'
-         version: 5.3.3(@types/node@20.14.13)(sass@1.77.8)(terser@5.31.1)
+         version: 5.3.3(@types/node@20.14.14)(sass@1.77.8)(terser@5.31.1)
        vitest:
          specifier: ^1.6.0
-         version: 1.6.0(@types/node@20.14.13)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1)
+         version: 1.6.0(@types/node@20.14.14)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1)
  
    packages/compiler-core:
      dependencies:
          version: 2.0.2
        magic-string:
          specifier: 'catalog:'
--        version: 0.30.10
++        version: 0.30.11
        postcss:
          specifier: ^8.4.40
          version: 8.4.40
@@@ -971,163 -964,163 +974,83 @@@ packages
        rollup:
          optional: true
  
--  '@rollup/rollup-android-arm-eabi@4.18.0':
--    resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==}
--    cpu: [arm]
--    os: [android]
--
-   '@rollup/rollup-android-arm-eabi@4.19.1':
-     resolution: {integrity: sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww==}
+   '@rollup/rollup-android-arm-eabi@4.20.0':
+     resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==}
      cpu: [arm]
      os: [android]
  
--  '@rollup/rollup-android-arm64@4.18.0':
--    resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==}
 -    cpu: [arm64]
 -    os: [android]
 -
+   '@rollup/rollup-android-arm64@4.20.0':
+     resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==}
      cpu: [arm64]
      os: [android]
  
-   '@rollup/rollup-android-arm64@4.19.1':
-     resolution: {integrity: sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A==}
-     cpu: [arm64]
-     os: [android]
--  '@rollup/rollup-darwin-arm64@4.18.0':
--    resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==}
 -    cpu: [arm64]
 -    os: [darwin]
 -
+   '@rollup/rollup-darwin-arm64@4.20.0':
+     resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==}
      cpu: [arm64]
      os: [darwin]
  
-   '@rollup/rollup-darwin-arm64@4.19.1':
-     resolution: {integrity: sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q==}
-     cpu: [arm64]
-     os: [darwin]
--  '@rollup/rollup-darwin-x64@4.18.0':
--    resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==}
 -    cpu: [x64]
 -    os: [darwin]
 -
+   '@rollup/rollup-darwin-x64@4.20.0':
+     resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==}
      cpu: [x64]
      os: [darwin]
  
-   '@rollup/rollup-darwin-x64@4.19.1':
-     resolution: {integrity: sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA==}
-     cpu: [x64]
-     os: [darwin]
--  '@rollup/rollup-linux-arm-gnueabihf@4.18.0':
--    resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==}
-     cpu: [arm]
-     os: [linux]
-   '@rollup/rollup-linux-arm-gnueabihf@4.19.1':
-     resolution: {integrity: sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q==}
--    cpu: [arm]
--    os: [linux]
--
-   '@rollup/rollup-linux-arm-musleabihf@4.18.0':
-     resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==}
+   '@rollup/rollup-linux-arm-gnueabihf@4.20.0':
+     resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==}
      cpu: [arm]
      os: [linux]
  
-   '@rollup/rollup-linux-arm-musleabihf@4.19.1':
-     resolution: {integrity: sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw==}
 -  '@rollup/rollup-linux-arm-musleabihf@4.18.0':
 -    resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==}
 -    cpu: [arm]
 -    os: [linux]
 -
+   '@rollup/rollup-linux-arm-musleabihf@4.20.0':
+     resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==}
      cpu: [arm]
      os: [linux]
  
--  '@rollup/rollup-linux-arm64-gnu@4.18.0':
--    resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==}
-     cpu: [arm64]
-     os: [linux]
-   '@rollup/rollup-linux-arm64-gnu@4.19.1':
-     resolution: {integrity: sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw==}
--    cpu: [arm64]
--    os: [linux]
--
-   '@rollup/rollup-linux-arm64-musl@4.18.0':
-     resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==}
+   '@rollup/rollup-linux-arm64-gnu@4.20.0':
+     resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==}
      cpu: [arm64]
      os: [linux]
  
-   '@rollup/rollup-linux-arm64-musl@4.19.1':
-     resolution: {integrity: sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw==}
 -  '@rollup/rollup-linux-arm64-musl@4.18.0':
 -    resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==}
 -    cpu: [arm64]
 -    os: [linux]
 -
+   '@rollup/rollup-linux-arm64-musl@4.20.0':
+     resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==}
      cpu: [arm64]
      os: [linux]
  
--  '@rollup/rollup-linux-powerpc64le-gnu@4.18.0':
--    resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==}
--    cpu: [ppc64]
--    os: [linux]
--
-   '@rollup/rollup-linux-powerpc64le-gnu@4.19.1':
-     resolution: {integrity: sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ==}
+   '@rollup/rollup-linux-powerpc64le-gnu@4.20.0':
+     resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==}
      cpu: [ppc64]
      os: [linux]
  
--  '@rollup/rollup-linux-riscv64-gnu@4.18.0':
--    resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==}
 -    cpu: [riscv64]
 -    os: [linux]
 -
+   '@rollup/rollup-linux-riscv64-gnu@4.20.0':
+     resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==}
      cpu: [riscv64]
      os: [linux]
  
-   '@rollup/rollup-linux-riscv64-gnu@4.19.1':
-     resolution: {integrity: sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A==}
-     cpu: [riscv64]
-     os: [linux]
--  '@rollup/rollup-linux-s390x-gnu@4.18.0':
--    resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==}
 -    cpu: [s390x]
 -    os: [linux]
 -
+   '@rollup/rollup-linux-s390x-gnu@4.20.0':
+     resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==}
      cpu: [s390x]
      os: [linux]
  
-   '@rollup/rollup-linux-s390x-gnu@4.19.1':
-     resolution: {integrity: sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q==}
-     cpu: [s390x]
-     os: [linux]
--  '@rollup/rollup-linux-x64-gnu@4.18.0':
--    resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==}
--    cpu: [x64]
--    os: [linux]
--
-   '@rollup/rollup-linux-x64-gnu@4.19.1':
-     resolution: {integrity: sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q==}
+   '@rollup/rollup-linux-x64-gnu@4.20.0':
+     resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==}
      cpu: [x64]
      os: [linux]
  
--  '@rollup/rollup-linux-x64-musl@4.18.0':
--    resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==}
 -    cpu: [x64]
 -    os: [linux]
 -
+   '@rollup/rollup-linux-x64-musl@4.20.0':
+     resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==}
      cpu: [x64]
      os: [linux]
  
-   '@rollup/rollup-linux-x64-musl@4.19.1':
-     resolution: {integrity: sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q==}
-     cpu: [x64]
-     os: [linux]
--  '@rollup/rollup-win32-arm64-msvc@4.18.0':
--    resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==}
--    cpu: [arm64]
--    os: [win32]
--
-   '@rollup/rollup-win32-arm64-msvc@4.19.1':
-     resolution: {integrity: sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA==}
+   '@rollup/rollup-win32-arm64-msvc@4.20.0':
+     resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==}
      cpu: [arm64]
      os: [win32]
  
--  '@rollup/rollup-win32-ia32-msvc@4.18.0':
--    resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==}
 -    cpu: [ia32]
 -    os: [win32]
 -
+   '@rollup/rollup-win32-ia32-msvc@4.20.0':
+     resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==}
      cpu: [ia32]
      os: [win32]
  
-   '@rollup/rollup-win32-ia32-msvc@4.19.1':
-     resolution: {integrity: sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ==}
-     cpu: [ia32]
-     os: [win32]
--  '@rollup/rollup-win32-x64-msvc@4.18.0':
--    resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==}
--    cpu: [x64]
--    os: [win32]
--
-   '@rollup/rollup-win32-x64-msvc@4.19.1':
-     resolution: {integrity: sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg==}
+   '@rollup/rollup-win32-x64-msvc@4.20.0':
+     resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==}
      cpu: [x64]
      os: [win32]
  
      resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
      engines: {node: '>=12'}
  
--  magic-string@0.30.10:
--    resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==}
 -
+   magic-string@0.30.11:
+     resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
  
    magicast@0.3.4:
      resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==}
      peerDependencies:
        rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0
  
--  rollup@4.18.0:
--    resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==}
--    engines: {node: '>=18.0.0', npm: '>=8.0.0'}
--    hasBin: true
--
-   rollup@4.19.1:
-     resolution: {integrity: sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw==}
+   rollup@4.20.0:
+     resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==}
      engines: {node: '>=18.0.0', npm: '>=8.0.0'}
      hasBin: true
  
@@@ -4082,102 -4115,102 +4048,54 @@@ snapshots
        estree-walker: 2.0.2
        picomatch: 2.3.1
      optionalDependencies:
-       rollup: 4.19.1
-   '@rollup/rollup-android-arm-eabi@4.18.0':
-     optional: true
-   '@rollup/rollup-android-arm-eabi@4.19.1':
-     optional: true
-   '@rollup/rollup-android-arm64@4.18.0':
-     optional: true
-   '@rollup/rollup-android-arm64@4.19.1':
-     optional: true
-   '@rollup/rollup-darwin-arm64@4.18.0':
-     optional: true
-   '@rollup/rollup-darwin-arm64@4.19.1':
-     optional: true
-   '@rollup/rollup-darwin-x64@4.18.0':
-     optional: true
+       rollup: 4.20.0
  
-   '@rollup/rollup-darwin-x64@4.19.1':
 -  '@rollup/rollup-android-arm-eabi@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-android-arm-eabi@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-arm-gnueabihf@4.18.0':
 -  '@rollup/rollup-android-arm64@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-android-arm64@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-arm-gnueabihf@4.19.1':
 -  '@rollup/rollup-darwin-arm64@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-darwin-arm64@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-arm-musleabihf@4.18.0':
 -  '@rollup/rollup-darwin-x64@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-darwin-x64@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-arm-musleabihf@4.19.1':
 -  '@rollup/rollup-linux-arm-gnueabihf@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-linux-arm-gnueabihf@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-arm64-gnu@4.18.0':
 -  '@rollup/rollup-linux-arm-musleabihf@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-linux-arm-musleabihf@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-arm64-gnu@4.19.1':
 -  '@rollup/rollup-linux-arm64-gnu@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-linux-arm64-gnu@4.20.0':
      optional: true
  
--  '@rollup/rollup-linux-arm64-musl@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-linux-arm64-musl@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-arm64-musl@4.19.1':
 -  '@rollup/rollup-linux-powerpc64le-gnu@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-linux-powerpc64le-gnu@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-powerpc64le-gnu@4.18.0':
 -  '@rollup/rollup-linux-riscv64-gnu@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-linux-riscv64-gnu@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-powerpc64le-gnu@4.19.1':
 -  '@rollup/rollup-linux-s390x-gnu@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-linux-s390x-gnu@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-riscv64-gnu@4.18.0':
 -  '@rollup/rollup-linux-x64-gnu@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-linux-x64-gnu@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-riscv64-gnu@4.19.1':
 -  '@rollup/rollup-linux-x64-musl@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-linux-x64-musl@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-s390x-gnu@4.18.0':
 -  '@rollup/rollup-win32-arm64-msvc@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-win32-arm64-msvc@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-s390x-gnu@4.19.1':
 -  '@rollup/rollup-win32-ia32-msvc@4.18.0':
 -    optional: true
 -
+   '@rollup/rollup-win32-ia32-msvc@4.20.0':
      optional: true
  
-   '@rollup/rollup-linux-x64-gnu@4.18.0':
-     optional: true
-   '@rollup/rollup-linux-x64-gnu@4.19.1':
-     optional: true
-   '@rollup/rollup-linux-x64-musl@4.18.0':
-     optional: true
-   '@rollup/rollup-linux-x64-musl@4.19.1':
-     optional: true
-   '@rollup/rollup-win32-arm64-msvc@4.18.0':
-     optional: true
-   '@rollup/rollup-win32-arm64-msvc@4.19.1':
-     optional: true
-   '@rollup/rollup-win32-ia32-msvc@4.18.0':
-     optional: true
-   '@rollup/rollup-win32-ia32-msvc@4.19.1':
-     optional: true
--  '@rollup/rollup-win32-x64-msvc@4.18.0':
--    optional: true
--
-   '@rollup/rollup-win32-x64-msvc@4.19.1':
+   '@rollup/rollup-win32-x64-msvc@4.20.0':
      optional: true
  
    '@sinclair/typebox@0.27.8': {}
  
    '@types/semver@7.5.8': {}
  
-       '@types/node': 20.14.13
 +  '@types/serve-handler@6.1.4':
 +    dependencies:
++      '@types/node': 20.14.14
 +
 +  '@types/trusted-types@2.0.7': {}
 +
    '@types/yauzl@2.10.3':
      dependencies:
-       '@types/node': 20.14.13
+       '@types/node': 20.14.14
      optional: true
  
 -  '@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.4.5))(eslint@9.8.0)(typescript@5.4.5)':
 +  '@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)':
      dependencies:
        '@eslint-community/regexpp': 4.11.0
 -      '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.4.5)
 +      '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@5.5.4)
        '@typescript-eslint/scope-manager': 8.0.0
 -      '@typescript-eslint/type-utils': 8.0.0(eslint@9.8.0)(typescript@5.4.5)
 -      '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.4.5)
 +      '@typescript-eslint/type-utils': 8.0.0(eslint@9.8.0)(typescript@5.5.4)
 +      '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@5.5.4)
        '@typescript-eslint/visitor-keys': 8.0.0
        eslint: 9.8.0
        graphemer: 1.4.0
        - supports-color
        - typescript
  
-   eslint-plugin-vitest@0.5.4(eslint@9.8.0)(typescript@5.5.4)(vitest@1.6.0(@types/node@20.14.13)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1)):
 -  eslint-plugin-vitest@0.5.4(eslint@9.8.0)(typescript@5.4.5)(vitest@1.6.0(@types/node@20.14.14)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1)):
++  eslint-plugin-vitest@0.5.4(eslint@9.8.0)(typescript@5.5.4)(vitest@1.6.0(@types/node@20.14.14)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1)):
      dependencies:
 -      '@typescript-eslint/utils': 7.15.0(eslint@9.8.0)(typescript@5.4.5)
 +      '@typescript-eslint/utils': 7.15.0(eslint@9.8.0)(typescript@5.5.4)
        eslint: 9.8.0
      optionalDependencies:
-       vitest: 1.6.0(@types/node@20.14.13)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1)
+       vitest: 1.6.0(@types/node@20.14.14)(jsdom@24.1.1)(sass@1.77.8)(terser@5.31.1)
      transitivePeerDependencies:
        - supports-color
        - typescript
  
    lru-cache@7.18.3: {}
  
--  magic-string@0.30.10:
 -    dependencies:
 -      '@jridgewell/sourcemap-codec': 1.4.15
 -
+   magic-string@0.30.11:
      dependencies:
-       '@jridgewell/sourcemap-codec': 1.4.15
+       '@jridgewell/sourcemap-codec': 1.5.0
  
    magicast@0.3.4:
      dependencies:
        - supports-color
        - utf-8-validate
  
-   puppeteer@22.14.0(typescript@5.5.4):
 -  puppeteer@22.15.0(typescript@5.4.5):
++  puppeteer@22.15.0(typescript@5.5.4):
      dependencies:
        '@puppeteer/browsers': 2.3.0
 -      cosmiconfig: 9.0.0(typescript@5.4.5)
 +      cosmiconfig: 9.0.0(typescript@5.5.4)
        devtools-protocol: 0.0.1312386
-       puppeteer-core: 22.14.0
+       puppeteer-core: 22.15.0
      transitivePeerDependencies:
        - bufferutil
        - supports-color
  
    rfdc@1.4.1: {}
  
-   rimraf@5.0.9:
+   rimraf@6.0.1:
      dependencies:
-       glob: 10.4.3
+       glob: 11.0.0
+       package-json-from-dist: 1.0.0
  
-   rollup-plugin-dts@6.1.1(rollup@4.19.1)(typescript@5.5.4):
 -  rollup-plugin-dts@6.1.1(rollup@4.20.0)(typescript@5.4.5):
++  rollup-plugin-dts@6.1.1(rollup@4.20.0)(typescript@5.5.4):
      dependencies:
-       magic-string: 0.30.10
-       rollup: 4.19.1
+       magic-string: 0.30.11
+       rollup: 4.20.0
 -      typescript: 5.4.5
 +      typescript: 5.5.4
      optionalDependencies:
        '@babel/code-frame': 7.24.7
  
      transitivePeerDependencies:
        - supports-color
  
-   rollup-plugin-polyfill-node@0.13.0(rollup@4.19.1):
+   rollup-plugin-polyfill-node@0.13.0(rollup@4.20.0):
      dependencies:
-       '@rollup/plugin-inject': 5.0.5(rollup@4.19.1)
-       rollup: 4.19.1
-   rollup@4.18.0:
-     dependencies:
-       '@types/estree': 1.0.5
-     optionalDependencies:
-       '@rollup/rollup-android-arm-eabi': 4.18.0
-       '@rollup/rollup-android-arm64': 4.18.0
-       '@rollup/rollup-darwin-arm64': 4.18.0
-       '@rollup/rollup-darwin-x64': 4.18.0
-       '@rollup/rollup-linux-arm-gnueabihf': 4.18.0
-       '@rollup/rollup-linux-arm-musleabihf': 4.18.0
-       '@rollup/rollup-linux-arm64-gnu': 4.18.0
-       '@rollup/rollup-linux-arm64-musl': 4.18.0
-       '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0
-       '@rollup/rollup-linux-riscv64-gnu': 4.18.0
-       '@rollup/rollup-linux-s390x-gnu': 4.18.0
-       '@rollup/rollup-linux-x64-gnu': 4.18.0
-       '@rollup/rollup-linux-x64-musl': 4.18.0
-       '@rollup/rollup-win32-arm64-msvc': 4.18.0
-       '@rollup/rollup-win32-ia32-msvc': 4.18.0
-       '@rollup/rollup-win32-x64-msvc': 4.18.0
-       fsevents: 2.3.3
+       '@rollup/plugin-inject': 5.0.5(rollup@4.20.0)
+       rollup: 4.20.0
  
-   rollup@4.19.1:
 -  rollup@4.18.0:
 -    dependencies:
 -      '@types/estree': 1.0.5
 -    optionalDependencies:
 -      '@rollup/rollup-android-arm-eabi': 4.18.0
 -      '@rollup/rollup-android-arm64': 4.18.0
 -      '@rollup/rollup-darwin-arm64': 4.18.0
 -      '@rollup/rollup-darwin-x64': 4.18.0
 -      '@rollup/rollup-linux-arm-gnueabihf': 4.18.0
 -      '@rollup/rollup-linux-arm-musleabihf': 4.18.0
 -      '@rollup/rollup-linux-arm64-gnu': 4.18.0
 -      '@rollup/rollup-linux-arm64-musl': 4.18.0
 -      '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0
 -      '@rollup/rollup-linux-riscv64-gnu': 4.18.0
 -      '@rollup/rollup-linux-s390x-gnu': 4.18.0
 -      '@rollup/rollup-linux-x64-gnu': 4.18.0
 -      '@rollup/rollup-linux-x64-musl': 4.18.0
 -      '@rollup/rollup-win32-arm64-msvc': 4.18.0
 -      '@rollup/rollup-win32-ia32-msvc': 4.18.0
 -      '@rollup/rollup-win32-x64-msvc': 4.18.0
 -      fsevents: 2.3.3
 -
+   rollup@4.20.0:
      dependencies:
        '@types/estree': 1.0.5
      optionalDependencies:
      dependencies:
        esbuild: 0.21.5
        postcss: 8.4.40
--      rollup: 4.18.0
++      rollup: 4.20.0
      optionalDependencies:
-       '@types/node': 20.14.13
+       '@types/node': 20.14.14
        fsevents: 2.3.3
        sass: 1.77.8
        terser: 5.31.1
Simple merge