mirror of https://github.com/vuejs/core.git
				
				
				
			Merge branch 'main' into fix/ssr-scopeId
This commit is contained in:
		
						commit
						672e1cfbb3
					
				
							
								
								
									
										31
									
								
								CHANGELOG.md
								
								
								
								
							
							
						
						
									
										31
									
								
								CHANGELOG.md
								
								
								
								
							|  | @ -1,3 +1,34 @@ | |||
| ## [3.5.12](https://github.com/vuejs/core/compare/v3.5.11...v3.5.12) (2024-10-11) | ||||
| 
 | ||||
| 
 | ||||
| ### Bug Fixes | ||||
| 
 | ||||
| * **compiler-dom:** avoid stringify option with null value ([#12096](https://github.com/vuejs/core/issues/12096)) ([f6d9926](https://github.com/vuejs/core/commit/f6d99262364b7444ebab8742158599e8cdd79eaa)), closes [#12093](https://github.com/vuejs/core/issues/12093) | ||||
| * **compiler-sfc:**  do not skip TSInstantiationExpression when transforming props destructure ([#12064](https://github.com/vuejs/core/issues/12064)) ([d3ecde8](https://github.com/vuejs/core/commit/d3ecde8a696ff62c8d0ab067fd1d7ee0565b63c5)) | ||||
| * **compiler-sfc:** use sass modern api if available and avoid deprecation warning ([#11992](https://github.com/vuejs/core/issues/11992)) ([4474c11](https://github.com/vuejs/core/commit/4474c113d1fb1c26298dd6794275d5b5c7cc4d93)) | ||||
| * **compiler:** clone loc to `ifNode` ([#12131](https://github.com/vuejs/core/issues/12131)) ([cde2c06](https://github.com/vuejs/core/commit/cde2c0671b00d4f6111fcbd7aa76e45872f20b0c)), closes [vuejs/language-tools#4911](https://github.com/vuejs/language-tools/issues/4911) | ||||
| * **custom-element:** properly remove hyphenated attribute ([#12143](https://github.com/vuejs/core/issues/12143)) ([e16e9a7](https://github.com/vuejs/core/commit/e16e9a7341e7cfb3c443da4e5e5b06e8158712c3)), closes [#12139](https://github.com/vuejs/core/issues/12139) | ||||
| * **defineModel:** handle kebab-case model correctly ([#12063](https://github.com/vuejs/core/issues/12063)) ([c0418a3](https://github.com/vuejs/core/commit/c0418a3b8fa96a0b108ab71b7aab5d3388f90557)), closes [#12060](https://github.com/vuejs/core/issues/12060) | ||||
| * **deps:** update dependency monaco-editor to ^0.52.0 ([#12119](https://github.com/vuejs/core/issues/12119)) ([f7cbea2](https://github.com/vuejs/core/commit/f7cbea2111c7770a180b640f36f6a5d4d6abc698)) | ||||
| * **hydration:** provide compat fallback for idle callback hydration strategy ([#11935](https://github.com/vuejs/core/issues/11935)) ([1ae545a](https://github.com/vuejs/core/commit/1ae545a3786abef983be1c969726489685569c92)) | ||||
| * **reactivity:** trigger reactivity for Map key `undefined` ([#12055](https://github.com/vuejs/core/issues/12055)) ([7ad289e](https://github.com/vuejs/core/commit/7ad289e1e7fea654524008ff91e43a8b8a55ef22)), closes [#12054](https://github.com/vuejs/core/issues/12054) | ||||
| * **runtime-core:** allow symbol values for slot prop key ([#12069](https://github.com/vuejs/core/issues/12069)) ([d9d4d4e](https://github.com/vuejs/core/commit/d9d4d4e158cd51a9ddda249f29de8467f60b2792)), closes [#12068](https://github.com/vuejs/core/issues/12068) | ||||
| * **runtime-core:** fix required prop check false positive for kebab-case edge cases  ([#12034](https://github.com/vuejs/core/issues/12034)) ([9da1ac1](https://github.com/vuejs/core/commit/9da1ac156552ac449754e1373aac7e349841becb)), closes [#12011](https://github.com/vuejs/core/issues/12011) | ||||
| * **runtime-dom:** prevent unnecessary updates in v-model checkbox when value is unchanged ([#12146](https://github.com/vuejs/core/issues/12146)) ([ea943af](https://github.com/vuejs/core/commit/ea943afe404c4ca4b729906c5e8daf7aa2ccde9b)), closes [#12144](https://github.com/vuejs/core/issues/12144) | ||||
| * **teleport:** handle disabled teleport with updateCssVars ([#12113](https://github.com/vuejs/core/issues/12113)) ([76a8223](https://github.com/vuejs/core/commit/76a8223199c148b79a5c0ea19e235164809760cd)), closes [#12112](https://github.com/vuejs/core/issues/12112) | ||||
| * **transition/ssr:** make transition appear work with Suspense in SSR ([#12047](https://github.com/vuejs/core/issues/12047)) ([f1a4f67](https://github.com/vuejs/core/commit/f1a4f67aedfe83e440c54222213f070774faa421)), closes [#12046](https://github.com/vuejs/core/issues/12046) | ||||
| * **types:** ensure `this.$props` type does not include `string` ([#12123](https://github.com/vuejs/core/issues/12123)) ([704173e](https://github.com/vuejs/core/commit/704173e24276706de672cca6c9507e4dd9651197)), closes [#12122](https://github.com/vuejs/core/issues/12122) | ||||
| * **types:** retain union type narrowing with defaults applied ([#12108](https://github.com/vuejs/core/issues/12108)) ([05685a9](https://github.com/vuejs/core/commit/05685a9d7c42d4cd37169b867833776b91154fed)), closes [#12106](https://github.com/vuejs/core/issues/12106) | ||||
| * **useId:** ensure useId consistency when using serverPrefetch ([#12128](https://github.com/vuejs/core/issues/12128)) ([b4d3534](https://github.com/vuejs/core/commit/b4d35349d8bc39aa15bd3f1094d230e5928b177c)), closes [#12102](https://github.com/vuejs/core/issues/12102) | ||||
| * **watch:** watchEffect clean-up with SSR ([#12097](https://github.com/vuejs/core/issues/12097)) ([b094c72](https://github.com/vuejs/core/commit/b094c72b3d40c52c7124f145a9db028509a11202)), closes [#11956](https://github.com/vuejs/core/issues/11956) | ||||
| 
 | ||||
| 
 | ||||
| ### Performance Improvements | ||||
| 
 | ||||
| * **reactivity:** avoid unnecessary recursion in removeSub ([#12135](https://github.com/vuejs/core/issues/12135)) ([ec917cf](https://github.com/vuejs/core/commit/ec917cfdb9d0169cd0835d3a0e28244242657dc9)) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ## [3.5.11](https://github.com/vuejs/core/compare/v3.5.10...v3.5.11) (2024-10-03) | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										12
									
								
								package.json
								
								
								
								
							
							
						
						
									
										12
									
								
								package.json
								
								
								
								
							|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|   "private": true, | ||||
|   "version": "3.5.11", | ||||
|   "packageManager": "pnpm@9.12.0", | ||||
|   "version": "3.5.12", | ||||
|   "packageManager": "pnpm@9.12.1", | ||||
|   "type": "module", | ||||
|   "scripts": { | ||||
|     "dev": "node scripts/dev.js", | ||||
|  | @ -66,9 +66,9 @@ | |||
|     "@rollup/plugin-json": "^6.1.0", | ||||
|     "@rollup/plugin-node-resolve": "^15.3.0", | ||||
|     "@rollup/plugin-replace": "5.0.4", | ||||
|     "@swc/core": "^1.7.28", | ||||
|     "@swc/core": "^1.7.35", | ||||
|     "@types/hash-sum": "^1.0.2", | ||||
|     "@types/node": "^20.16.10", | ||||
|     "@types/node": "^20.16.11", | ||||
|     "@types/semver": "^7.5.8", | ||||
|     "@types/serve-handler": "^6.1.4", | ||||
|     "@vitest/coverage-v8": "^2.1.1", | ||||
|  | @ -84,7 +84,7 @@ | |||
|     "jsdom": "^25.0.0", | ||||
|     "lint-staged": "^15.2.10", | ||||
|     "lodash": "^4.17.21", | ||||
|     "magic-string": "^0.30.11", | ||||
|     "magic-string": "^0.30.12", | ||||
|     "markdown-table": "^3.0.3", | ||||
|     "marked": "13.0.3", | ||||
|     "npm-run-all2": "^6.2.3", | ||||
|  | @ -105,7 +105,7 @@ | |||
|     "todomvc-app-css": "^2.4.3", | ||||
|     "tslib": "^2.7.0", | ||||
|     "typescript": "~5.6.2", | ||||
|     "typescript-eslint": "^8.8.0", | ||||
|     "typescript-eslint": "^8.8.1", | ||||
|     "vite": "catalog:", | ||||
|     "vitest": "^2.1.1" | ||||
|   }, | ||||
|  |  | |||
|  | @ -2068,3 +2068,13 @@ expectString(instance.actionText) | |||
| // public prop on $props should be optional
 | ||||
| // @ts-expect-error
 | ||||
| expectString(instance.$props.actionText) | ||||
| 
 | ||||
| // #12122
 | ||||
| defineComponent({ | ||||
|   props: { foo: String }, | ||||
|   render() { | ||||
|     expectType<{ readonly foo?: string }>(this.$props) | ||||
|     // @ts-expect-error
 | ||||
|     expectType<string>(this.$props) | ||||
|   }, | ||||
| }) | ||||
|  |  | |||
|  | @ -240,6 +240,23 @@ describe('withDefaults w/ defineProp type is different from the defaults type', | |||
|   res1.value | ||||
| }) | ||||
| 
 | ||||
| describe('withDefaults w/ defineProp discriminate union type', () => { | ||||
|   const props = withDefaults( | ||||
|     defineProps< | ||||
|       { type: 'button'; buttonType?: 'submit' } | { type: 'link'; href: string } | ||||
|     >(), | ||||
|     { | ||||
|       type: 'button', | ||||
|     }, | ||||
|   ) | ||||
|   if (props.type === 'button') { | ||||
|     expectType<'submit' | undefined>(props.buttonType) | ||||
|   } | ||||
|   if (props.type === 'link') { | ||||
|     expectType<string>(props.href) | ||||
|   } | ||||
| }) | ||||
| 
 | ||||
| describe('defineProps w/ runtime declaration', () => { | ||||
|   // runtime declaration
 | ||||
|   const props = defineProps({ | ||||
|  |  | |||
|  | @ -123,6 +123,7 @@ onMounted(() => { | |||
|     :prod="productionMode" | ||||
|     :ssr="useSSRMode" | ||||
|     :autoSave="autoSave" | ||||
|     :theme="theme" | ||||
|     @toggle-theme="toggleTheme" | ||||
|     @toggle-prod="toggleProdMode" | ||||
|     @toggle-ssr="toggleSSR" | ||||
|  |  | |||
|  | @ -15,6 +15,7 @@ const props = defineProps<{ | |||
|   prod: boolean | ||||
|   ssr: boolean | ||||
|   autoSave: boolean | ||||
|   theme: 'dark' | 'light' | ||||
| }>() | ||||
| const emit = defineEmits([ | ||||
|   'toggle-theme', | ||||
|  | @ -117,7 +118,11 @@ function toggleDark() { | |||
|       > | ||||
|         <span>{{ autoSave ? 'AutoSave ON' : 'AutoSave OFF' }}</span> | ||||
|       </button> | ||||
|       <button title="Toggle dark mode" class="toggle-dark" @click="toggleDark"> | ||||
|       <button | ||||
|         :title="`Switch to ${theme === 'dark' ? 'light' : 'dark'} theme`" | ||||
|         class="toggle-dark" | ||||
|         @click="toggleDark" | ||||
|       > | ||||
|         <Sun class="light" /> | ||||
|         <Moon class="dark" /> | ||||
|       </button> | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@vue/compiler-core", | ||||
|   "version": "3.5.11", | ||||
|   "version": "3.5.12", | ||||
|   "description": "@vue/compiler-core", | ||||
|   "main": "index.js", | ||||
|   "module": "dist/compiler-core.esm-bundler.js", | ||||
|  |  | |||
|  | @ -933,6 +933,10 @@ function getLoc(start: number, end?: number): SourceLocation { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| export function cloneLoc(loc: SourceLocation): SourceLocation { | ||||
|   return getLoc(loc.start.offset, loc.end.offset) | ||||
| } | ||||
| 
 | ||||
| function setLocEnd(loc: SourceLocation, end: number) { | ||||
|   loc.end = tokenizer.getPos(end) | ||||
|   loc.source = getSlice(loc.start.offset, end) | ||||
|  |  | |||
|  | @ -30,6 +30,7 @@ import { | |||
| import { ErrorCodes, createCompilerError } from '../errors' | ||||
| import { processExpression } from './transformExpression' | ||||
| import { validateBrowserExpression } from '../validateExpression' | ||||
| import { cloneLoc } from '../parser' | ||||
| import { CREATE_COMMENT, FRAGMENT } from '../runtimeHelpers' | ||||
| import { findDir, findProp, getMemoedVNodeCall, injectProp } from '../utils' | ||||
| import { PatchFlags } from '@vue/shared' | ||||
|  | @ -110,7 +111,7 @@ export function processIf( | |||
|     const branch = createIfBranch(node, dir) | ||||
|     const ifNode: IfNode = { | ||||
|       type: NodeTypes.IF, | ||||
|       loc: node.loc, | ||||
|       loc: cloneLoc(node.loc), | ||||
|       branches: [branch], | ||||
|     } | ||||
|     context.replaceNode(ifNode) | ||||
|  |  | |||
|  | @ -32,6 +32,23 @@ return function render(_ctx, _cache) { | |||
| }" | ||||
| `; | ||||
| 
 | ||||
| exports[`stringify static html > should bail for <option> elements with null values 1`] = ` | ||||
| "const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = Vue | ||||
| 
 | ||||
| return function render(_ctx, _cache) { | ||||
|   return (_openBlock(), _createElementBlock("div", null, _cache[0] || (_cache[0] = [ | ||||
|     _createElementVNode("select", null, [ | ||||
|       _createElementVNode("option", { value: null }), | ||||
|       _createElementVNode("option", { value: "1" }), | ||||
|       _createElementVNode("option", { value: "1" }), | ||||
|       _createElementVNode("option", { value: "1" }), | ||||
|       _createElementVNode("option", { value: "1" }), | ||||
|       _createElementVNode("option", { value: "1" }) | ||||
|     ], -1 /* HOISTED */) | ||||
|   ]))) | ||||
| }" | ||||
| `; | ||||
| 
 | ||||
| exports[`stringify static html > should bail for <option> elements with number values 1`] = ` | ||||
| "const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = Vue | ||||
| 
 | ||||
|  |  | |||
|  | @ -470,6 +470,17 @@ describe('stringify static html', () => { | |||
|     expect(code).toMatchSnapshot() | ||||
|   }) | ||||
| 
 | ||||
|   test('should bail for <option> elements with null values', () => { | ||||
|     const { ast, code } = compileWithStringify( | ||||
|       `<div><select><option :value="null" />${repeat( | ||||
|         `<option value="1" />`, | ||||
|         StringifyThresholds.ELEMENT_WITH_BINDING_COUNT, | ||||
|       )}</select></div>`,
 | ||||
|     ) | ||||
|     expect(ast.cached).toMatchObject([cachedArrayBailedMatcher()]) | ||||
|     expect(code).toMatchSnapshot() | ||||
|   }) | ||||
| 
 | ||||
|   test('eligible content (elements > 20) + non-eligible content', () => { | ||||
|     const { code } = compileWithStringify( | ||||
|       `<div>${repeat( | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@vue/compiler-dom", | ||||
|   "version": "3.5.11", | ||||
|   "version": "3.5.12", | ||||
|   "description": "@vue/compiler-dom", | ||||
|   "main": "index.js", | ||||
|   "module": "dist/compiler-dom.esm-bundler.js", | ||||
|  |  | |||
|  | @ -261,8 +261,7 @@ function analyzeNode(node: StringifiableNode): [number, number] | false { | |||
|           isOptionTag && | ||||
|           isStaticArgOf(p.arg, 'value') && | ||||
|           p.exp && | ||||
|           p.exp.ast && | ||||
|           p.exp.ast.type !== 'StringLiteral' | ||||
|           !p.exp.isStatic | ||||
|         ) { | ||||
|           return bail() | ||||
|         } | ||||
|  |  | |||
|  | @ -233,6 +233,33 @@ export default /*@__PURE__*/_defineComponent({ | |||
| 
 | ||||
|        | ||||
|      | ||||
| return {  } | ||||
| } | ||||
| 
 | ||||
| })" | ||||
| `; | ||||
| 
 | ||||
| exports[`defineProps > w/ extends intersection type 1`] = ` | ||||
| "import { defineComponent as _defineComponent } from 'vue' | ||||
| type Foo = { | ||||
|         x?: number; | ||||
|       }; | ||||
|       interface Props extends Foo { | ||||
|         z: number | ||||
|         y: string | ||||
|       } | ||||
|        | ||||
| export default /*@__PURE__*/_defineComponent({ | ||||
|   props: { | ||||
|     z: { type: Number, required: true }, | ||||
|     y: { type: String, required: true }, | ||||
|     x: { type: Number, required: false } | ||||
|   }, | ||||
|   setup(__props: any, { expose: __expose }) { | ||||
|   __expose(); | ||||
| 
 | ||||
|        | ||||
|      | ||||
| return {  } | ||||
| } | ||||
| 
 | ||||
|  | @ -268,6 +295,31 @@ export default /*@__PURE__*/_defineComponent({ | |||
| 
 | ||||
|      | ||||
|      | ||||
| return {  } | ||||
| } | ||||
| 
 | ||||
| })" | ||||
| `; | ||||
| 
 | ||||
| exports[`defineProps > w/ intersection type 1`] = ` | ||||
| "import { defineComponent as _defineComponent } from 'vue' | ||||
| type Foo = { | ||||
|         x?: number; | ||||
|       }; | ||||
|       type Bar = { | ||||
|         y: string; | ||||
|       }; | ||||
|        | ||||
| export default /*@__PURE__*/_defineComponent({ | ||||
|   props: { | ||||
|     x: { type: Number, required: false }, | ||||
|     y: { type: String, required: true } | ||||
|   }, | ||||
|   setup(__props: any, { expose: __expose }) { | ||||
|   __expose(); | ||||
| 
 | ||||
|        | ||||
|      | ||||
| return {  } | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -320,3 +320,22 @@ return { rest } | |||
| 
 | ||||
| }" | ||||
| `; | ||||
| 
 | ||||
| exports[`sfc reactive props destructure > with TSInstantiationExpression 1`] = ` | ||||
| "import { defineComponent as _defineComponent } from 'vue' | ||||
| type Foo = <T extends string | number>(data: T) => void | ||||
|        | ||||
| export default /*@__PURE__*/_defineComponent({ | ||||
|   props: { | ||||
|     value: { type: Function } | ||||
|   }, | ||||
|   setup(__props: any) { | ||||
| 
 | ||||
|        | ||||
|       const foo = __props.value<123> | ||||
|        | ||||
| return () => {} | ||||
| } | ||||
| 
 | ||||
| })" | ||||
| `; | ||||
|  |  | |||
|  | @ -261,6 +261,51 @@ const props = defineProps({ foo: String }) | |||
|     }) | ||||
|   }) | ||||
| 
 | ||||
|   test('w/ extends intersection type', () => { | ||||
|     const { content, bindings } = compile(` | ||||
|     <script setup lang="ts"> | ||||
|       type Foo = { | ||||
|         x?: number; | ||||
|       }; | ||||
|       interface Props extends Foo { | ||||
|         z: number | ||||
|         y: string | ||||
|       } | ||||
|       defineProps<Props>() | ||||
|     </script> | ||||
|     `)
 | ||||
|     assertCode(content) | ||||
|     expect(content).toMatch(`z: { type: Number, required: true }`) | ||||
|     expect(content).toMatch(`y: { type: String, required: true }`) | ||||
|     expect(content).toMatch(`x: { type: Number, required: false }`) | ||||
|     expect(bindings).toStrictEqual({ | ||||
|       x: BindingTypes.PROPS, | ||||
|       y: BindingTypes.PROPS, | ||||
|       z: BindingTypes.PROPS, | ||||
|     }) | ||||
|   }) | ||||
| 
 | ||||
|   test('w/ intersection type', () => { | ||||
|     const { content, bindings } = compile(` | ||||
|     <script setup lang="ts"> | ||||
|       type Foo = { | ||||
|         x?: number; | ||||
|       }; | ||||
|       type Bar = { | ||||
|         y: string; | ||||
|       }; | ||||
|       defineProps<Foo & Bar>() | ||||
|     </script> | ||||
|     `)
 | ||||
|     assertCode(content) | ||||
|     expect(content).toMatch(`y: { type: String, required: true }`) | ||||
|     expect(content).toMatch(`x: { type: Number, required: false }`) | ||||
|     expect(bindings).toStrictEqual({ | ||||
|       x: BindingTypes.PROPS, | ||||
|       y: BindingTypes.PROPS, | ||||
|     }) | ||||
|   }) | ||||
| 
 | ||||
|   test('w/ exported interface', () => { | ||||
|     const { content, bindings } = compile(` | ||||
|     <script setup lang="ts"> | ||||
|  |  | |||
|  | @ -198,6 +198,21 @@ describe('sfc reactive props destructure', () => { | |||
|   }`)
 | ||||
|   }) | ||||
| 
 | ||||
|   test('with TSInstantiationExpression', () => { | ||||
|     const { content } = compile( | ||||
|       ` | ||||
|       <script setup lang="ts"> | ||||
|       type Foo = <T extends string | number>(data: T) => void | ||||
|       const { value } = defineProps<{ value: Foo }>() | ||||
|       const foo = value<123> | ||||
|       </script> | ||||
|     `,
 | ||||
|       { isProd: true }, | ||||
|     ) | ||||
|     assertCode(content) | ||||
|     expect(content).toMatch(`const foo = __props.value<123>`) | ||||
|   }) | ||||
| 
 | ||||
|   test('aliasing', () => { | ||||
|     const { content, bindings } = compile(` | ||||
|       <script setup> | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@vue/compiler-sfc", | ||||
|   "version": "3.5.11", | ||||
|   "version": "3.5.12", | ||||
|   "description": "@vue/compiler-sfc", | ||||
|   "main": "dist/compiler-sfc.cjs.js", | ||||
|   "module": "dist/compiler-sfc.esm-browser.js", | ||||
|  | @ -62,6 +62,6 @@ | |||
|     "postcss-modules": "^6.0.0", | ||||
|     "postcss-selector-parser": "^6.1.2", | ||||
|     "pug": "^3.0.3", | ||||
|     "sass": "^1.79.4" | ||||
|     "sass": "^1.79.5" | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -10,6 +10,7 @@ import type { | |||
| import { walk } from 'estree-walker' | ||||
| import { | ||||
|   BindingTypes, | ||||
|   TS_NODE_TYPES, | ||||
|   extractIdentifiers, | ||||
|   isFunctionType, | ||||
|   isInDestructureAssignment, | ||||
|  | @ -240,10 +241,7 @@ export function transformDestructuredProps( | |||
|       if ( | ||||
|         parent && | ||||
|         parent.type.startsWith('TS') && | ||||
|         parent.type !== 'TSAsExpression' && | ||||
|         parent.type !== 'TSNonNullExpression' && | ||||
|         parent.type !== 'TSSatisfiesExpression' && | ||||
|         parent.type !== 'TSTypeAssertion' | ||||
|         !TS_NODE_TYPES.includes(parent.type) | ||||
|       ) { | ||||
|         return this.skip() | ||||
|       } | ||||
|  |  | |||
|  | @ -23,28 +23,48 @@ export interface StylePreprocessorResults { | |||
| 
 | ||||
| // .scss/.sass processor
 | ||||
| const scss: StylePreprocessor = (source, map, options, load = require) => { | ||||
|   const nodeSass = load('sass') | ||||
|   const finalOptions = { | ||||
|     ...options, | ||||
|     data: getSource(source, options.filename, options.additionalData), | ||||
|     file: options.filename, | ||||
|     outFile: options.filename, | ||||
|     sourceMap: !!map, | ||||
|   } | ||||
|   const nodeSass: typeof import('sass') = load('sass') | ||||
|   const { compileString, renderSync } = nodeSass | ||||
| 
 | ||||
|   const data = getSource(source, options.filename, options.additionalData) | ||||
|   let css: string | ||||
|   let dependencies: string[] | ||||
|   let sourceMap: any | ||||
| 
 | ||||
|   try { | ||||
|     const result = nodeSass.renderSync(finalOptions) | ||||
|     const dependencies = result.stats.includedFiles | ||||
|     if (map) { | ||||
|       return { | ||||
|         code: result.css.toString(), | ||||
|         map: merge(map, JSON.parse(result.map.toString())), | ||||
|         errors: [], | ||||
|         dependencies, | ||||
|       } | ||||
|     if (compileString) { | ||||
|       const { pathToFileURL, fileURLToPath }: typeof import('url') = load('url') | ||||
| 
 | ||||
|       const result = compileString(data, { | ||||
|         ...options, | ||||
|         url: pathToFileURL(options.filename), | ||||
|         sourceMap: !!map, | ||||
|       }) | ||||
|       css = result.css | ||||
|       dependencies = result.loadedUrls.map(url => fileURLToPath(url)) | ||||
|       sourceMap = map ? result.sourceMap! : undefined | ||||
|     } else { | ||||
|       const result = renderSync({ | ||||
|         ...options, | ||||
|         data, | ||||
|         file: options.filename, | ||||
|         outFile: options.filename, | ||||
|         sourceMap: !!map, | ||||
|       }) | ||||
|       css = result.css.toString() | ||||
|       dependencies = result.stats.includedFiles | ||||
|       sourceMap = map ? JSON.parse(result.map!.toString()) : undefined | ||||
|     } | ||||
| 
 | ||||
|     return { code: result.css.toString(), errors: [], dependencies } | ||||
|     if (map) { | ||||
|       return { | ||||
|         code: css, | ||||
|         errors: [], | ||||
|         dependencies, | ||||
|         map: merge(map, sourceMap!), | ||||
|       } | ||||
|     } | ||||
|     return { code: css, errors: [], dependencies } | ||||
|   } catch (e: any) { | ||||
|     return { code: '', errors: [e], dependencies: [] } | ||||
|   } | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@vue/compiler-ssr", | ||||
|   "version": "3.5.11", | ||||
|   "version": "3.5.12", | ||||
|   "description": "@vue/compiler-ssr", | ||||
|   "main": "dist/compiler-ssr.cjs.js", | ||||
|   "types": "dist/compiler-ssr.d.ts", | ||||
|  |  | |||
|  | @ -1107,4 +1107,36 @@ describe('reactivity/computed', () => { | |||
|       end.prop4.value, | ||||
|     ]).toMatchObject([-2, -4, 2, 3]) | ||||
|   }) | ||||
| 
 | ||||
|   test('performance when removing dependencies from deeply nested computeds', () => { | ||||
|     const base = ref(1) | ||||
|     const trigger = ref(true) | ||||
|     const computeds: ComputedRef<number>[] = [] | ||||
| 
 | ||||
|     const LAYERS = 30 | ||||
| 
 | ||||
|     for (let i = 0; i < LAYERS; i++) { | ||||
|       const earlier = [...computeds] | ||||
| 
 | ||||
|       computeds.push( | ||||
|         computed(() => { | ||||
|           return base.value + earlier.reduce((sum, c) => sum + c.value, 0) | ||||
|         }), | ||||
|       ) | ||||
|     } | ||||
| 
 | ||||
|     const tail = computed(() => | ||||
|       trigger.value ? computeds[computeds.length - 1].value : 0, | ||||
|     ) | ||||
| 
 | ||||
|     const t0 = performance.now() | ||||
|     expect(tail.value).toBe(2 ** (LAYERS - 1)) | ||||
|     const t1 = performance.now() | ||||
|     expect(t1 - t0).toBeLessThan(process.env.CI ? 100 : 30) | ||||
| 
 | ||||
|     trigger.value = false | ||||
|     expect(tail.value).toBe(0) | ||||
|     const t2 = performance.now() | ||||
|     expect(t2 - t1).toBeLessThan(process.env.CI ? 100 : 30) | ||||
|   }) | ||||
| }) | ||||
|  |  | |||
|  | @ -409,4 +409,14 @@ describe('reactivity/reactive', () => { | |||
|     e.effect.stop() | ||||
|     expect(targetMap.get(obj)?.get('x')).toBeFalsy() | ||||
|   }) | ||||
| 
 | ||||
|   test('should trigger reactivity when Map key is undefined', () => { | ||||
|     const map = reactive(new Map()) | ||||
|     const c = computed(() => map.get(void 0)) | ||||
| 
 | ||||
|     expect(c.value).toBe(void 0) | ||||
| 
 | ||||
|     map.set(void 0, 1) | ||||
|     expect(c.value).toBe(1) | ||||
|   }) | ||||
| }) | ||||
|  |  | |||
|  | @ -51,6 +51,7 @@ describe('reactivity/reactive/Array', () => { | |||
|     const raw = {} | ||||
|     const arr = reactive([{}, {}]) | ||||
|     arr.push(raw) | ||||
| 
 | ||||
|     expect(arr.indexOf(raw)).toBe(2) | ||||
|     expect(arr.indexOf(raw, 3)).toBe(-1) | ||||
|     expect(arr.includes(raw)).toBe(true) | ||||
|  | @ -89,6 +90,84 @@ describe('reactivity/reactive/Array', () => { | |||
|     expect(index).toBe(1) | ||||
|   }) | ||||
| 
 | ||||
|   // only non-existent reactive will try to search by using its raw value
 | ||||
|   describe('Array identity methods should not be called more than necessary', () => { | ||||
|     const identityMethods = ['includes', 'indexOf', 'lastIndexOf'] as const | ||||
| 
 | ||||
|     function instrumentArr(rawTarget: any[]) { | ||||
|       identityMethods.forEach(key => { | ||||
|         const spy = vi.fn(rawTarget[key] as any) | ||||
|         rawTarget[key] = spy | ||||
|       }) | ||||
|     } | ||||
| 
 | ||||
|     function searchValue(target: any[], ...args: unknown[]) { | ||||
|       return identityMethods.map(key => (target[key] as any)(...args)) | ||||
|     } | ||||
| 
 | ||||
|     function unInstrumentArr(rawTarget: any[]) { | ||||
|       identityMethods.forEach(key => { | ||||
|         ;(rawTarget[key] as any).mockClear() | ||||
|         // relink to prototype method
 | ||||
|         rawTarget[key] = Array.prototype[key] as any | ||||
|       }) | ||||
|     } | ||||
| 
 | ||||
|     function expectHaveBeenCalledTimes(rawTarget: any[], times: number) { | ||||
|       identityMethods.forEach(key => { | ||||
|         expect(rawTarget[key]).toHaveBeenCalledTimes(times) | ||||
|       }) | ||||
|     } | ||||
| 
 | ||||
|     test('should be called once with a non-existent raw value', () => { | ||||
|       const reactiveArr = reactive([]) | ||||
|       instrumentArr(toRaw(reactiveArr)) | ||||
|       const searchResult = searchValue(reactiveArr, {}) | ||||
| 
 | ||||
|       expectHaveBeenCalledTimes(toRaw(reactiveArr), 1) | ||||
|       expect(searchResult).toStrictEqual([false, -1, -1]) | ||||
| 
 | ||||
|       unInstrumentArr(toRaw(reactiveArr)) | ||||
|     }) | ||||
| 
 | ||||
|     test('should be called once with an existent reactive value', () => { | ||||
|       const existReactiveValue = reactive({}) | ||||
|       const reactiveArr = reactive([existReactiveValue, existReactiveValue]) | ||||
| 
 | ||||
|       instrumentArr(toRaw(reactiveArr)) | ||||
|       const searchResult = searchValue(reactiveArr, existReactiveValue) | ||||
| 
 | ||||
|       expectHaveBeenCalledTimes(toRaw(reactiveArr), 1) | ||||
|       expect(searchResult).toStrictEqual([true, 0, 1]) | ||||
| 
 | ||||
|       unInstrumentArr(toRaw(reactiveArr)) | ||||
|     }) | ||||
| 
 | ||||
|     test('should be called twice with a non-existent reactive value', () => { | ||||
|       const reactiveArr = reactive([]) | ||||
|       instrumentArr(toRaw(reactiveArr)) | ||||
|       const searchResult = searchValue(reactiveArr, reactive({})) | ||||
| 
 | ||||
|       expectHaveBeenCalledTimes(toRaw(reactiveArr), 2) | ||||
|       expect(searchResult).toStrictEqual([false, -1, -1]) | ||||
| 
 | ||||
|       unInstrumentArr(toRaw(reactiveArr)) | ||||
|     }) | ||||
| 
 | ||||
|     test('should be called twice with a non-existent reactive value, but the raw value exists', () => { | ||||
|       const existRaw = {} | ||||
|       const reactiveArr = reactive([existRaw, existRaw]) | ||||
| 
 | ||||
|       instrumentArr(toRaw(reactiveArr)) | ||||
|       const searchResult = searchValue(reactiveArr, reactive(existRaw)) | ||||
| 
 | ||||
|       expectHaveBeenCalledTimes(toRaw(reactiveArr), 2) | ||||
|       expect(searchResult).toStrictEqual([true, 0, 1]) | ||||
| 
 | ||||
|       unInstrumentArr(toRaw(reactiveArr)) | ||||
|     }) | ||||
|   }) | ||||
| 
 | ||||
|   test('delete on Array should not trigger length dependency', () => { | ||||
|     const arr = reactive([1, 2, 3]) | ||||
|     const fn = vi.fn() | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@vue/reactivity", | ||||
|   "version": "3.5.11", | ||||
|   "version": "3.5.12", | ||||
|   "description": "@vue/reactivity", | ||||
|   "main": "index.js", | ||||
|   "module": "dist/reactivity.esm-bundler.js", | ||||
|  |  | |||
|  | @ -8,7 +8,14 @@ import { | |||
| } from './reactive' | ||||
| import { ITERATE_KEY, MAP_KEY_ITERATE_KEY, track, trigger } from './dep' | ||||
| import { ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './constants' | ||||
| import { capitalize, hasChanged, hasOwn, isMap, toRawType } from '@vue/shared' | ||||
| import { | ||||
|   capitalize, | ||||
|   extend, | ||||
|   hasChanged, | ||||
|   hasOwn, | ||||
|   isMap, | ||||
|   toRawType, | ||||
| } from '@vue/shared' | ||||
| import { warn } from './warning' | ||||
| 
 | ||||
| type CollectionTypes = IterableCollections | WeakCollections | ||||
|  | @ -23,152 +30,6 @@ const toShallow = <T extends unknown>(value: T): T => value | |||
| const getProto = <T extends CollectionTypes>(v: T): any => | ||||
|   Reflect.getPrototypeOf(v) | ||||
| 
 | ||||
| function get( | ||||
|   target: MapTypes, | ||||
|   key: unknown, | ||||
|   isReadonly = false, | ||||
|   isShallow = false, | ||||
| ) { | ||||
|   // #1772: readonly(reactive(Map)) should return readonly + reactive version
 | ||||
|   // of the value
 | ||||
|   target = target[ReactiveFlags.RAW] | ||||
|   const rawTarget = toRaw(target) | ||||
|   const rawKey = toRaw(key) | ||||
|   if (!isReadonly) { | ||||
|     if (hasChanged(key, rawKey)) { | ||||
|       track(rawTarget, TrackOpTypes.GET, key) | ||||
|     } | ||||
|     track(rawTarget, TrackOpTypes.GET, rawKey) | ||||
|   } | ||||
|   const { has } = getProto(rawTarget) | ||||
|   const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive | ||||
|   if (has.call(rawTarget, key)) { | ||||
|     return wrap(target.get(key)) | ||||
|   } else if (has.call(rawTarget, rawKey)) { | ||||
|     return wrap(target.get(rawKey)) | ||||
|   } else if (target !== rawTarget) { | ||||
|     // #3602 readonly(reactive(Map))
 | ||||
|     // ensure that the nested reactive `Map` can do tracking for itself
 | ||||
|     target.get(key) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| function has(this: CollectionTypes, key: unknown, isReadonly = false): boolean { | ||||
|   const target = this[ReactiveFlags.RAW] | ||||
|   const rawTarget = toRaw(target) | ||||
|   const rawKey = toRaw(key) | ||||
|   if (!isReadonly) { | ||||
|     if (hasChanged(key, rawKey)) { | ||||
|       track(rawTarget, TrackOpTypes.HAS, key) | ||||
|     } | ||||
|     track(rawTarget, TrackOpTypes.HAS, rawKey) | ||||
|   } | ||||
|   return key === rawKey | ||||
|     ? target.has(key) | ||||
|     : target.has(key) || target.has(rawKey) | ||||
| } | ||||
| 
 | ||||
| function size(target: IterableCollections, isReadonly = false) { | ||||
|   target = target[ReactiveFlags.RAW] | ||||
|   !isReadonly && track(toRaw(target), TrackOpTypes.ITERATE, ITERATE_KEY) | ||||
|   return Reflect.get(target, 'size', target) | ||||
| } | ||||
| 
 | ||||
| function add(this: SetTypes, value: unknown, _isShallow = false) { | ||||
|   if (!_isShallow && !isShallow(value) && !isReadonly(value)) { | ||||
|     value = toRaw(value) | ||||
|   } | ||||
|   const target = toRaw(this) | ||||
|   const proto = getProto(target) | ||||
|   const hadKey = proto.has.call(target, value) | ||||
|   if (!hadKey) { | ||||
|     target.add(value) | ||||
|     trigger(target, TriggerOpTypes.ADD, value, value) | ||||
|   } | ||||
|   return this | ||||
| } | ||||
| 
 | ||||
| function set(this: MapTypes, key: unknown, value: unknown, _isShallow = false) { | ||||
|   if (!_isShallow && !isShallow(value) && !isReadonly(value)) { | ||||
|     value = toRaw(value) | ||||
|   } | ||||
|   const target = toRaw(this) | ||||
|   const { has, get } = getProto(target) | ||||
| 
 | ||||
|   let hadKey = has.call(target, key) | ||||
|   if (!hadKey) { | ||||
|     key = toRaw(key) | ||||
|     hadKey = has.call(target, key) | ||||
|   } else if (__DEV__) { | ||||
|     checkIdentityKeys(target, has, key) | ||||
|   } | ||||
| 
 | ||||
|   const oldValue = get.call(target, key) | ||||
|   target.set(key, value) | ||||
|   if (!hadKey) { | ||||
|     trigger(target, TriggerOpTypes.ADD, key, value) | ||||
|   } else if (hasChanged(value, oldValue)) { | ||||
|     trigger(target, TriggerOpTypes.SET, key, value, oldValue) | ||||
|   } | ||||
|   return this | ||||
| } | ||||
| 
 | ||||
| function deleteEntry(this: CollectionTypes, key: unknown) { | ||||
|   const target = toRaw(this) | ||||
|   const { has, get } = getProto(target) | ||||
|   let hadKey = has.call(target, key) | ||||
|   if (!hadKey) { | ||||
|     key = toRaw(key) | ||||
|     hadKey = has.call(target, key) | ||||
|   } else if (__DEV__) { | ||||
|     checkIdentityKeys(target, has, key) | ||||
|   } | ||||
| 
 | ||||
|   const oldValue = get ? get.call(target, key) : undefined | ||||
|   // forward the operation before queueing reactions
 | ||||
|   const result = target.delete(key) | ||||
|   if (hadKey) { | ||||
|     trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue) | ||||
|   } | ||||
|   return result | ||||
| } | ||||
| 
 | ||||
| function clear(this: IterableCollections) { | ||||
|   const target = toRaw(this) | ||||
|   const hadItems = target.size !== 0 | ||||
|   const oldTarget = __DEV__ | ||||
|     ? isMap(target) | ||||
|       ? new Map(target) | ||||
|       : new Set(target) | ||||
|     : undefined | ||||
|   // forward the operation before queueing reactions
 | ||||
|   const result = target.clear() | ||||
|   if (hadItems) { | ||||
|     trigger(target, TriggerOpTypes.CLEAR, undefined, undefined, oldTarget) | ||||
|   } | ||||
|   return result | ||||
| } | ||||
| 
 | ||||
| function createForEach(isReadonly: boolean, isShallow: boolean) { | ||||
|   return function forEach( | ||||
|     this: IterableCollections, | ||||
|     callback: Function, | ||||
|     thisArg?: unknown, | ||||
|   ) { | ||||
|     const observed = this | ||||
|     const target = observed[ReactiveFlags.RAW] | ||||
|     const rawTarget = toRaw(target) | ||||
|     const wrap = isShallow ? toShallow : isReadonly ? toReadonly : toReactive | ||||
|     !isReadonly && track(rawTarget, TrackOpTypes.ITERATE, ITERATE_KEY) | ||||
|     return target.forEach((value: unknown, key: unknown) => { | ||||
|       // important: make sure the callback is
 | ||||
|       // 1. invoked with the reactive map as `this` and 3rd arg
 | ||||
|       // 2. the value received should be a corresponding reactive/readonly.
 | ||||
|       return callback.call(thisArg, wrap(value), wrap(key), observed) | ||||
|     }) | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| function createIterableMethod( | ||||
|   method: string | symbol, | ||||
|   isReadonly: boolean, | ||||
|  | @ -232,74 +93,158 @@ function createReadonlyMethod(type: TriggerOpTypes): Function { | |||
| 
 | ||||
| type Instrumentations = Record<string | symbol, Function | number> | ||||
| 
 | ||||
| function createInstrumentations() { | ||||
|   const mutableInstrumentations: Instrumentations = { | ||||
| function createInstrumentations( | ||||
|   readonly: boolean, | ||||
|   shallow: boolean, | ||||
| ): Instrumentations { | ||||
|   const instrumentations: Instrumentations = { | ||||
|     get(this: MapTypes, key: unknown) { | ||||
|       return get(this, key) | ||||
|       // #1772: readonly(reactive(Map)) should return readonly + reactive version
 | ||||
|       // of the value
 | ||||
|       const target = this[ReactiveFlags.RAW] | ||||
|       const rawTarget = toRaw(target) | ||||
|       const rawKey = toRaw(key) | ||||
|       if (!readonly) { | ||||
|         if (hasChanged(key, rawKey)) { | ||||
|           track(rawTarget, TrackOpTypes.GET, key) | ||||
|         } | ||||
|         track(rawTarget, TrackOpTypes.GET, rawKey) | ||||
|       } | ||||
|       const { has } = getProto(rawTarget) | ||||
|       const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive | ||||
|       if (has.call(rawTarget, key)) { | ||||
|         return wrap(target.get(key)) | ||||
|       } else if (has.call(rawTarget, rawKey)) { | ||||
|         return wrap(target.get(rawKey)) | ||||
|       } else if (target !== rawTarget) { | ||||
|         // #3602 readonly(reactive(Map))
 | ||||
|         // ensure that the nested reactive `Map` can do tracking for itself
 | ||||
|         target.get(key) | ||||
|       } | ||||
|     }, | ||||
|     get size() { | ||||
|       return size(this as unknown as IterableCollections) | ||||
|       const target = (this as unknown as IterableCollections)[ReactiveFlags.RAW] | ||||
|       !readonly && track(toRaw(target), TrackOpTypes.ITERATE, ITERATE_KEY) | ||||
|       return Reflect.get(target, 'size', target) | ||||
|     }, | ||||
|     has(this: CollectionTypes, key: unknown): boolean { | ||||
|       const target = this[ReactiveFlags.RAW] | ||||
|       const rawTarget = toRaw(target) | ||||
|       const rawKey = toRaw(key) | ||||
|       if (!readonly) { | ||||
|         if (hasChanged(key, rawKey)) { | ||||
|           track(rawTarget, TrackOpTypes.HAS, key) | ||||
|         } | ||||
|         track(rawTarget, TrackOpTypes.HAS, rawKey) | ||||
|       } | ||||
|       return key === rawKey | ||||
|         ? target.has(key) | ||||
|         : target.has(key) || target.has(rawKey) | ||||
|     }, | ||||
|     forEach(this: IterableCollections, callback: Function, thisArg?: unknown) { | ||||
|       const observed = this | ||||
|       const target = observed[ReactiveFlags.RAW] | ||||
|       const rawTarget = toRaw(target) | ||||
|       const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive | ||||
|       !readonly && track(rawTarget, TrackOpTypes.ITERATE, ITERATE_KEY) | ||||
|       return target.forEach((value: unknown, key: unknown) => { | ||||
|         // important: make sure the callback is
 | ||||
|         // 1. invoked with the reactive map as `this` and 3rd arg
 | ||||
|         // 2. the value received should be a corresponding reactive/readonly.
 | ||||
|         return callback.call(thisArg, wrap(value), wrap(key), observed) | ||||
|       }) | ||||
|     }, | ||||
|     has, | ||||
|     add, | ||||
|     set, | ||||
|     delete: deleteEntry, | ||||
|     clear, | ||||
|     forEach: createForEach(false, false), | ||||
|   } | ||||
| 
 | ||||
|   const shallowInstrumentations: Instrumentations = { | ||||
|     get(this: MapTypes, key: unknown) { | ||||
|       return get(this, key, false, true) | ||||
|     }, | ||||
|     get size() { | ||||
|       return size(this as unknown as IterableCollections) | ||||
|     }, | ||||
|     has, | ||||
|     add(this: SetTypes, value: unknown) { | ||||
|       return add.call(this, value, true) | ||||
|     }, | ||||
|     set(this: MapTypes, key: unknown, value: unknown) { | ||||
|       return set.call(this, key, value, true) | ||||
|     }, | ||||
|     delete: deleteEntry, | ||||
|     clear, | ||||
|     forEach: createForEach(false, true), | ||||
|   } | ||||
|   extend( | ||||
|     instrumentations, | ||||
|     readonly | ||||
|       ? { | ||||
|           add: createReadonlyMethod(TriggerOpTypes.ADD), | ||||
|           set: createReadonlyMethod(TriggerOpTypes.SET), | ||||
|           delete: createReadonlyMethod(TriggerOpTypes.DELETE), | ||||
|           clear: createReadonlyMethod(TriggerOpTypes.CLEAR), | ||||
|         } | ||||
|       : { | ||||
|           add(this: SetTypes, value: unknown) { | ||||
|             if (!shallow && !isShallow(value) && !isReadonly(value)) { | ||||
|               value = toRaw(value) | ||||
|             } | ||||
|             const target = toRaw(this) | ||||
|             const proto = getProto(target) | ||||
|             const hadKey = proto.has.call(target, value) | ||||
|             if (!hadKey) { | ||||
|               target.add(value) | ||||
|               trigger(target, TriggerOpTypes.ADD, value, value) | ||||
|             } | ||||
|             return this | ||||
|           }, | ||||
|           set(this: MapTypes, key: unknown, value: unknown) { | ||||
|             if (!shallow && !isShallow(value) && !isReadonly(value)) { | ||||
|               value = toRaw(value) | ||||
|             } | ||||
|             const target = toRaw(this) | ||||
|             const { has, get } = getProto(target) | ||||
| 
 | ||||
|   const readonlyInstrumentations: Instrumentations = { | ||||
|     get(this: MapTypes, key: unknown) { | ||||
|       return get(this, key, true) | ||||
|     }, | ||||
|     get size() { | ||||
|       return size(this as unknown as IterableCollections, true) | ||||
|     }, | ||||
|     has(this: MapTypes, key: unknown) { | ||||
|       return has.call(this, key, true) | ||||
|     }, | ||||
|     add: createReadonlyMethod(TriggerOpTypes.ADD), | ||||
|     set: createReadonlyMethod(TriggerOpTypes.SET), | ||||
|     delete: createReadonlyMethod(TriggerOpTypes.DELETE), | ||||
|     clear: createReadonlyMethod(TriggerOpTypes.CLEAR), | ||||
|     forEach: createForEach(true, false), | ||||
|   } | ||||
|             let hadKey = has.call(target, key) | ||||
|             if (!hadKey) { | ||||
|               key = toRaw(key) | ||||
|               hadKey = has.call(target, key) | ||||
|             } else if (__DEV__) { | ||||
|               checkIdentityKeys(target, has, key) | ||||
|             } | ||||
| 
 | ||||
|   const shallowReadonlyInstrumentations: Instrumentations = { | ||||
|     get(this: MapTypes, key: unknown) { | ||||
|       return get(this, key, true, true) | ||||
|     }, | ||||
|     get size() { | ||||
|       return size(this as unknown as IterableCollections, true) | ||||
|     }, | ||||
|     has(this: MapTypes, key: unknown) { | ||||
|       return has.call(this, key, true) | ||||
|     }, | ||||
|     add: createReadonlyMethod(TriggerOpTypes.ADD), | ||||
|     set: createReadonlyMethod(TriggerOpTypes.SET), | ||||
|     delete: createReadonlyMethod(TriggerOpTypes.DELETE), | ||||
|     clear: createReadonlyMethod(TriggerOpTypes.CLEAR), | ||||
|     forEach: createForEach(true, true), | ||||
|   } | ||||
|             const oldValue = get.call(target, key) | ||||
|             target.set(key, value) | ||||
|             if (!hadKey) { | ||||
|               trigger(target, TriggerOpTypes.ADD, key, value) | ||||
|             } else if (hasChanged(value, oldValue)) { | ||||
|               trigger(target, TriggerOpTypes.SET, key, value, oldValue) | ||||
|             } | ||||
|             return this | ||||
|           }, | ||||
|           delete(this: CollectionTypes, key: unknown) { | ||||
|             const target = toRaw(this) | ||||
|             const { has, get } = getProto(target) | ||||
|             let hadKey = has.call(target, key) | ||||
|             if (!hadKey) { | ||||
|               key = toRaw(key) | ||||
|               hadKey = has.call(target, key) | ||||
|             } else if (__DEV__) { | ||||
|               checkIdentityKeys(target, has, key) | ||||
|             } | ||||
| 
 | ||||
|             const oldValue = get ? get.call(target, key) : undefined | ||||
|             // forward the operation before queueing reactions
 | ||||
|             const result = target.delete(key) | ||||
|             if (hadKey) { | ||||
|               trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue) | ||||
|             } | ||||
|             return result | ||||
|           }, | ||||
|           clear(this: IterableCollections) { | ||||
|             const target = toRaw(this) | ||||
|             const hadItems = target.size !== 0 | ||||
|             const oldTarget = __DEV__ | ||||
|               ? isMap(target) | ||||
|                 ? new Map(target) | ||||
|                 : new Set(target) | ||||
|               : undefined | ||||
|             // forward the operation before queueing reactions
 | ||||
|             const result = target.clear() | ||||
|             if (hadItems) { | ||||
|               trigger( | ||||
|                 target, | ||||
|                 TriggerOpTypes.CLEAR, | ||||
|                 undefined, | ||||
|                 undefined, | ||||
|                 oldTarget, | ||||
|               ) | ||||
|             } | ||||
|             return result | ||||
|           }, | ||||
|         }, | ||||
|   ) | ||||
| 
 | ||||
|   const iteratorMethods = [ | ||||
|     'keys', | ||||
|  | @ -309,39 +254,14 @@ function createInstrumentations() { | |||
|   ] as const | ||||
| 
 | ||||
|   iteratorMethods.forEach(method => { | ||||
|     mutableInstrumentations[method] = createIterableMethod(method, false, false) | ||||
|     readonlyInstrumentations[method] = createIterableMethod(method, true, false) | ||||
|     shallowInstrumentations[method] = createIterableMethod(method, false, true) | ||||
|     shallowReadonlyInstrumentations[method] = createIterableMethod( | ||||
|       method, | ||||
|       true, | ||||
|       true, | ||||
|     ) | ||||
|     instrumentations[method] = createIterableMethod(method, readonly, shallow) | ||||
|   }) | ||||
| 
 | ||||
|   return [ | ||||
|     mutableInstrumentations, | ||||
|     readonlyInstrumentations, | ||||
|     shallowInstrumentations, | ||||
|     shallowReadonlyInstrumentations, | ||||
|   ] | ||||
|   return instrumentations | ||||
| } | ||||
| 
 | ||||
| const [ | ||||
|   mutableInstrumentations, | ||||
|   readonlyInstrumentations, | ||||
|   shallowInstrumentations, | ||||
|   shallowReadonlyInstrumentations, | ||||
| ] = /* @__PURE__*/ createInstrumentations() | ||||
| 
 | ||||
| function createInstrumentationGetter(isReadonly: boolean, shallow: boolean) { | ||||
|   const instrumentations = shallow | ||||
|     ? isReadonly | ||||
|       ? shallowReadonlyInstrumentations | ||||
|       : shallowInstrumentations | ||||
|     : isReadonly | ||||
|       ? readonlyInstrumentations | ||||
|       : mutableInstrumentations | ||||
|   const instrumentations = createInstrumentations(isReadonly, shallow) | ||||
| 
 | ||||
|   return ( | ||||
|     target: CollectionTypes, | ||||
|  |  | |||
|  | @ -340,7 +340,7 @@ export function trigger( | |||
|       }) | ||||
|     } else { | ||||
|       // schedule runs for SET | ADD | DELETE
 | ||||
|       if (key !== void 0) { | ||||
|       if (key !== void 0 || depsMap.has(void 0)) { | ||||
|         run(depsMap.get(key)) | ||||
|       } | ||||
| 
 | ||||
|  |  | |||
|  | @ -426,23 +426,24 @@ function removeSub(link: Link, soft = false) { | |||
|     nextSub.prevSub = prevSub | ||||
|     link.nextSub = undefined | ||||
|   } | ||||
|   if (dep.subs === link) { | ||||
|     // was previous tail, point new tail to prev
 | ||||
|     dep.subs = prevSub | ||||
|   } | ||||
|   if (__DEV__ && dep.subsHead === link) { | ||||
|     // was previous head, point new head to next
 | ||||
|     dep.subsHead = nextSub | ||||
|   } | ||||
| 
 | ||||
|   if (!dep.subs && dep.computed) { | ||||
|     // if computed, unsubscribe it from all its deps so this computed and its
 | ||||
|     // value can be GCed
 | ||||
|     dep.computed.flags &= ~EffectFlags.TRACKING | ||||
|     for (let l = dep.computed.deps; l; l = l.nextDep) { | ||||
|       // here we are only "soft" unsubscribing because the computed still keeps
 | ||||
|       // referencing the deps and the dep should not decrease its sub count
 | ||||
|       removeSub(l, true) | ||||
|   if (dep.subs === link) { | ||||
|     // was previous tail, point new tail to prev
 | ||||
|     dep.subs = prevSub | ||||
| 
 | ||||
|     if (!prevSub && dep.computed) { | ||||
|       // if computed, unsubscribe it from all its deps so this computed and its
 | ||||
|       // value can be GCed
 | ||||
|       dep.computed.flags &= ~EffectFlags.TRACKING | ||||
|       for (let l = dep.computed.deps; l; l = l.nextDep) { | ||||
|         // here we are only "soft" unsubscribing because the computed still keeps
 | ||||
|         // referencing the deps and the dep should not decrease its sub count
 | ||||
|         removeSub(l, true) | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|  |  | |||
|  | @ -333,6 +333,30 @@ describe('component props', () => { | |||
|     }) | ||||
|   }) | ||||
| 
 | ||||
|   //#12011
 | ||||
|   test('replace camelize with hyphenate to handle props key', () => { | ||||
|     const Comp = { | ||||
|       props: { | ||||
|         hasB4BProp: { type: Boolean, required: true }, | ||||
|       }, | ||||
|       setup() { | ||||
|         return () => null | ||||
|       }, | ||||
|     } | ||||
|     render( | ||||
|       h('div', {}, [ | ||||
|         h(Comp, { | ||||
|           'has-b-4-b-prop': true, | ||||
|         }), | ||||
|         h(Comp, { | ||||
|           'has-b4-b-prop': true, | ||||
|         }), | ||||
|       ]), | ||||
|       nodeOps.createElement('div'), | ||||
|     ) | ||||
|     expect(`Missing required prop: "hasB4BProp"`).not.toHaveBeenWarned() | ||||
|   }) | ||||
| 
 | ||||
|   test('warn props mutation', () => { | ||||
|     let instance: ComponentInternalInstance | ||||
|     let setupProps: any | ||||
|  |  | |||
|  | @ -32,6 +32,12 @@ describe('renderSlot', () => { | |||
|     expect(vnode.key).toBe('foo') | ||||
|   }) | ||||
| 
 | ||||
|   it('should allow symbol values for slot prop key', () => { | ||||
|     const key = Symbol() | ||||
|     const vnode = renderSlot({ default: () => [h('div')] }, 'default', { key }) | ||||
|     expect(vnode.key).toBe('_default') | ||||
|   }) | ||||
| 
 | ||||
|   it('should render slot fallback', () => { | ||||
|     const vnode = renderSlot({}, 'default', { key: 'foo' }, () => ['fallback']) | ||||
|     expect(vnode.children).toEqual(['fallback']) | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ import { | |||
|   defineAsyncComponent, | ||||
|   defineComponent, | ||||
|   h, | ||||
|   onServerPrefetch, | ||||
|   useId, | ||||
| } from 'vue' | ||||
| import { renderToString } from '@vue/server-renderer' | ||||
|  | @ -145,6 +146,40 @@ describe('useId', () => { | |||
|     expect(await getOutput(() => factory(16, 0))).toBe(expected) | ||||
|   }) | ||||
| 
 | ||||
|   test('components with serverPrefetch', async () => { | ||||
|     const factory = (): ReturnType<TestCaseFactory> => { | ||||
|       const SPOne = defineComponent({ | ||||
|         setup() { | ||||
|           onServerPrefetch(() => {}) | ||||
|           return () => h(BasicComponentWithUseId) | ||||
|         }, | ||||
|       }) | ||||
| 
 | ||||
|       const SPTwo = defineComponent({ | ||||
|         render() { | ||||
|           return h(BasicComponentWithUseId) | ||||
|         }, | ||||
|       }) | ||||
| 
 | ||||
|       const app = createApp({ | ||||
|         setup() { | ||||
|           const id1 = useId() | ||||
|           const id2 = useId() | ||||
|           return () => [id1, ' ', id2, ' ', h(SPOne), ' ', h(SPTwo)] | ||||
|         }, | ||||
|       }) | ||||
|       return [app, []] | ||||
|     } | ||||
| 
 | ||||
|     const expected = | ||||
|       'v-0 v-1 ' + // root
 | ||||
|       'v-0-0 v-0-1 ' + // inside first async subtree
 | ||||
|       'v-2 v-3' // inside second async subtree
 | ||||
|     // assert different async resolution order does not affect id stable-ness
 | ||||
|     expect(await getOutput(() => factory())).toBe(expected) | ||||
|     expect(await getOutput(() => factory())).toBe(expected) | ||||
|   }) | ||||
| 
 | ||||
|   test('async setup()', async () => { | ||||
|     const factory = ( | ||||
|       delay1: number, | ||||
|  |  | |||
|  | @ -153,10 +153,10 @@ describe('useModel', () => { | |||
| 
 | ||||
|     const compRender = vi.fn() | ||||
|     const Comp = defineComponent({ | ||||
|       props: ['fooBar'], | ||||
|       emits: ['update:fooBar'], | ||||
|       props: ['foo-bar'], | ||||
|       emits: ['update:foo-bar'], | ||||
|       setup(props) { | ||||
|         foo = useModel(props, 'fooBar') | ||||
|         foo = useModel(props, 'foo-bar') | ||||
|         return () => { | ||||
|           compRender() | ||||
|           return foo.value | ||||
|  | @ -192,10 +192,10 @@ describe('useModel', () => { | |||
| 
 | ||||
|     const compRender = vi.fn() | ||||
|     const Comp = defineComponent({ | ||||
|       props: ['fooBar'], | ||||
|       emits: ['update:fooBar'], | ||||
|       props: ['foo-bar'], | ||||
|       emits: ['update:foo-bar'], | ||||
|       setup(props) { | ||||
|         foo = useModel(props, 'fooBar') | ||||
|         foo = useModel(props, 'foo-bar') | ||||
|         return () => { | ||||
|           compRender() | ||||
|           return foo.value | ||||
|  |  | |||
|  | @ -1613,6 +1613,36 @@ describe('SSR hydration', () => { | |||
|     `)
 | ||||
|   }) | ||||
| 
 | ||||
|   test('Suspense + transition appear', async () => { | ||||
|     const { vnode, container } = mountWithHydration( | ||||
|       `<template><div>foo</div></template>`, | ||||
|       () => | ||||
|         h(Suspense, {}, () => | ||||
|           h( | ||||
|             Transition, | ||||
|             { appear: true }, | ||||
|             { | ||||
|               default: () => h('div', 'foo'), | ||||
|             }, | ||||
|           ), | ||||
|         ), | ||||
|     ) | ||||
| 
 | ||||
|     expect(vnode.el).toBe(container.firstChild) | ||||
|     // wait for hydration to finish
 | ||||
|     await new Promise(r => setTimeout(r)) | ||||
| 
 | ||||
|     expect(container.firstChild).toMatchInlineSnapshot(` | ||||
|       <div | ||||
|         class="v-enter-from v-enter-active" | ||||
|       > | ||||
|         foo | ||||
|       </div> | ||||
|     `)
 | ||||
|     await nextTick() | ||||
|     expect(vnode.el).toBe(container.firstChild) | ||||
|   }) | ||||
| 
 | ||||
|   // #10607
 | ||||
|   test('update component stable slot (prod + optimized mode)', async () => { | ||||
|     __DEV__ = false | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
| import { | ||||
|   Fragment, | ||||
|   type FunctionalComponent, | ||||
|   Teleport, | ||||
|   createBlock, | ||||
|   createCommentVNode, | ||||
|   createElementBlock, | ||||
|  | @ -391,6 +392,26 @@ describe('attribute fallthrough', () => { | |||
|     expect(`Extraneous non-emits event listeners`).toHaveBeenWarned() | ||||
|   }) | ||||
| 
 | ||||
|   it('should warn when fallthrough fails on teleport root node', () => { | ||||
|     const Parent = { | ||||
|       render() { | ||||
|         return h(Child, { class: 'parent' }) | ||||
|       }, | ||||
|     } | ||||
|     const root = document.createElement('div') | ||||
| 
 | ||||
|     const Child = defineComponent({ | ||||
|       render() { | ||||
|         return h(Teleport, { to: root }, h('div')) | ||||
|       }, | ||||
|     }) | ||||
| 
 | ||||
|     document.body.appendChild(root) | ||||
|     render(h(Parent), root) | ||||
| 
 | ||||
|     expect(`Extraneous non-props attributes (class)`).toHaveBeenWarned() | ||||
|   }) | ||||
| 
 | ||||
|   it('should dedupe same listeners when $attrs is used during render', () => { | ||||
|     const click = vi.fn() | ||||
|     const count = ref(0) | ||||
|  |  | |||
|  | @ -217,6 +217,7 @@ describe('api: template refs', () => { | |||
|     } | ||||
|     render(h(Comp), root) | ||||
|     expect(state.refKey).toBe(root.children[0]) | ||||
|     expect('Template ref "refKey" used on a non-ref value').toHaveBeenWarned() | ||||
|   }) | ||||
| 
 | ||||
|   test('multiple root refs', () => { | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@vue/runtime-core", | ||||
|   "version": "3.5.11", | ||||
|   "version": "3.5.12", | ||||
|   "description": "@vue/runtime-core", | ||||
|   "main": "index.js", | ||||
|   "module": "dist/runtime-core.esm-bundler.js", | ||||
|  |  | |||
|  | @ -265,7 +265,7 @@ export function defineComponent< | |||
|         Mixin, | ||||
|         Extends, | ||||
|         ResolvedEmits, | ||||
|         RuntimeEmitsKeys, | ||||
|         {}, | ||||
|         {}, | ||||
|         false, | ||||
|         InjectOptions, | ||||
|  |  | |||
|  | @ -331,21 +331,23 @@ type PropsWithDefaults< | |||
|   T, | ||||
|   Defaults extends InferDefaults<T>, | ||||
|   BKeys extends keyof T, | ||||
| > = Readonly<MappedOmit<T, keyof Defaults>> & { | ||||
|   readonly [K in keyof Defaults as K extends keyof T | ||||
|     ? K | ||||
|     : never]-?: K extends keyof T | ||||
|     ? Defaults[K] extends undefined | ||||
|       ? IfAny<Defaults[K], NotUndefined<T[K]>, T[K]> | ||||
|       : NotUndefined<T[K]> | ||||
|     : never | ||||
| } & { | ||||
|   readonly [K in BKeys]-?: K extends keyof Defaults | ||||
|     ? Defaults[K] extends undefined | ||||
|       ? boolean | undefined | ||||
|       : boolean | ||||
|     : boolean | ||||
| } | ||||
| > = T extends unknown | ||||
|   ? Readonly<MappedOmit<T, keyof Defaults>> & { | ||||
|       readonly [K in keyof Defaults as K extends keyof T | ||||
|         ? K | ||||
|         : never]-?: K extends keyof T | ||||
|         ? Defaults[K] extends undefined | ||||
|           ? IfAny<Defaults[K], NotUndefined<T[K]>, T[K]> | ||||
|           : NotUndefined<T[K]> | ||||
|         : never | ||||
|     } & { | ||||
|       readonly [K in BKeys]-?: K extends keyof Defaults | ||||
|         ? Defaults[K] extends undefined | ||||
|           ? boolean | undefined | ||||
|           : boolean | ||||
|         : boolean | ||||
|     } | ||||
|   : never | ||||
| 
 | ||||
| /** | ||||
|  * Vue `<script setup>` compiler macro for providing props default values when | ||||
|  |  | |||
|  | @ -856,11 +856,10 @@ function setupStatefulComponent( | |||
|   // 2. call setup()
 | ||||
|   const { setup } = Component | ||||
|   if (setup) { | ||||
|     pauseTracking() | ||||
|     const setupContext = (instance.setupContext = | ||||
|       setup.length > 1 ? createSetupContext(instance) : null) | ||||
| 
 | ||||
|     const reset = setCurrentInstance(instance) | ||||
|     pauseTracking() | ||||
|     const setupResult = callWithErrorHandling( | ||||
|       setup, | ||||
|       instance, | ||||
|  | @ -870,12 +869,16 @@ function setupStatefulComponent( | |||
|         setupContext, | ||||
|       ], | ||||
|     ) | ||||
|     const isAsyncSetup = isPromise(setupResult) | ||||
|     resetTracking() | ||||
|     reset() | ||||
| 
 | ||||
|     if (isPromise(setupResult)) { | ||||
|       // async setup, mark as async boundary for useId()
 | ||||
|       if (!isAsyncWrapper(instance)) markAsyncBoundary(instance) | ||||
|     if ((isAsyncSetup || instance.sp) && !isAsyncWrapper(instance)) { | ||||
|       // async setup / serverPrefetch, mark as async boundary for useId()
 | ||||
|       markAsyncBoundary(instance) | ||||
|     } | ||||
| 
 | ||||
|     if (isAsyncSetup) { | ||||
|       setupResult.then(unsetCurrentInstance, unsetCurrentInstance) | ||||
|       if (isSSR) { | ||||
|         // return the promise so server-renderer can wait on it
 | ||||
|  | @ -1003,7 +1006,7 @@ export function finishComponentSetup( | |||
|           instance.vnode.props && | ||||
|           instance.vnode.props['inline-template']) || | ||||
|         Component.template || | ||||
|         resolveMergedOptions(instance).template | ||||
|         (__FEATURE_OPTIONS_API__ && resolveMergedOptions(instance).template) | ||||
|       if (template) { | ||||
|         if (__DEV__) { | ||||
|           startMeasure(instance, `compile`) | ||||
|  |  | |||
|  | @ -654,6 +654,7 @@ function validateProps( | |||
| ) { | ||||
|   const resolvedValues = toRaw(props) | ||||
|   const options = instance.propsOptions[0] | ||||
|   const camelizePropsKey = Object.keys(rawProps).map(key => camelize(key)) | ||||
|   for (const key in options) { | ||||
|     let opt = options[key] | ||||
|     if (opt == null) continue | ||||
|  | @ -662,7 +663,7 @@ function validateProps( | |||
|       resolvedValues[key], | ||||
|       opt, | ||||
|       __DEV__ ? shallowReadonly(resolvedValues) : resolvedValues, | ||||
|       !hasOwn(rawProps, key) && !hasOwn(rawProps, hyphenate(key)), | ||||
|       !camelizePropsKey.includes(key), | ||||
|     ) | ||||
|   } | ||||
| } | ||||
|  |  | |||
|  | @ -190,7 +190,7 @@ export function renderComponentRoot( | |||
|             `Extraneous non-props attributes (` + | ||||
|               `${extraAttrs.join(', ')}) ` + | ||||
|               `were passed to component but could not be automatically inherited ` + | ||||
|               `because component renders fragment or text root nodes.`, | ||||
|               `because component renders fragment or text or teleport root nodes.`, | ||||
|           ) | ||||
|         } | ||||
|         if (eventAttrs.length) { | ||||
|  |  | |||
|  | @ -147,7 +147,7 @@ export const TeleportImpl = { | |||
|           } | ||||
|           if (!disabled) { | ||||
|             mount(target, targetAnchor) | ||||
|             updateCssVars(n2) | ||||
|             updateCssVars(n2, false) | ||||
|           } | ||||
|         } else if (__DEV__ && !disabled) { | ||||
|           warn( | ||||
|  | @ -160,7 +160,7 @@ export const TeleportImpl = { | |||
| 
 | ||||
|       if (disabled) { | ||||
|         mount(container, mainAnchor) | ||||
|         updateCssVars(n2) | ||||
|         updateCssVars(n2, true) | ||||
|       } | ||||
| 
 | ||||
|       if (isTeleportDeferred(n2.props)) { | ||||
|  | @ -267,7 +267,7 @@ export const TeleportImpl = { | |||
|           ) | ||||
|         } | ||||
|       } | ||||
|       updateCssVars(n2) | ||||
|       updateCssVars(n2, disabled) | ||||
|     } | ||||
|   }, | ||||
| 
 | ||||
|  | @ -389,12 +389,13 @@ function hydrateTeleport( | |||
|     querySelector, | ||||
|   )) | ||||
|   if (target) { | ||||
|     const disabled = isTeleportDisabled(vnode.props) | ||||
|     // if multiple teleports rendered to the same target element, we need to
 | ||||
|     // pick up from where the last teleport finished instead of the first node
 | ||||
|     const targetNode = | ||||
|       (target as TeleportTargetElement)._lpa || target.firstChild | ||||
|     if (vnode.shapeFlag & ShapeFlags.ARRAY_CHILDREN) { | ||||
|       if (isTeleportDisabled(vnode.props)) { | ||||
|       if (disabled) { | ||||
|         vnode.anchor = hydrateChildren( | ||||
|           nextSibling(node), | ||||
|           vnode, | ||||
|  | @ -446,7 +447,7 @@ function hydrateTeleport( | |||
|         ) | ||||
|       } | ||||
|     } | ||||
|     updateCssVars(vnode) | ||||
|     updateCssVars(vnode, disabled) | ||||
|   } | ||||
|   return vnode.anchor && nextSibling(vnode.anchor as Node) | ||||
| } | ||||
|  | @ -462,13 +463,20 @@ export const Teleport = TeleportImpl as unknown as { | |||
|   } | ||||
| } | ||||
| 
 | ||||
| function updateCssVars(vnode: VNode) { | ||||
| function updateCssVars(vnode: VNode, isDisabled: boolean) { | ||||
|   // presence of .ut method indicates owner component uses css vars.
 | ||||
|   // code path here can assume browser environment.
 | ||||
|   const ctx = vnode.ctx | ||||
|   if (ctx && ctx.ut) { | ||||
|     let node = vnode.targetStart | ||||
|     while (node && node !== vnode.targetAnchor) { | ||||
|     let node, anchor | ||||
|     if (isDisabled) { | ||||
|       node = vnode.el | ||||
|       anchor = vnode.anchor | ||||
|     } else { | ||||
|       node = vnode.targetStart | ||||
|       anchor = vnode.targetAnchor | ||||
|     } | ||||
|     while (node && node !== anchor) { | ||||
|       if (node.nodeType === 1) node.setAttribute('data-v-owner', ctx.uid) | ||||
|       node = node.nextSibling | ||||
|     } | ||||
|  |  | |||
|  | @ -14,7 +14,7 @@ import { | |||
|   isVNode, | ||||
|   openBlock, | ||||
| } from '../vnode' | ||||
| import { PatchFlags, SlotFlags } from '@vue/shared' | ||||
| import { PatchFlags, SlotFlags, isSymbol } from '@vue/shared' | ||||
| import { warn } from '../warning' | ||||
| import { isAsyncWrapper } from '../apiAsyncComponent' | ||||
| 
 | ||||
|  | @ -72,15 +72,16 @@ export function renderSlot( | |||
|   } | ||||
|   openBlock() | ||||
|   const validSlotContent = slot && ensureValidVNode(slot(props)) | ||||
|   const slotKey = | ||||
|     props.key || | ||||
|     // slot content array of a dynamic conditional slot may have a branch
 | ||||
|     // key attached in the `createSlots` helper, respect that
 | ||||
|     (validSlotContent && (validSlotContent as any).key) | ||||
|   const rendered = createBlock( | ||||
|     Fragment, | ||||
|     { | ||||
|       key: | ||||
|         (props.key || | ||||
|           // slot content array of a dynamic conditional slot may have a branch
 | ||||
|           // key attached in the `createSlots` helper, respect that
 | ||||
|           (validSlotContent && (validSlotContent as any).key) || | ||||
|           `_${name}`) + | ||||
|         (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + | ||||
|         // #7256 force differentiate fallback content from actual content
 | ||||
|         (!validSlotContent && fallback ? '_fb' : ''), | ||||
|     }, | ||||
|  |  | |||
|  | @ -28,14 +28,14 @@ export function useModel( | |||
|     return ref() as any | ||||
|   } | ||||
| 
 | ||||
|   if (__DEV__ && !(i.propsOptions[0] as NormalizedProps)[name]) { | ||||
|   const camelizedName = camelize(name) | ||||
|   if (__DEV__ && !(i.propsOptions[0] as NormalizedProps)[camelizedName]) { | ||||
|     warn(`useModel() called with prop "${name}" which is not declared.`) | ||||
|     return ref() as any | ||||
|   } | ||||
| 
 | ||||
|   const camelizedName = camelize(name) | ||||
|   const hyphenatedName = hyphenate(name) | ||||
|   const modifiers = getModelModifiers(props, name) | ||||
|   const modifiers = getModelModifiers(props, camelizedName) | ||||
| 
 | ||||
|   const res = customRef((track, trigger) => { | ||||
|     let localValue: any | ||||
|  | @ -43,7 +43,7 @@ export function useModel( | |||
|     let prevEmittedValue: any | ||||
| 
 | ||||
|     watchSyncEffect(() => { | ||||
|       const propValue = props[name] | ||||
|       const propValue = props[camelizedName] | ||||
|       if (hasChanged(localValue, propValue)) { | ||||
|         localValue = propValue | ||||
|         trigger() | ||||
|  |  | |||
|  | @ -385,7 +385,10 @@ export function createHydrationFunctions( | |||
|       let needCallTransitionHooks = false | ||||
|       if (isTemplateNode(el)) { | ||||
|         needCallTransitionHooks = | ||||
|           needTransition(parentSuspense, transition) && | ||||
|           needTransition( | ||||
|             null, // no need check parentSuspense in hydration
 | ||||
|             transition, | ||||
|           ) && | ||||
|           parentComponent && | ||||
|           parentComponent.vnode.props && | ||||
|           parentComponent.vnode.props.appear | ||||
|  |  | |||
|  | @ -1,6 +1,13 @@ | |||
| import { isString } from '@vue/shared' | ||||
| import { getGlobalThis, isString } from '@vue/shared' | ||||
| import { DOMNodeTypes, isComment } from './hydration' | ||||
| 
 | ||||
| // Polyfills for Safari support
 | ||||
| // see https://caniuse.com/requestidlecallback
 | ||||
| const requestIdleCallback: Window['requestIdleCallback'] = | ||||
|   getGlobalThis().requestIdleCallback || (cb => setTimeout(cb, 1)) | ||||
| const cancelIdleCallback: Window['cancelIdleCallback'] = | ||||
|   getGlobalThis().cancelIdleCallback || (id => clearTimeout(id)) | ||||
| 
 | ||||
| /** | ||||
|  * A lazy hydration strategy for async components. | ||||
|  * @param hydrate - call this to perform the actual hydration. | ||||
|  |  | |||
|  | @ -69,8 +69,17 @@ export function setRef( | |||
|     setupState === EMPTY_OBJ | ||||
|       ? () => false | ||||
|       : (key: string) => { | ||||
|           if (__DEV__ && knownTemplateRefs.has(rawSetupState[key] as any)) { | ||||
|             return false | ||||
|           if (__DEV__) { | ||||
|             if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) { | ||||
|               warn( | ||||
|                 `Template ref "${key}" used on a non-ref value. ` + | ||||
|                   `It will not work in the production build.`, | ||||
|               ) | ||||
|             } | ||||
| 
 | ||||
|             if (knownTemplateRefs.has(rawSetupState[key] as any)) { | ||||
|               return false | ||||
|             } | ||||
|           } | ||||
|           return hasOwn(rawSetupState, key) | ||||
|         } | ||||
|  |  | |||
|  | @ -1386,4 +1386,39 @@ describe('defineCustomElement', () => { | |||
|     await nextTick() | ||||
|     expect(e.shadowRoot!.innerHTML).toBe(`false,boolean`) | ||||
|   }) | ||||
| 
 | ||||
|   test('hyphenated attr removal', async () => { | ||||
|     const E = defineCustomElement({ | ||||
|       props: { | ||||
|         fooBar: { | ||||
|           type: Boolean, | ||||
|         }, | ||||
|       }, | ||||
|       render() { | ||||
|         return this.fooBar | ||||
|       }, | ||||
|     }) | ||||
|     customElements.define('el-hyphenated-attr-removal', E) | ||||
|     const toggle = ref(true) | ||||
|     const Comp = { | ||||
|       render() { | ||||
|         return h('el-hyphenated-attr-removal', { | ||||
|           'foo-bar': toggle.value ? '' : null, | ||||
|         }) | ||||
|       }, | ||||
|     } | ||||
|     render(h(Comp), container) | ||||
|     const el = container.children[0] | ||||
|     expect(el.hasAttribute('foo-bar')).toBe(true) | ||||
|     expect((el as any).outerHTML).toBe( | ||||
|       `<el-hyphenated-attr-removal foo-bar=""></el-hyphenated-attr-removal>`, | ||||
|     ) | ||||
| 
 | ||||
|     toggle.value = false | ||||
|     await nextTick() | ||||
|     expect(el.hasAttribute('foo-bar')).toBe(false) | ||||
|     expect((el as any).outerHTML).toBe( | ||||
|       `<el-hyphenated-attr-removal></el-hyphenated-attr-removal>`, | ||||
|     ) | ||||
|   }) | ||||
| }) | ||||
|  |  | |||
|  | @ -350,6 +350,7 @@ describe('useCssVars', () => { | |||
|     expect(() => render(h(App), root)).not.toThrow(TypeError) | ||||
|     await nextTick() | ||||
|     expect(target.children.length).toBe(0) | ||||
|     expect(root.children[0].outerHTML.includes('data-v-owner')).toBe(true) | ||||
|   }) | ||||
| 
 | ||||
|   test('with string style', async () => { | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@vue/runtime-dom", | ||||
|   "version": "3.5.11", | ||||
|   "version": "3.5.12", | ||||
|   "description": "@vue/runtime-dom", | ||||
|   "main": "index.js", | ||||
|   "module": "dist/runtime-dom.esm-bundler.js", | ||||
|  |  | |||
|  | @ -160,7 +160,7 @@ export const vModelCheckbox: ModelDirective<HTMLInputElement> = { | |||
| 
 | ||||
| function setChecked( | ||||
|   el: HTMLInputElement, | ||||
|   { value }: DirectiveBinding, | ||||
|   { value, oldValue }: DirectiveBinding, | ||||
|   vnode: VNode, | ||||
| ) { | ||||
|   // store the v-model value on the element so it can be accessed by the
 | ||||
|  | @ -173,6 +173,7 @@ function setChecked( | |||
|   } else if (isSet(value)) { | ||||
|     checked = value.has(vnode.props!.value) | ||||
|   } else { | ||||
|     if (value === oldValue) return | ||||
|     checked = looseEqual(value, getCheckboxValue(el, true)) | ||||
|   } | ||||
| 
 | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ export function patchDOMProp( | |||
|   key: string, | ||||
|   value: any, | ||||
|   parentComponent: any, | ||||
|   attrName?: string, | ||||
| ): void { | ||||
|   // __UNSAFE__
 | ||||
|   // Reason: potentially setting innerHTML.
 | ||||
|  | @ -106,5 +107,5 @@ export function patchDOMProp( | |||
|       ) | ||||
|     } | ||||
|   } | ||||
|   needRemove && el.removeAttribute(key) | ||||
|   needRemove && el.removeAttribute(attrName || key) | ||||
| } | ||||
|  |  | |||
|  | @ -62,7 +62,7 @@ export const patchProp: DOMRendererOptions['patchProp'] = ( | |||
|     (el as VueElement)._isVueCE && | ||||
|     (/[A-Z]/.test(key) || !isString(nextValue)) | ||||
|   ) { | ||||
|     patchDOMProp(el, camelize(key), nextValue, parentComponent) | ||||
|     patchDOMProp(el, camelize(key), nextValue, parentComponent, key) | ||||
|   } else { | ||||
|     // special case for <input v-model type="checkbox"> with
 | ||||
|     // :true-value & :false-value
 | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@vue/server-renderer", | ||||
|   "version": "3.5.11", | ||||
|   "version": "3.5.12", | ||||
|   "description": "@vue/server-renderer", | ||||
|   "main": "index.js", | ||||
|   "module": "dist/server-renderer.esm-bundler.js", | ||||
|  |  | |||
|  | @ -1,4 +1,10 @@ | |||
| import { normalizeClass, parseStringStyle } from '../src' | ||||
| import { | ||||
|   normalizeClass, | ||||
|   normalizeProps, | ||||
|   normalizeStyle, | ||||
|   parseStringStyle, | ||||
|   stringifyStyle, | ||||
| } from '../src' | ||||
| 
 | ||||
| describe('normalizeClass', () => { | ||||
|   test('handles undefined correctly', () => { | ||||
|  | @ -15,6 +21,11 @@ describe('normalizeClass', () => { | |||
|     ) | ||||
|   }) | ||||
| 
 | ||||
|   test('handles string containing spaces correctly', () => { | ||||
|     expect(normalizeClass('foo1 ')).toEqual('foo1') | ||||
|     expect(normalizeClass(['foo ', ' baz '])).toEqual('foo baz') | ||||
|   }) | ||||
| 
 | ||||
|   test('handles empty array correctly', () => { | ||||
|     expect(normalizeClass([])).toEqual('') | ||||
|   }) | ||||
|  | @ -92,3 +103,132 @@ describe('normalizeClass', () => { | |||
|     `)
 | ||||
|   }) | ||||
| }) | ||||
| 
 | ||||
| describe('normalizeStyle', () => { | ||||
|   test('handles string correctly', () => { | ||||
|     expect(normalizeStyle('foo')).toEqual('foo') | ||||
|   }) | ||||
| 
 | ||||
|   test('handles array correctly', () => { | ||||
|     const style: any = normalizeStyle([ | ||||
|       `border: 1px solid transparent;
 | ||||
|     background: linear-gradient(white, white) padding-box, | ||||
|       repeating-linear-gradient( | ||||
|         -45deg, | ||||
|         #ccc 0, | ||||
|         #ccc 0.5em, | ||||
|         white 0, | ||||
|         white 0.75em | ||||
|       );`,
 | ||||
|     ]) | ||||
| 
 | ||||
|     expect(style.border).toEqual('1px solid transparent') | ||||
| 
 | ||||
|     expect(style.background).toEqual(`linear-gradient(white, white) padding-box,
 | ||||
|       repeating-linear-gradient( | ||||
|         -45deg, | ||||
|         #ccc 0, | ||||
|         #ccc 0.5em, | ||||
|         white 0, | ||||
|         white 0.75em | ||||
|       )`)
 | ||||
|   }) | ||||
| 
 | ||||
|   test('handles object correctly', () => { | ||||
|     const styleObj = { | ||||
|       border: '1px solid transparent', | ||||
|       background: `linear-gradient(white, white) padding-box,
 | ||||
|       repeating-linear-gradient( | ||||
|         -45deg, | ||||
|         #ccc 0, | ||||
|         #ccc 0.5em, | ||||
|         white 0, | ||||
|         white 0.75em | ||||
|       )`,
 | ||||
|     } | ||||
|     const style: any = normalizeStyle(styleObj) | ||||
|     expect(style.border).toEqual(styleObj.border) | ||||
|     expect(style.background).toEqual(styleObj.background) | ||||
|   }) | ||||
| }) | ||||
| 
 | ||||
| describe('stringifyStyle', () => { | ||||
|   test('should return empty string for undefined or string styles', () => { | ||||
|     expect(stringifyStyle(undefined)).toBe('') | ||||
|     expect(stringifyStyle('')).toBe('') | ||||
|     expect(stringifyStyle('color: blue;')).toBe('') | ||||
|   }) | ||||
| 
 | ||||
|   test('should return valid CSS string for normalized style object', () => { | ||||
|     const style = { | ||||
|       color: 'blue', | ||||
|       fontSize: '14px', | ||||
|       backgroundColor: 'white', | ||||
|       opacity: 0.8, | ||||
|       margin: 0, | ||||
|       '--custom-color': 'red', | ||||
|     } | ||||
| 
 | ||||
|     expect(stringifyStyle(style)).toBe( | ||||
|       'color:blue;font-size:14px;background-color:white;opacity:0.8;margin:0;--custom-color:red;', | ||||
|     ) | ||||
|   }) | ||||
| 
 | ||||
|   test('should ignore non-string or non-number values in style object', () => { | ||||
|     const style: any = { | ||||
|       color: 'blue', | ||||
|       fontSize: '14px', | ||||
|       lineHeight: true, | ||||
|       padding: null, | ||||
|       margin: undefined, | ||||
|     } | ||||
| 
 | ||||
|     const expected = 'color:blue;font-size:14px;' | ||||
|     expect(stringifyStyle(style)).toBe(expected) | ||||
|   }) | ||||
| }) | ||||
| 
 | ||||
| describe('normalizeProps', () => { | ||||
|   test('should return null when props is null', () => { | ||||
|     const props = null | ||||
|     const result = normalizeProps(props) | ||||
|     expect(result).toBeNull() | ||||
|   }) | ||||
| 
 | ||||
|   test('should normalize class prop when it is an array', () => { | ||||
|     const props = { | ||||
|       class: ['class1', 'class2'], | ||||
|     } | ||||
|     const result = normalizeProps(props) | ||||
|     expect(result).toEqual({ | ||||
|       class: 'class1 class2', | ||||
|     }) | ||||
|   }) | ||||
| 
 | ||||
|   test('should normalize class prop when it is an object', () => { | ||||
|     const props = { | ||||
|       class: { | ||||
|         class1: true, | ||||
|         class2: false, | ||||
|         class3: true, | ||||
|       }, | ||||
|     } | ||||
|     const result = normalizeProps(props) | ||||
|     expect(result).toEqual({ | ||||
|       class: 'class1 class3', | ||||
|     }) | ||||
|   }) | ||||
| 
 | ||||
|   test('should normalize style prop', () => { | ||||
|     const props = { | ||||
|       style: ['color: blue', 'font-size: 14px'], | ||||
|     } | ||||
|     const result = normalizeProps(props) | ||||
|     expect(result).toEqual({ | ||||
|       style: { | ||||
|         color: 'blue', | ||||
|         'font-size': '14px', | ||||
|       }, | ||||
|     }) | ||||
|   }) | ||||
| }) | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@vue/shared", | ||||
|   "version": "3.5.11", | ||||
|   "version": "3.5.12", | ||||
|   "description": "internal utils shared across @vue packages", | ||||
|   "main": "index.js", | ||||
|   "module": "dist/shared.esm-bundler.js", | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "@vue/compat", | ||||
|   "version": "3.5.11", | ||||
|   "version": "3.5.12", | ||||
|   "description": "Vue 3 compatibility build for Vue 2", | ||||
|   "main": "index.js", | ||||
|   "module": "dist/vue.runtime.esm-bundler.js", | ||||
|  |  | |||
|  | @ -0,0 +1,57 @@ | |||
| import path from 'node:path' | ||||
| import { setupPuppeteer } from './e2eUtils' | ||||
| 
 | ||||
| const { page, click, isChecked } = setupPuppeteer() | ||||
| import { nextTick } from 'vue' | ||||
| 
 | ||||
| beforeEach(async () => { | ||||
|   await page().addScriptTag({ | ||||
|     path: path.resolve(__dirname, '../../dist/vue.global.js'), | ||||
|   }) | ||||
|   await page().setContent(`<div id="app"></div>`) | ||||
| }) | ||||
| 
 | ||||
| // #12144
 | ||||
| test('checkbox click with v-model', async () => { | ||||
|   await page().evaluate(() => { | ||||
|     const { createApp } = (window as any).Vue | ||||
|     createApp({ | ||||
|       template: ` | ||||
|       <label> | ||||
|         <input  | ||||
|           id="first" | ||||
|           type="checkbox" | ||||
|           v-model="first"/> | ||||
|         First | ||||
|       </label> | ||||
|       <br>   | ||||
|       <label> | ||||
|         <input | ||||
|           id="second" | ||||
|           type="checkbox" | ||||
|           v-model="second"       | ||||
|           @click="secondClick"/>     | ||||
|           Second | ||||
|       </label>  | ||||
|         `,
 | ||||
|       data() { | ||||
|         return { | ||||
|           first: true, | ||||
|           second: false, | ||||
|         } | ||||
|       }, | ||||
|       methods: { | ||||
|         secondClick(this: any) { | ||||
|           this.first = false | ||||
|         }, | ||||
|       }, | ||||
|     }).mount('#app') | ||||
|   }) | ||||
| 
 | ||||
|   expect(await isChecked('#first')).toBe(true) | ||||
|   expect(await isChecked('#second')).toBe(false) | ||||
|   await click('#second') | ||||
|   await nextTick() | ||||
|   expect(await isChecked('#first')).toBe(false) | ||||
|   expect(await isChecked('#second')).toBe(true) | ||||
| }) | ||||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|   "name": "vue", | ||||
|   "version": "3.5.11", | ||||
|   "version": "3.5.12", | ||||
|   "description": "The progressive JavaScript framework for building modern web UI.", | ||||
|   "main": "index.js", | ||||
|   "module": "dist/vue.runtime.esm-bundler.js", | ||||
|  |  | |||
							
								
								
									
										456
									
								
								pnpm-lock.yaml
								
								
								
								
							
							
						
						
									
										456
									
								
								pnpm-lock.yaml
								
								
								
								
							|  | @ -54,14 +54,14 @@ importers: | |||
|         specifier: 5.0.4 | ||||
|         version: 5.0.4(rollup@4.24.0) | ||||
|       '@swc/core': | ||||
|         specifier: ^1.7.28 | ||||
|         version: 1.7.28 | ||||
|         specifier: ^1.7.35 | ||||
|         version: 1.7.35 | ||||
|       '@types/hash-sum': | ||||
|         specifier: ^1.0.2 | ||||
|         version: 1.0.2 | ||||
|       '@types/node': | ||||
|         specifier: ^20.16.10 | ||||
|         version: 20.16.10 | ||||
|         specifier: ^20.16.11 | ||||
|         version: 20.16.11 | ||||
|       '@types/semver': | ||||
|         specifier: ^7.5.8 | ||||
|         version: 7.5.8 | ||||
|  | @ -70,10 +70,10 @@ importers: | |||
|         version: 6.1.4 | ||||
|       '@vitest/coverage-v8': | ||||
|         specifier: ^2.1.1 | ||||
|         version: 2.1.1(vitest@2.1.1(@types/node@20.16.10)(jsdom@25.0.0)(sass@1.79.4)) | ||||
|         version: 2.1.1(vitest@2.1.1(@types/node@20.16.11)(jsdom@25.0.0)(sass@1.79.5)) | ||||
|       '@vitest/eslint-plugin': | ||||
|         specifier: ^1.0.1 | ||||
|         version: 1.1.6(@typescript-eslint/utils@8.8.0(eslint@9.12.0)(typescript@5.6.2))(eslint@9.12.0)(typescript@5.6.2)(vitest@2.1.1(@types/node@20.16.10)(jsdom@25.0.0)(sass@1.79.4)) | ||||
|         version: 1.1.6(@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.2))(eslint@9.12.0)(typescript@5.6.2)(vitest@2.1.1(@types/node@20.16.11)(jsdom@25.0.0)(sass@1.79.5)) | ||||
|       '@vue/consolidate': | ||||
|         specifier: 1.0.0 | ||||
|         version: 1.0.0 | ||||
|  | @ -108,8 +108,8 @@ importers: | |||
|         specifier: ^4.17.21 | ||||
|         version: 4.17.21 | ||||
|       magic-string: | ||||
|         specifier: ^0.30.11 | ||||
|         version: 0.30.11 | ||||
|         specifier: ^0.30.12 | ||||
|         version: 0.30.12 | ||||
|       markdown-table: | ||||
|         specifier: ^3.0.3 | ||||
|         version: 3.0.3 | ||||
|  | @ -171,14 +171,14 @@ importers: | |||
|         specifier: ~5.6.2 | ||||
|         version: 5.6.2 | ||||
|       typescript-eslint: | ||||
|         specifier: ^8.8.0 | ||||
|         version: 8.8.0(eslint@9.12.0)(typescript@5.6.2) | ||||
|         specifier: ^8.8.1 | ||||
|         version: 8.8.1(eslint@9.12.0)(typescript@5.6.2) | ||||
|       vite: | ||||
|         specifier: 'catalog:' | ||||
|         version: 5.4.0(@types/node@20.16.10)(sass@1.79.4) | ||||
|         version: 5.4.0(@types/node@20.16.11)(sass@1.79.5) | ||||
|       vitest: | ||||
|         specifier: ^2.1.1 | ||||
|         version: 2.1.1(@types/node@20.16.10)(jsdom@25.0.0)(sass@1.79.4) | ||||
|         version: 2.1.1(@types/node@20.16.11)(jsdom@25.0.0)(sass@1.79.5) | ||||
| 
 | ||||
|   packages-private/dts-built-test: | ||||
|     dependencies: | ||||
|  | @ -218,10 +218,10 @@ importers: | |||
|     devDependencies: | ||||
|       '@vitejs/plugin-vue': | ||||
|         specifier: 'catalog:' | ||||
|         version: 5.1.2(vite@5.4.0(@types/node@20.16.10)(sass@1.79.4))(vue@packages+vue) | ||||
|         version: 5.1.2(vite@5.4.0(@types/node@20.16.11)(sass@1.79.5))(vue@packages+vue) | ||||
|       vite: | ||||
|         specifier: 'catalog:' | ||||
|         version: 5.4.0(@types/node@20.16.10)(sass@1.79.4) | ||||
|         version: 5.4.0(@types/node@20.16.11)(sass@1.79.5) | ||||
| 
 | ||||
|   packages-private/template-explorer: | ||||
|     dependencies: | ||||
|  | @ -236,10 +236,10 @@ importers: | |||
|     devDependencies: | ||||
|       '@vitejs/plugin-vue': | ||||
|         specifier: 'catalog:' | ||||
|         version: 5.1.2(vite@5.4.0(@types/node@20.16.10)(sass@1.79.4))(vue@packages+vue) | ||||
|         version: 5.1.2(vite@5.4.0(@types/node@20.16.11)(sass@1.79.5))(vue@packages+vue) | ||||
|       vite: | ||||
|         specifier: 'catalog:' | ||||
|         version: 5.4.0(@types/node@20.16.10)(sass@1.79.4) | ||||
|         version: 5.4.0(@types/node@20.16.11)(sass@1.79.5) | ||||
|       vue: | ||||
|         specifier: workspace:* | ||||
|         version: link:../../packages/vue | ||||
|  | @ -333,8 +333,8 @@ importers: | |||
|         specifier: ^3.0.3 | ||||
|         version: 3.0.3 | ||||
|       sass: | ||||
|         specifier: ^1.79.4 | ||||
|         version: 1.79.4 | ||||
|         specifier: ^1.79.5 | ||||
|         version: 1.79.5 | ||||
| 
 | ||||
|   packages/compiler-ssr: | ||||
|     dependencies: | ||||
|  | @ -861,6 +861,82 @@ packages: | |||
|     resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} | ||||
|     engines: {node: '>= 8'} | ||||
| 
 | ||||
|   '@parcel/watcher-android-arm64@2.4.1': | ||||
|     resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [arm64] | ||||
|     os: [android] | ||||
| 
 | ||||
|   '@parcel/watcher-darwin-arm64@2.4.1': | ||||
|     resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [arm64] | ||||
|     os: [darwin] | ||||
| 
 | ||||
|   '@parcel/watcher-darwin-x64@2.4.1': | ||||
|     resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [x64] | ||||
|     os: [darwin] | ||||
| 
 | ||||
|   '@parcel/watcher-freebsd-x64@2.4.1': | ||||
|     resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [x64] | ||||
|     os: [freebsd] | ||||
| 
 | ||||
|   '@parcel/watcher-linux-arm-glibc@2.4.1': | ||||
|     resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [arm] | ||||
|     os: [linux] | ||||
| 
 | ||||
|   '@parcel/watcher-linux-arm64-glibc@2.4.1': | ||||
|     resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [arm64] | ||||
|     os: [linux] | ||||
| 
 | ||||
|   '@parcel/watcher-linux-arm64-musl@2.4.1': | ||||
|     resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [arm64] | ||||
|     os: [linux] | ||||
| 
 | ||||
|   '@parcel/watcher-linux-x64-glibc@2.4.1': | ||||
|     resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [x64] | ||||
|     os: [linux] | ||||
| 
 | ||||
|   '@parcel/watcher-linux-x64-musl@2.4.1': | ||||
|     resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [x64] | ||||
|     os: [linux] | ||||
| 
 | ||||
|   '@parcel/watcher-win32-arm64@2.4.1': | ||||
|     resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [arm64] | ||||
|     os: [win32] | ||||
| 
 | ||||
|   '@parcel/watcher-win32-ia32@2.4.1': | ||||
|     resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [ia32] | ||||
|     os: [win32] | ||||
| 
 | ||||
|   '@parcel/watcher-win32-x64@2.4.1': | ||||
|     resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
|     cpu: [x64] | ||||
|     os: [win32] | ||||
| 
 | ||||
|   '@parcel/watcher@2.4.1': | ||||
|     resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} | ||||
|     engines: {node: '>= 10.0.0'} | ||||
| 
 | ||||
|   '@pkgjs/parseargs@0.11.0': | ||||
|     resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} | ||||
|     engines: {node: '>=14'} | ||||
|  | @ -1093,68 +1169,68 @@ packages: | |||
|     cpu: [x64] | ||||
|     os: [win32] | ||||
| 
 | ||||
|   '@swc/core-darwin-arm64@1.7.28': | ||||
|     resolution: {integrity: sha512-BNkj6enHo2pdzOpCtQGKZbXT2A/qWIr0CVtbTM4WkJ3MCK/glbFsyO6X59p1r8+gfaZG4bWYnTTu+RuUAcsL5g==} | ||||
|   '@swc/core-darwin-arm64@1.7.35': | ||||
|     resolution: {integrity: sha512-BQSSozVxjxS+SVQz6e3GC/+OBWGIK3jfe52pWdANmycdjF3ch7lrCKTHTU7eHwyoJ96mofszPf5AsiVJF34Fwg==} | ||||
|     engines: {node: '>=10'} | ||||
|     cpu: [arm64] | ||||
|     os: [darwin] | ||||
| 
 | ||||
|   '@swc/core-darwin-x64@1.7.28': | ||||
|     resolution: {integrity: sha512-96zQ+X5Fd6P/RNPkOyikTJgEc2M4TzznfYvjRd2hye5h22jhxCLL/csoauDgN7lYfd7mwsZ/sVXwJTMKl+vZSA==} | ||||
|   '@swc/core-darwin-x64@1.7.35': | ||||
|     resolution: {integrity: sha512-44TYdKN/EWtkU88foXR7IGki9JzhEJzaFOoPevfi9Xe7hjAD/x2+AJOWWqQNzDPMz9+QewLdUVLyR6s5okRgtg==} | ||||
|     engines: {node: '>=10'} | ||||
|     cpu: [x64] | ||||
|     os: [darwin] | ||||
| 
 | ||||
|   '@swc/core-linux-arm-gnueabihf@1.7.28': | ||||
|     resolution: {integrity: sha512-l2100Wx6LdXMOmOW3+KoHhBhyZrGdz8ylkygcVOC0QHp6YIATfuG+rRHksfyEWCSOdL3anM9MJZJX26KT/s+XQ==} | ||||
|   '@swc/core-linux-arm-gnueabihf@1.7.35': | ||||
|     resolution: {integrity: sha512-ccfA5h3zxwioD+/z/AmYtkwtKz9m4rWTV7RoHq6Jfsb0cXHrd6tbcvgqRWXra1kASlE+cDWsMtEZygs9dJRtUQ==} | ||||
|     engines: {node: '>=10'} | ||||
|     cpu: [arm] | ||||
|     os: [linux] | ||||
| 
 | ||||
|   '@swc/core-linux-arm64-gnu@1.7.28': | ||||
|     resolution: {integrity: sha512-03m6iQ5Bv9u2VPnNRyaBmE8eHi056eE39L0gXcqGoo46GAGuoqYHt9pDz8wS6EgoN4t85iBMUZrkCNqFKkN6ZQ==} | ||||
|   '@swc/core-linux-arm64-gnu@1.7.35': | ||||
|     resolution: {integrity: sha512-hx65Qz+G4iG/IVtxJKewC5SJdki8PAPFGl6gC/57Jb0+jA4BIoGLD/J3Q3rCPeoHfdqpkCYpahtyUq8CKx41Jg==} | ||||
|     engines: {node: '>=10'} | ||||
|     cpu: [arm64] | ||||
|     os: [linux] | ||||
| 
 | ||||
|   '@swc/core-linux-arm64-musl@1.7.28': | ||||
|     resolution: {integrity: sha512-vqVOpG/jc8mvTKQjaPBLhr7tnWyzuztOHsPnJqMWmg7zGcMeQC/2c5pU4uzRAfXMTp25iId6s4Y4wWfPS1EeDw==} | ||||
|   '@swc/core-linux-arm64-musl@1.7.35': | ||||
|     resolution: {integrity: sha512-kL6tQL9No7UEoEvDRuPxzPTpxrvbwYteNRbdChSSP74j13/55G2/2hLmult5yFFaWuyoyU/2lvzjRL/i8OLZxg==} | ||||
|     engines: {node: '>=10'} | ||||
|     cpu: [arm64] | ||||
|     os: [linux] | ||||
| 
 | ||||
|   '@swc/core-linux-x64-gnu@1.7.28': | ||||
|     resolution: {integrity: sha512-HGwpWuB83Kr+V0E+zT5UwIIY9OxiS8aLd0UVMRVWuO8SrQyKm9HKJ46+zoAb8tfJrpZftfxvbn2ayZWR7gqosA==} | ||||
|   '@swc/core-linux-x64-gnu@1.7.35': | ||||
|     resolution: {integrity: sha512-Ke4rcLQSwCQ2LHdJX1FtnqmYNQ3IX6BddKlUtS7mcK13IHkQzZWp0Dcu6MgNA3twzb/dBpKX5GLy07XdGgfmyw==} | ||||
|     engines: {node: '>=10'} | ||||
|     cpu: [x64] | ||||
|     os: [linux] | ||||
| 
 | ||||
|   '@swc/core-linux-x64-musl@1.7.28': | ||||
|     resolution: {integrity: sha512-q2Y2T8y8EgFtIiRyInnAXNe94aaHX74F0ha1Bl9VdRxE0u1/So+3VLbPvtp4V3Z6pj5pOePfCQJKifnllgAQ9A==} | ||||
|   '@swc/core-linux-x64-musl@1.7.35': | ||||
|     resolution: {integrity: sha512-T30tlLnz0kYyDFyO5RQF5EQ4ENjW9+b56hEGgFUYmfhFhGA4E4V67iEx7KIG4u0whdPG7oy3qjyyIeTb7nElEw==} | ||||
|     engines: {node: '>=10'} | ||||
|     cpu: [x64] | ||||
|     os: [linux] | ||||
| 
 | ||||
|   '@swc/core-win32-arm64-msvc@1.7.28': | ||||
|     resolution: {integrity: sha512-bCqh4uBT/59h3dWK1v91In6qzz8rKoWoFRxCtNQLIK4jP55K0U231ZK9oN7neZD6bzcOUeFvOGgcyMAgDfFWfA==} | ||||
|   '@swc/core-win32-arm64-msvc@1.7.35': | ||||
|     resolution: {integrity: sha512-CfM/k8mvtuMyX+okRhemfLt784PLS0KF7Q9djA8/Dtavk0L5Ghnq+XsGltO3d8B8+XZ7YOITsB14CrjehzeHsg==} | ||||
|     engines: {node: '>=10'} | ||||
|     cpu: [arm64] | ||||
|     os: [win32] | ||||
| 
 | ||||
|   '@swc/core-win32-ia32-msvc@1.7.28': | ||||
|     resolution: {integrity: sha512-XTHbHrksnrqK3JSJ2sbuMWvdJ6/G0roRpgyVTmNDfhTYPOwcVaL/mSrPGLwbksYUbq7ckwoKzrobhdxvQzPsDA==} | ||||
|   '@swc/core-win32-ia32-msvc@1.7.35': | ||||
|     resolution: {integrity: sha512-ATB3uuH8j/RmS64EXQZJSbo2WXfRNpTnQszHME/sGaexsuxeijrp3DTYSFAA3R2Bu6HbIIX6jempe1Au8I3j+A==} | ||||
|     engines: {node: '>=10'} | ||||
|     cpu: [ia32] | ||||
|     os: [win32] | ||||
| 
 | ||||
|   '@swc/core-win32-x64-msvc@1.7.28': | ||||
|     resolution: {integrity: sha512-jyXeoq6nX8abiCy2EpporsC5ywNENs4ocYuvxo1LSxDktWN1E2MTXq3cdJcEWB2Vydxq0rDcsGyzkRPMzFhkZw==} | ||||
|   '@swc/core-win32-x64-msvc@1.7.35': | ||||
|     resolution: {integrity: sha512-iDGfQO1571NqWUXtLYDhwIELA/wadH42ioGn+J9R336nWx40YICzy9UQyslWRhqzhQ5kT+QXAW/MoCWc058N6Q==} | ||||
|     engines: {node: '>=10'} | ||||
|     cpu: [x64] | ||||
|     os: [win32] | ||||
| 
 | ||||
|   '@swc/core@1.7.28': | ||||
|     resolution: {integrity: sha512-XapcMgsOS0cKh01AFEj+qXOk6KM4NZhp7a5vPicdhkRR8RzvjrCa7DTtijMxfotU8bqaEHguxmiIag2HUlT8QQ==} | ||||
|   '@swc/core@1.7.35': | ||||
|     resolution: {integrity: sha512-3cUteCTbr2r5jqfgx0r091sfq5Mgh6F1SQh8XAOnSvtKzwv2bC31mvBHVAieD1uPa2kHJhLav20DQgXOhpEitw==} | ||||
|     engines: {node: '>=10'} | ||||
|     peerDependencies: | ||||
|       '@swc/helpers': '*' | ||||
|  | @ -1165,8 +1241,8 @@ packages: | |||
|   '@swc/counter@0.1.3': | ||||
|     resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} | ||||
| 
 | ||||
|   '@swc/types@0.1.12': | ||||
|     resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} | ||||
|   '@swc/types@0.1.13': | ||||
|     resolution: {integrity: sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==} | ||||
| 
 | ||||
|   '@tootallnate/quickjs-emscripten@0.23.0': | ||||
|     resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} | ||||
|  | @ -1183,8 +1259,8 @@ packages: | |||
|   '@types/json-schema@7.0.15': | ||||
|     resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} | ||||
| 
 | ||||
|   '@types/node@20.16.10': | ||||
|     resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==} | ||||
|   '@types/node@20.16.11': | ||||
|     resolution: {integrity: sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==} | ||||
| 
 | ||||
|   '@types/normalize-package-data@2.4.4': | ||||
|     resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} | ||||
|  | @ -1204,8 +1280,8 @@ packages: | |||
|   '@types/yauzl@2.10.3': | ||||
|     resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} | ||||
| 
 | ||||
|   '@typescript-eslint/eslint-plugin@8.8.0': | ||||
|     resolution: {integrity: sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==} | ||||
|   '@typescript-eslint/eslint-plugin@8.8.1': | ||||
|     resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
|     peerDependencies: | ||||
|       '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 | ||||
|  | @ -1215,8 +1291,8 @@ packages: | |||
|       typescript: | ||||
|         optional: true | ||||
| 
 | ||||
|   '@typescript-eslint/parser@8.8.0': | ||||
|     resolution: {integrity: sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==} | ||||
|   '@typescript-eslint/parser@8.8.1': | ||||
|     resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
|     peerDependencies: | ||||
|       eslint: ^8.57.0 || ^9.0.0 | ||||
|  | @ -1229,12 +1305,12 @@ packages: | |||
|     resolution: {integrity: sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
| 
 | ||||
|   '@typescript-eslint/scope-manager@8.8.0': | ||||
|     resolution: {integrity: sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==} | ||||
|   '@typescript-eslint/scope-manager@8.8.1': | ||||
|     resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
| 
 | ||||
|   '@typescript-eslint/type-utils@8.8.0': | ||||
|     resolution: {integrity: sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==} | ||||
|   '@typescript-eslint/type-utils@8.8.1': | ||||
|     resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
|     peerDependencies: | ||||
|       typescript: '*' | ||||
|  | @ -1246,8 +1322,8 @@ packages: | |||
|     resolution: {integrity: sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
| 
 | ||||
|   '@typescript-eslint/types@8.8.0': | ||||
|     resolution: {integrity: sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==} | ||||
|   '@typescript-eslint/types@8.8.1': | ||||
|     resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
| 
 | ||||
|   '@typescript-eslint/typescript-estree@8.5.0': | ||||
|  | @ -1259,8 +1335,8 @@ packages: | |||
|       typescript: | ||||
|         optional: true | ||||
| 
 | ||||
|   '@typescript-eslint/typescript-estree@8.8.0': | ||||
|     resolution: {integrity: sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==} | ||||
|   '@typescript-eslint/typescript-estree@8.8.1': | ||||
|     resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
|     peerDependencies: | ||||
|       typescript: '*' | ||||
|  | @ -1274,8 +1350,8 @@ packages: | |||
|     peerDependencies: | ||||
|       eslint: ^8.57.0 || ^9.0.0 | ||||
| 
 | ||||
|   '@typescript-eslint/utils@8.8.0': | ||||
|     resolution: {integrity: sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==} | ||||
|   '@typescript-eslint/utils@8.8.1': | ||||
|     resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
|     peerDependencies: | ||||
|       eslint: ^8.57.0 || ^9.0.0 | ||||
|  | @ -1284,8 +1360,8 @@ packages: | |||
|     resolution: {integrity: sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
| 
 | ||||
|   '@typescript-eslint/visitor-keys@8.8.0': | ||||
|     resolution: {integrity: sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==} | ||||
|   '@typescript-eslint/visitor-keys@8.8.1': | ||||
|     resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
| 
 | ||||
|   '@vitejs/plugin-vue@5.1.2': | ||||
|  | @ -1785,6 +1861,11 @@ packages: | |||
|     resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} | ||||
|     engines: {node: '>=0.4.0'} | ||||
| 
 | ||||
|   detect-libc@1.0.3: | ||||
|     resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} | ||||
|     engines: {node: '>=0.10'} | ||||
|     hasBin: true | ||||
| 
 | ||||
|   devtools-protocol@0.0.1330662: | ||||
|     resolution: {integrity: sha512-pzh6YQ8zZfz3iKlCvgzVCu22NdpZ8hNmwU6WnQjNVquh0A9iVosPtNLWDwaWVGyrntQlltPFztTMK5Cg6lfCuw==} | ||||
| 
 | ||||
|  | @ -2442,6 +2523,9 @@ packages: | |||
|   magic-string@0.30.11: | ||||
|     resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} | ||||
| 
 | ||||
|   magic-string@0.30.12: | ||||
|     resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} | ||||
| 
 | ||||
|   magicast@0.3.4: | ||||
|     resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} | ||||
| 
 | ||||
|  | @ -2563,6 +2647,9 @@ packages: | |||
|     resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} | ||||
|     engines: {node: '>= 0.4.0'} | ||||
| 
 | ||||
|   node-addon-api@7.1.1: | ||||
|     resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} | ||||
| 
 | ||||
|   normalize-package-data@6.0.2: | ||||
|     resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} | ||||
|     engines: {node: ^16.14.0 || >=18.0.0} | ||||
|  | @ -2965,8 +3052,8 @@ packages: | |||
|   safer-buffer@2.1.2: | ||||
|     resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} | ||||
| 
 | ||||
|   sass@1.79.4: | ||||
|     resolution: {integrity: sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==} | ||||
|   sass@1.79.5: | ||||
|     resolution: {integrity: sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==} | ||||
|     engines: {node: '>=14.0.0'} | ||||
|     hasBin: true | ||||
| 
 | ||||
|  | @ -3231,8 +3318,8 @@ packages: | |||
|   typed-query-selector@2.12.0: | ||||
|     resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==} | ||||
| 
 | ||||
|   typescript-eslint@8.8.0: | ||||
|     resolution: {integrity: sha512-BjIT/VwJ8+0rVO01ZQ2ZVnjE1svFBiRczcpr1t1Yxt7sT25VSbPfrJtDsQ8uQTy2pilX5nI9gwxhUyLULNentw==} | ||||
|   typescript-eslint@8.8.1: | ||||
|     resolution: {integrity: sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==} | ||||
|     engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} | ||||
|     peerDependencies: | ||||
|       typescript: '*' | ||||
|  | @ -3775,6 +3862,62 @@ snapshots: | |||
|       '@nodelib/fs.scandir': 2.1.5 | ||||
|       fastq: 1.17.1 | ||||
| 
 | ||||
|   '@parcel/watcher-android-arm64@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher-darwin-arm64@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher-darwin-x64@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher-freebsd-x64@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher-linux-arm-glibc@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher-linux-arm64-glibc@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher-linux-arm64-musl@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher-linux-x64-glibc@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher-linux-x64-musl@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher-win32-arm64@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher-win32-ia32@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher-win32-x64@2.4.1': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@parcel/watcher@2.4.1': | ||||
|     dependencies: | ||||
|       detect-libc: 1.0.3 | ||||
|       is-glob: 4.0.3 | ||||
|       micromatch: 4.0.8 | ||||
|       node-addon-api: 7.1.1 | ||||
|     optionalDependencies: | ||||
|       '@parcel/watcher-android-arm64': 2.4.1 | ||||
|       '@parcel/watcher-darwin-arm64': 2.4.1 | ||||
|       '@parcel/watcher-darwin-x64': 2.4.1 | ||||
|       '@parcel/watcher-freebsd-x64': 2.4.1 | ||||
|       '@parcel/watcher-linux-arm-glibc': 2.4.1 | ||||
|       '@parcel/watcher-linux-arm64-glibc': 2.4.1 | ||||
|       '@parcel/watcher-linux-arm64-musl': 2.4.1 | ||||
|       '@parcel/watcher-linux-x64-glibc': 2.4.1 | ||||
|       '@parcel/watcher-linux-x64-musl': 2.4.1 | ||||
|       '@parcel/watcher-win32-arm64': 2.4.1 | ||||
|       '@parcel/watcher-win32-ia32': 2.4.1 | ||||
|       '@parcel/watcher-win32-x64': 2.4.1 | ||||
| 
 | ||||
|   '@pkgjs/parseargs@0.11.0': | ||||
|     optional: true | ||||
| 
 | ||||
|  | @ -3802,7 +3945,7 @@ snapshots: | |||
|       estree-walker: 2.0.2 | ||||
|       fdir: 6.4.0(picomatch@2.3.1) | ||||
|       is-reference: 1.2.1 | ||||
|       magic-string: 0.30.11 | ||||
|       magic-string: 0.30.12 | ||||
|       picomatch: 2.3.1 | ||||
|     optionalDependencies: | ||||
|       rollup: 4.24.0 | ||||
|  | @ -3811,7 +3954,7 @@ snapshots: | |||
|     dependencies: | ||||
|       '@rollup/pluginutils': 5.1.0(rollup@4.24.0) | ||||
|       estree-walker: 2.0.2 | ||||
|       magic-string: 0.30.11 | ||||
|       magic-string: 0.30.12 | ||||
|     optionalDependencies: | ||||
|       rollup: 4.24.0 | ||||
| 
 | ||||
|  | @ -3834,7 +3977,7 @@ snapshots: | |||
|   '@rollup/plugin-replace@5.0.4(rollup@4.24.0)': | ||||
|     dependencies: | ||||
|       '@rollup/pluginutils': 5.1.0(rollup@4.24.0) | ||||
|       magic-string: 0.30.11 | ||||
|       magic-string: 0.30.12 | ||||
|     optionalDependencies: | ||||
|       rollup: 4.24.0 | ||||
| 
 | ||||
|  | @ -3942,55 +4085,55 @@ snapshots: | |||
|   '@rollup/rollup-win32-x64-msvc@4.24.0': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@swc/core-darwin-arm64@1.7.28': | ||||
|   '@swc/core-darwin-arm64@1.7.35': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@swc/core-darwin-x64@1.7.28': | ||||
|   '@swc/core-darwin-x64@1.7.35': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@swc/core-linux-arm-gnueabihf@1.7.28': | ||||
|   '@swc/core-linux-arm-gnueabihf@1.7.35': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@swc/core-linux-arm64-gnu@1.7.28': | ||||
|   '@swc/core-linux-arm64-gnu@1.7.35': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@swc/core-linux-arm64-musl@1.7.28': | ||||
|   '@swc/core-linux-arm64-musl@1.7.35': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@swc/core-linux-x64-gnu@1.7.28': | ||||
|   '@swc/core-linux-x64-gnu@1.7.35': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@swc/core-linux-x64-musl@1.7.28': | ||||
|   '@swc/core-linux-x64-musl@1.7.35': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@swc/core-win32-arm64-msvc@1.7.28': | ||||
|   '@swc/core-win32-arm64-msvc@1.7.35': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@swc/core-win32-ia32-msvc@1.7.28': | ||||
|   '@swc/core-win32-ia32-msvc@1.7.35': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@swc/core-win32-x64-msvc@1.7.28': | ||||
|   '@swc/core-win32-x64-msvc@1.7.35': | ||||
|     optional: true | ||||
| 
 | ||||
|   '@swc/core@1.7.28': | ||||
|   '@swc/core@1.7.35': | ||||
|     dependencies: | ||||
|       '@swc/counter': 0.1.3 | ||||
|       '@swc/types': 0.1.12 | ||||
|       '@swc/types': 0.1.13 | ||||
|     optionalDependencies: | ||||
|       '@swc/core-darwin-arm64': 1.7.28 | ||||
|       '@swc/core-darwin-x64': 1.7.28 | ||||
|       '@swc/core-linux-arm-gnueabihf': 1.7.28 | ||||
|       '@swc/core-linux-arm64-gnu': 1.7.28 | ||||
|       '@swc/core-linux-arm64-musl': 1.7.28 | ||||
|       '@swc/core-linux-x64-gnu': 1.7.28 | ||||
|       '@swc/core-linux-x64-musl': 1.7.28 | ||||
|       '@swc/core-win32-arm64-msvc': 1.7.28 | ||||
|       '@swc/core-win32-ia32-msvc': 1.7.28 | ||||
|       '@swc/core-win32-x64-msvc': 1.7.28 | ||||
|       '@swc/core-darwin-arm64': 1.7.35 | ||||
|       '@swc/core-darwin-x64': 1.7.35 | ||||
|       '@swc/core-linux-arm-gnueabihf': 1.7.35 | ||||
|       '@swc/core-linux-arm64-gnu': 1.7.35 | ||||
|       '@swc/core-linux-arm64-musl': 1.7.35 | ||||
|       '@swc/core-linux-x64-gnu': 1.7.35 | ||||
|       '@swc/core-linux-x64-musl': 1.7.35 | ||||
|       '@swc/core-win32-arm64-msvc': 1.7.35 | ||||
|       '@swc/core-win32-ia32-msvc': 1.7.35 | ||||
|       '@swc/core-win32-x64-msvc': 1.7.35 | ||||
| 
 | ||||
|   '@swc/counter@0.1.3': {} | ||||
| 
 | ||||
|   '@swc/types@0.1.12': | ||||
|   '@swc/types@0.1.13': | ||||
|     dependencies: | ||||
|       '@swc/counter': 0.1.3 | ||||
| 
 | ||||
|  | @ -4004,7 +4147,7 @@ snapshots: | |||
| 
 | ||||
|   '@types/json-schema@7.0.15': {} | ||||
| 
 | ||||
|   '@types/node@20.16.10': | ||||
|   '@types/node@20.16.11': | ||||
|     dependencies: | ||||
|       undici-types: 6.19.6 | ||||
| 
 | ||||
|  | @ -4016,23 +4159,23 @@ snapshots: | |||
| 
 | ||||
|   '@types/serve-handler@6.1.4': | ||||
|     dependencies: | ||||
|       '@types/node': 20.16.10 | ||||
|       '@types/node': 20.16.11 | ||||
| 
 | ||||
|   '@types/trusted-types@2.0.7': {} | ||||
| 
 | ||||
|   '@types/yauzl@2.10.3': | ||||
|     dependencies: | ||||
|       '@types/node': 20.16.10 | ||||
|       '@types/node': 20.16.11 | ||||
|     optional: true | ||||
| 
 | ||||
|   '@typescript-eslint/eslint-plugin@8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.12.0)(typescript@5.6.2))(eslint@9.12.0)(typescript@5.6.2)': | ||||
|   '@typescript-eslint/eslint-plugin@8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.2))(eslint@9.12.0)(typescript@5.6.2)': | ||||
|     dependencies: | ||||
|       '@eslint-community/regexpp': 4.11.0 | ||||
|       '@typescript-eslint/parser': 8.8.0(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/scope-manager': 8.8.0 | ||||
|       '@typescript-eslint/type-utils': 8.8.0(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/utils': 8.8.0(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/visitor-keys': 8.8.0 | ||||
|       '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/scope-manager': 8.8.1 | ||||
|       '@typescript-eslint/type-utils': 8.8.1(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/visitor-keys': 8.8.1 | ||||
|       eslint: 9.12.0 | ||||
|       graphemer: 1.4.0 | ||||
|       ignore: 5.3.1 | ||||
|  | @ -4043,12 +4186,12 @@ snapshots: | |||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
| 
 | ||||
|   '@typescript-eslint/parser@8.8.0(eslint@9.12.0)(typescript@5.6.2)': | ||||
|   '@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.2)': | ||||
|     dependencies: | ||||
|       '@typescript-eslint/scope-manager': 8.8.0 | ||||
|       '@typescript-eslint/types': 8.8.0 | ||||
|       '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.6.2) | ||||
|       '@typescript-eslint/visitor-keys': 8.8.0 | ||||
|       '@typescript-eslint/scope-manager': 8.8.1 | ||||
|       '@typescript-eslint/types': 8.8.1 | ||||
|       '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.2) | ||||
|       '@typescript-eslint/visitor-keys': 8.8.1 | ||||
|       debug: 4.3.6 | ||||
|       eslint: 9.12.0 | ||||
|     optionalDependencies: | ||||
|  | @ -4061,15 +4204,15 @@ snapshots: | |||
|       '@typescript-eslint/types': 8.5.0 | ||||
|       '@typescript-eslint/visitor-keys': 8.5.0 | ||||
| 
 | ||||
|   '@typescript-eslint/scope-manager@8.8.0': | ||||
|   '@typescript-eslint/scope-manager@8.8.1': | ||||
|     dependencies: | ||||
|       '@typescript-eslint/types': 8.8.0 | ||||
|       '@typescript-eslint/visitor-keys': 8.8.0 | ||||
|       '@typescript-eslint/types': 8.8.1 | ||||
|       '@typescript-eslint/visitor-keys': 8.8.1 | ||||
| 
 | ||||
|   '@typescript-eslint/type-utils@8.8.0(eslint@9.12.0)(typescript@5.6.2)': | ||||
|   '@typescript-eslint/type-utils@8.8.1(eslint@9.12.0)(typescript@5.6.2)': | ||||
|     dependencies: | ||||
|       '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.6.2) | ||||
|       '@typescript-eslint/utils': 8.8.0(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.2) | ||||
|       '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.2) | ||||
|       debug: 4.3.6 | ||||
|       ts-api-utils: 1.3.0(typescript@5.6.2) | ||||
|     optionalDependencies: | ||||
|  | @ -4080,7 +4223,7 @@ snapshots: | |||
| 
 | ||||
|   '@typescript-eslint/types@8.5.0': {} | ||||
| 
 | ||||
|   '@typescript-eslint/types@8.8.0': {} | ||||
|   '@typescript-eslint/types@8.8.1': {} | ||||
| 
 | ||||
|   '@typescript-eslint/typescript-estree@8.5.0(typescript@5.6.2)': | ||||
|     dependencies: | ||||
|  | @ -4097,10 +4240,10 @@ snapshots: | |||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
| 
 | ||||
|   '@typescript-eslint/typescript-estree@8.8.0(typescript@5.6.2)': | ||||
|   '@typescript-eslint/typescript-estree@8.8.1(typescript@5.6.2)': | ||||
|     dependencies: | ||||
|       '@typescript-eslint/types': 8.8.0 | ||||
|       '@typescript-eslint/visitor-keys': 8.8.0 | ||||
|       '@typescript-eslint/types': 8.8.1 | ||||
|       '@typescript-eslint/visitor-keys': 8.8.1 | ||||
|       debug: 4.3.6 | ||||
|       fast-glob: 3.3.2 | ||||
|       is-glob: 4.0.3 | ||||
|  | @ -4123,12 +4266,12 @@ snapshots: | |||
|       - supports-color | ||||
|       - typescript | ||||
| 
 | ||||
|   '@typescript-eslint/utils@8.8.0(eslint@9.12.0)(typescript@5.6.2)': | ||||
|   '@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.2)': | ||||
|     dependencies: | ||||
|       '@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0) | ||||
|       '@typescript-eslint/scope-manager': 8.8.0 | ||||
|       '@typescript-eslint/types': 8.8.0 | ||||
|       '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.6.2) | ||||
|       '@typescript-eslint/scope-manager': 8.8.1 | ||||
|       '@typescript-eslint/types': 8.8.1 | ||||
|       '@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.2) | ||||
|       eslint: 9.12.0 | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
|  | @ -4139,17 +4282,17 @@ snapshots: | |||
|       '@typescript-eslint/types': 8.5.0 | ||||
|       eslint-visitor-keys: 3.4.3 | ||||
| 
 | ||||
|   '@typescript-eslint/visitor-keys@8.8.0': | ||||
|   '@typescript-eslint/visitor-keys@8.8.1': | ||||
|     dependencies: | ||||
|       '@typescript-eslint/types': 8.8.0 | ||||
|       '@typescript-eslint/types': 8.8.1 | ||||
|       eslint-visitor-keys: 3.4.3 | ||||
| 
 | ||||
|   '@vitejs/plugin-vue@5.1.2(vite@5.4.0(@types/node@20.16.10)(sass@1.79.4))(vue@packages+vue)': | ||||
|   '@vitejs/plugin-vue@5.1.2(vite@5.4.0(@types/node@20.16.11)(sass@1.79.5))(vue@packages+vue)': | ||||
|     dependencies: | ||||
|       vite: 5.4.0(@types/node@20.16.10)(sass@1.79.4) | ||||
|       vite: 5.4.0(@types/node@20.16.11)(sass@1.79.5) | ||||
|       vue: link:packages/vue | ||||
| 
 | ||||
|   '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@20.16.10)(jsdom@25.0.0)(sass@1.79.4))': | ||||
|   '@vitest/coverage-v8@2.1.1(vitest@2.1.1(@types/node@20.16.11)(jsdom@25.0.0)(sass@1.79.5))': | ||||
|     dependencies: | ||||
|       '@ampproject/remapping': 2.3.0 | ||||
|       '@bcoe/v8-coverage': 0.2.3 | ||||
|  | @ -4158,20 +4301,20 @@ snapshots: | |||
|       istanbul-lib-report: 3.0.1 | ||||
|       istanbul-lib-source-maps: 5.0.6 | ||||
|       istanbul-reports: 3.1.7 | ||||
|       magic-string: 0.30.11 | ||||
|       magic-string: 0.30.12 | ||||
|       magicast: 0.3.4 | ||||
|       std-env: 3.7.0 | ||||
|       test-exclude: 7.0.1 | ||||
|       tinyrainbow: 1.2.0 | ||||
|       vitest: 2.1.1(@types/node@20.16.10)(jsdom@25.0.0)(sass@1.79.4) | ||||
|       vitest: 2.1.1(@types/node@20.16.11)(jsdom@25.0.0)(sass@1.79.5) | ||||
|     transitivePeerDependencies: | ||||
|       - supports-color | ||||
| 
 | ||||
|   '@vitest/eslint-plugin@1.1.6(@typescript-eslint/utils@8.8.0(eslint@9.12.0)(typescript@5.6.2))(eslint@9.12.0)(typescript@5.6.2)(vitest@2.1.1(@types/node@20.16.10)(jsdom@25.0.0)(sass@1.79.4))': | ||||
|   '@vitest/eslint-plugin@1.1.6(@typescript-eslint/utils@8.8.1(eslint@9.12.0)(typescript@5.6.2))(eslint@9.12.0)(typescript@5.6.2)(vitest@2.1.1(@types/node@20.16.11)(jsdom@25.0.0)(sass@1.79.5))': | ||||
|     dependencies: | ||||
|       '@typescript-eslint/utils': 8.8.0(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.2) | ||||
|       eslint: 9.12.0 | ||||
|       vitest: 2.1.1(@types/node@20.16.10)(jsdom@25.0.0)(sass@1.79.4) | ||||
|       vitest: 2.1.1(@types/node@20.16.11)(jsdom@25.0.0)(sass@1.79.5) | ||||
|     optionalDependencies: | ||||
|       typescript: 5.6.2 | ||||
| 
 | ||||
|  | @ -4182,13 +4325,13 @@ snapshots: | |||
|       chai: 5.1.1 | ||||
|       tinyrainbow: 1.2.0 | ||||
| 
 | ||||
|   '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4))': | ||||
|   '@vitest/mocker@2.1.1(@vitest/spy@2.1.1)(vite@5.4.8(@types/node@20.16.11)(sass@1.79.5))': | ||||
|     dependencies: | ||||
|       '@vitest/spy': 2.1.1 | ||||
|       estree-walker: 3.0.3 | ||||
|       magic-string: 0.30.11 | ||||
|       magic-string: 0.30.12 | ||||
|     optionalDependencies: | ||||
|       vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) | ||||
|       vite: 5.4.8(@types/node@20.16.11)(sass@1.79.5) | ||||
| 
 | ||||
|   '@vitest/pretty-format@2.1.1': | ||||
|     dependencies: | ||||
|  | @ -4202,7 +4345,7 @@ snapshots: | |||
|   '@vitest/snapshot@2.1.1': | ||||
|     dependencies: | ||||
|       '@vitest/pretty-format': 2.1.1 | ||||
|       magic-string: 0.30.11 | ||||
|       magic-string: 0.30.12 | ||||
|       pathe: 1.1.2 | ||||
| 
 | ||||
|   '@vitest/spy@2.1.1': | ||||
|  | @ -4649,6 +4792,8 @@ snapshots: | |||
| 
 | ||||
|   delayed-stream@1.0.0: {} | ||||
| 
 | ||||
|   detect-libc@1.0.3: {} | ||||
| 
 | ||||
|   devtools-protocol@0.0.1330662: {} | ||||
| 
 | ||||
|   doctrine@3.0.0: | ||||
|  | @ -5407,6 +5552,10 @@ snapshots: | |||
|     dependencies: | ||||
|       '@jridgewell/sourcemap-codec': 1.5.0 | ||||
| 
 | ||||
|   magic-string@0.30.12: | ||||
|     dependencies: | ||||
|       '@jridgewell/sourcemap-codec': 1.5.0 | ||||
| 
 | ||||
|   magicast@0.3.4: | ||||
|     dependencies: | ||||
|       '@babel/parser': 7.25.3 | ||||
|  | @ -5494,6 +5643,8 @@ snapshots: | |||
| 
 | ||||
|   netmask@2.0.2: {} | ||||
| 
 | ||||
|   node-addon-api@7.1.1: {} | ||||
| 
 | ||||
|   normalize-package-data@6.0.2: | ||||
|     dependencies: | ||||
|       hosted-git-info: 7.0.2 | ||||
|  | @ -5911,7 +6062,7 @@ snapshots: | |||
| 
 | ||||
|   rollup-plugin-dts@6.1.1(rollup@4.24.0)(typescript@5.6.2): | ||||
|     dependencies: | ||||
|       magic-string: 0.30.11 | ||||
|       magic-string: 0.30.12 | ||||
|       rollup: 4.24.0 | ||||
|       typescript: 5.6.2 | ||||
|     optionalDependencies: | ||||
|  | @ -5991,8 +6142,9 @@ snapshots: | |||
| 
 | ||||
|   safer-buffer@2.1.2: {} | ||||
| 
 | ||||
|   sass@1.79.4: | ||||
|   sass@1.79.5: | ||||
|     dependencies: | ||||
|       '@parcel/watcher': 2.4.1 | ||||
|       chokidar: 4.0.1 | ||||
|       immutable: 4.3.7 | ||||
|       source-map-js: 1.2.1 | ||||
|  | @ -6253,11 +6405,11 @@ snapshots: | |||
| 
 | ||||
|   typed-query-selector@2.12.0: {} | ||||
| 
 | ||||
|   typescript-eslint@8.8.0(eslint@9.12.0)(typescript@5.6.2): | ||||
|   typescript-eslint@8.8.1(eslint@9.12.0)(typescript@5.6.2): | ||||
|     dependencies: | ||||
|       '@typescript-eslint/eslint-plugin': 8.8.0(@typescript-eslint/parser@8.8.0(eslint@9.12.0)(typescript@5.6.2))(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/parser': 8.8.0(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/utils': 8.8.0(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/eslint-plugin': 8.8.1(@typescript-eslint/parser@8.8.1(eslint@9.12.0)(typescript@5.6.2))(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/parser': 8.8.1(eslint@9.12.0)(typescript@5.6.2) | ||||
|       '@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.2) | ||||
|     optionalDependencies: | ||||
|       typescript: 5.6.2 | ||||
|     transitivePeerDependencies: | ||||
|  | @ -6309,12 +6461,12 @@ snapshots: | |||
| 
 | ||||
|   vary@1.1.2: {} | ||||
| 
 | ||||
|   vite-node@2.1.1(@types/node@20.16.10)(sass@1.79.4): | ||||
|   vite-node@2.1.1(@types/node@20.16.11)(sass@1.79.5): | ||||
|     dependencies: | ||||
|       cac: 6.7.14 | ||||
|       debug: 4.3.6 | ||||
|       pathe: 1.1.2 | ||||
|       vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) | ||||
|       vite: 5.4.8(@types/node@20.16.11)(sass@1.79.5) | ||||
|     transitivePeerDependencies: | ||||
|       - '@types/node' | ||||
|       - less | ||||
|  | @ -6326,30 +6478,30 @@ snapshots: | |||
|       - supports-color | ||||
|       - terser | ||||
| 
 | ||||
|   vite@5.4.0(@types/node@20.16.10)(sass@1.79.4): | ||||
|   vite@5.4.0(@types/node@20.16.11)(sass@1.79.5): | ||||
|     dependencies: | ||||
|       esbuild: 0.21.5 | ||||
|       postcss: 8.4.41 | ||||
|       rollup: 4.20.0 | ||||
|     optionalDependencies: | ||||
|       '@types/node': 20.16.10 | ||||
|       '@types/node': 20.16.11 | ||||
|       fsevents: 2.3.3 | ||||
|       sass: 1.79.4 | ||||
|       sass: 1.79.5 | ||||
| 
 | ||||
|   vite@5.4.8(@types/node@20.16.10)(sass@1.79.4): | ||||
|   vite@5.4.8(@types/node@20.16.11)(sass@1.79.5): | ||||
|     dependencies: | ||||
|       esbuild: 0.21.5 | ||||
|       postcss: 8.4.47 | ||||
|       rollup: 4.24.0 | ||||
|     optionalDependencies: | ||||
|       '@types/node': 20.16.10 | ||||
|       '@types/node': 20.16.11 | ||||
|       fsevents: 2.3.3 | ||||
|       sass: 1.79.4 | ||||
|       sass: 1.79.5 | ||||
| 
 | ||||
|   vitest@2.1.1(@types/node@20.16.10)(jsdom@25.0.0)(sass@1.79.4): | ||||
|   vitest@2.1.1(@types/node@20.16.11)(jsdom@25.0.0)(sass@1.79.5): | ||||
|     dependencies: | ||||
|       '@vitest/expect': 2.1.1 | ||||
|       '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.8(@types/node@20.16.10)(sass@1.79.4)) | ||||
|       '@vitest/mocker': 2.1.1(@vitest/spy@2.1.1)(vite@5.4.8(@types/node@20.16.11)(sass@1.79.5)) | ||||
|       '@vitest/pretty-format': 2.1.1 | ||||
|       '@vitest/runner': 2.1.1 | ||||
|       '@vitest/snapshot': 2.1.1 | ||||
|  | @ -6357,18 +6509,18 @@ snapshots: | |||
|       '@vitest/utils': 2.1.1 | ||||
|       chai: 5.1.1 | ||||
|       debug: 4.3.6 | ||||
|       magic-string: 0.30.11 | ||||
|       magic-string: 0.30.12 | ||||
|       pathe: 1.1.2 | ||||
|       std-env: 3.7.0 | ||||
|       tinybench: 2.9.0 | ||||
|       tinyexec: 0.3.0 | ||||
|       tinypool: 1.0.0 | ||||
|       tinyrainbow: 1.2.0 | ||||
|       vite: 5.4.8(@types/node@20.16.10)(sass@1.79.4) | ||||
|       vite-node: 2.1.1(@types/node@20.16.10)(sass@1.79.4) | ||||
|       vite: 5.4.8(@types/node@20.16.11)(sass@1.79.5) | ||||
|       vite-node: 2.1.1(@types/node@20.16.11)(sass@1.79.5) | ||||
|       why-is-node-running: 2.3.0 | ||||
|     optionalDependencies: | ||||
|       '@types/node': 20.16.10 | ||||
|       '@types/node': 20.16.11 | ||||
|       jsdom: 25.0.0 | ||||
|     transitivePeerDependencies: | ||||
|       - less | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue