From: Evan You Date: Wed, 7 Aug 2024 10:25:58 +0000 (+0800) Subject: chore: Merge branch 'main' into minor X-Git-Tag: v3.5.0-beta.1~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eaf5455d7745e1e16ed323d35df50164809948fd;p=thirdparty%2Fvuejs%2Fcore.git chore: Merge branch 'main' into minor --- eaf5455d7745e1e16ed323d35df50164809948fd diff --cc CHANGELOG.md index 08328b165d,efa8639495..317b52f5e3 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@@ -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 196769442d,87f10e911b..a8326130b8 --- a/package.json +++ b/package.json @@@ -66,11 -66,10 +66,11 @@@ "@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", diff --cc packages/dts-test/ref.test-d.ts index b6e055dfb4,1456c52323..89dbeacb38 --- a/packages/dts-test/ref.test-d.ts +++ b/packages/dts-test/ref.test-d.ts @@@ -174,36 -172,6 +174,41 @@@ describe('ref with generic', (ss.value.name) }) +describe('allow getter and setter types to be unrelated', () => { + 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(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(c.value) +}) + // shallowRef type Status = 'initial' | 'ready' | 'invalidating' const shallowStatus = shallowRef('initial') diff --cc packages/reactivity/src/ref.ts index 4cb2aa2c35,3e9b05062f..87b613e577 --- a/packages/reactivity/src/ref.ts +++ b/packages/reactivity/src/ref.ts @@@ -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(value: T): Ref, UnwrapRef | T> -export function ref(value: T): Ref> ++export function ref( ++ value: T, ++): [T] extends [Ref] ? IfAny, T> : Ref, UnwrapRef | T> export function ref(): Ref export function ref(value?: unknown) { return createRef(value, false) diff --cc packages/runtime-dom/__tests__/customElement.spec.ts index c4dc0f4e03,449a85480c..81031b5355 --- a/packages/runtime-dom/__tests__/customElement.spec.ts +++ b/packages/runtime-dom/__tests__/customElement.spec.ts @@@ -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 = `` + const e = container.childNodes[0] as VueElement + await raf() + expect(e).toBeInstanceOf(E) + expect(e._instance).toBeTruthy() + expect(e.innerHTML).toBe(`
hello
`) + 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 = + `` + + `defaulttext` + + `
named
` + + `
` + 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( + `defaulttext` + + `
named
` + + `
fallback
`, + ) + + toggle.value = false + await nextTick() + expect(e.innerHTML).toBe( + `defaulttext` + `` + `
fallback
`, + ) + }) + }) + + 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 = `` + 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 + + 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 = `` + const e = container.childNodes[0] as VueElement & { + value: string + setValue: MockedFunction + } + expect(e.shadowRoot!.innerHTML).toBe(`
hello
`) + 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(`
world
`) + }) + + 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 = `` + + 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 = `
` + + await new Promise(r => setTimeout(r)) + const e = container.childNodes[0] as VueElement + expect(e.shadowRoot!.innerHTML).toBe(`
`) + 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 = + `` + + `
` + + `` + + `
` + + `
` + + await new Promise(r => setTimeout(r)) + const e = container.childNodes[0] as VueElement + expect(e.shadowRoot!.innerHTML).toBe(`
`) + 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 = `` + const e = container.childNodes[0] as VueElement + + expect(e.shadowRoot?.innerHTML).toBe('
app-injected
') + }) + }) ++ + // #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 f1e684a808,d12dc453c6..e33e0551df --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@@ -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 @@@ -88,10 -85,10 +88,10 @@@ 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 @@@ -129,23 -126,23 +129,23 @@@ 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 @@@ -168,17 -162,17 +168,17 @@@ 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: @@@ -233,7 -227,7 +233,7 @@@ 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] @@@ -2569,8 -2586,11 +2522,8 @@@ 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==} @@@ -3071,13 -3107,13 +3040,8 @@@ 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': {} @@@ -4250,24 -4283,18 +4168,24 @@@ '@types/semver@7.5.8': {} + '@types/serve-handler@6.1.4': + dependencies: - '@types/node': 20.14.13 ++ '@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 @@@ -5100,12 -5137,12 +5028,12 @@@ - 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 @@@ -5761,9 -5815,13 +5706,9 @@@ 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: @@@ -6173,12 -6246,12 +6133,12 @@@ - 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 @@@ -6269,15 -6342,16 +6229,16 @@@ 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 @@@ -6292,34 -6366,34 +6253,12 @@@ 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: @@@ -6727,9 -6799,9 +6666,9 @@@ 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