mirror of https://github.com/vuejs/core.git
Merge branch 'main' into edison/feat/ce_attachInternals
This commit is contained in:
commit
b8846bc4ec
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)
|
## [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,
|
"private": true,
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"packageManager": "pnpm@9.12.0",
|
"packageManager": "pnpm@9.12.1",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "node scripts/dev.js",
|
"dev": "node scripts/dev.js",
|
||||||
|
@ -66,9 +66,9 @@
|
||||||
"@rollup/plugin-json": "^6.1.0",
|
"@rollup/plugin-json": "^6.1.0",
|
||||||
"@rollup/plugin-node-resolve": "^15.3.0",
|
"@rollup/plugin-node-resolve": "^15.3.0",
|
||||||
"@rollup/plugin-replace": "5.0.4",
|
"@rollup/plugin-replace": "5.0.4",
|
||||||
"@swc/core": "^1.7.28",
|
"@swc/core": "^1.7.35",
|
||||||
"@types/hash-sum": "^1.0.2",
|
"@types/hash-sum": "^1.0.2",
|
||||||
"@types/node": "^20.16.10",
|
"@types/node": "^20.16.11",
|
||||||
"@types/semver": "^7.5.8",
|
"@types/semver": "^7.5.8",
|
||||||
"@types/serve-handler": "^6.1.4",
|
"@types/serve-handler": "^6.1.4",
|
||||||
"@vitest/coverage-v8": "^2.1.1",
|
"@vitest/coverage-v8": "^2.1.1",
|
||||||
|
@ -84,7 +84,7 @@
|
||||||
"jsdom": "^25.0.0",
|
"jsdom": "^25.0.0",
|
||||||
"lint-staged": "^15.2.10",
|
"lint-staged": "^15.2.10",
|
||||||
"lodash": "^4.17.21",
|
"lodash": "^4.17.21",
|
||||||
"magic-string": "^0.30.11",
|
"magic-string": "^0.30.12",
|
||||||
"markdown-table": "^3.0.3",
|
"markdown-table": "^3.0.3",
|
||||||
"marked": "13.0.3",
|
"marked": "13.0.3",
|
||||||
"npm-run-all2": "^6.2.3",
|
"npm-run-all2": "^6.2.3",
|
||||||
|
@ -105,7 +105,7 @@
|
||||||
"todomvc-app-css": "^2.4.3",
|
"todomvc-app-css": "^2.4.3",
|
||||||
"tslib": "^2.7.0",
|
"tslib": "^2.7.0",
|
||||||
"typescript": "~5.6.2",
|
"typescript": "~5.6.2",
|
||||||
"typescript-eslint": "^8.8.0",
|
"typescript-eslint": "^8.8.1",
|
||||||
"vite": "catalog:",
|
"vite": "catalog:",
|
||||||
"vitest": "^2.1.1"
|
"vitest": "^2.1.1"
|
||||||
},
|
},
|
||||||
|
|
|
@ -2068,3 +2068,13 @@ expectString(instance.actionText)
|
||||||
// public prop on $props should be optional
|
// public prop on $props should be optional
|
||||||
// @ts-expect-error
|
// @ts-expect-error
|
||||||
expectString(instance.$props.actionText)
|
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
|
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', () => {
|
describe('defineProps w/ runtime declaration', () => {
|
||||||
// runtime declaration
|
// runtime declaration
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
|
|
|
@ -123,6 +123,7 @@ onMounted(() => {
|
||||||
:prod="productionMode"
|
:prod="productionMode"
|
||||||
:ssr="useSSRMode"
|
:ssr="useSSRMode"
|
||||||
:autoSave="autoSave"
|
:autoSave="autoSave"
|
||||||
|
:theme="theme"
|
||||||
@toggle-theme="toggleTheme"
|
@toggle-theme="toggleTheme"
|
||||||
@toggle-prod="toggleProdMode"
|
@toggle-prod="toggleProdMode"
|
||||||
@toggle-ssr="toggleSSR"
|
@toggle-ssr="toggleSSR"
|
||||||
|
|
|
@ -15,6 +15,7 @@ const props = defineProps<{
|
||||||
prod: boolean
|
prod: boolean
|
||||||
ssr: boolean
|
ssr: boolean
|
||||||
autoSave: boolean
|
autoSave: boolean
|
||||||
|
theme: 'dark' | 'light'
|
||||||
}>()
|
}>()
|
||||||
const emit = defineEmits([
|
const emit = defineEmits([
|
||||||
'toggle-theme',
|
'toggle-theme',
|
||||||
|
@ -117,7 +118,11 @@ function toggleDark() {
|
||||||
>
|
>
|
||||||
<span>{{ autoSave ? 'AutoSave ON' : 'AutoSave OFF' }}</span>
|
<span>{{ autoSave ? 'AutoSave ON' : 'AutoSave OFF' }}</span>
|
||||||
</button>
|
</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" />
|
<Sun class="light" />
|
||||||
<Moon class="dark" />
|
<Moon class="dark" />
|
||||||
</button>
|
</button>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vue/compiler-core",
|
"name": "@vue/compiler-core",
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"description": "@vue/compiler-core",
|
"description": "@vue/compiler-core",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"module": "dist/compiler-core.esm-bundler.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) {
|
function setLocEnd(loc: SourceLocation, end: number) {
|
||||||
loc.end = tokenizer.getPos(end)
|
loc.end = tokenizer.getPos(end)
|
||||||
loc.source = getSlice(loc.start.offset, end)
|
loc.source = getSlice(loc.start.offset, end)
|
||||||
|
|
|
@ -30,6 +30,7 @@ import {
|
||||||
import { ErrorCodes, createCompilerError } from '../errors'
|
import { ErrorCodes, createCompilerError } from '../errors'
|
||||||
import { processExpression } from './transformExpression'
|
import { processExpression } from './transformExpression'
|
||||||
import { validateBrowserExpression } from '../validateExpression'
|
import { validateBrowserExpression } from '../validateExpression'
|
||||||
|
import { cloneLoc } from '../parser'
|
||||||
import { CREATE_COMMENT, FRAGMENT } from '../runtimeHelpers'
|
import { CREATE_COMMENT, FRAGMENT } from '../runtimeHelpers'
|
||||||
import { findDir, findProp, getMemoedVNodeCall, injectProp } from '../utils'
|
import { findDir, findProp, getMemoedVNodeCall, injectProp } from '../utils'
|
||||||
import { PatchFlags } from '@vue/shared'
|
import { PatchFlags } from '@vue/shared'
|
||||||
|
@ -110,7 +111,7 @@ export function processIf(
|
||||||
const branch = createIfBranch(node, dir)
|
const branch = createIfBranch(node, dir)
|
||||||
const ifNode: IfNode = {
|
const ifNode: IfNode = {
|
||||||
type: NodeTypes.IF,
|
type: NodeTypes.IF,
|
||||||
loc: node.loc,
|
loc: cloneLoc(node.loc),
|
||||||
branches: [branch],
|
branches: [branch],
|
||||||
}
|
}
|
||||||
context.replaceNode(ifNode)
|
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`] = `
|
exports[`stringify static html > should bail for <option> elements with number values 1`] = `
|
||||||
"const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = Vue
|
"const { createElementVNode: _createElementVNode, openBlock: _openBlock, createElementBlock: _createElementBlock } = Vue
|
||||||
|
|
||||||
|
|
|
@ -470,6 +470,17 @@ describe('stringify static html', () => {
|
||||||
expect(code).toMatchSnapshot()
|
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', () => {
|
test('eligible content (elements > 20) + non-eligible content', () => {
|
||||||
const { code } = compileWithStringify(
|
const { code } = compileWithStringify(
|
||||||
`<div>${repeat(
|
`<div>${repeat(
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vue/compiler-dom",
|
"name": "@vue/compiler-dom",
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"description": "@vue/compiler-dom",
|
"description": "@vue/compiler-dom",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"module": "dist/compiler-dom.esm-bundler.js",
|
"module": "dist/compiler-dom.esm-bundler.js",
|
||||||
|
|
|
@ -261,8 +261,7 @@ function analyzeNode(node: StringifiableNode): [number, number] | false {
|
||||||
isOptionTag &&
|
isOptionTag &&
|
||||||
isStaticArgOf(p.arg, 'value') &&
|
isStaticArgOf(p.arg, 'value') &&
|
||||||
p.exp &&
|
p.exp &&
|
||||||
p.exp.ast &&
|
!p.exp.isStatic
|
||||||
p.exp.ast.type !== 'StringLiteral'
|
|
||||||
) {
|
) {
|
||||||
return bail()
|
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 { }
|
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 { }
|
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', () => {
|
test('w/ exported interface', () => {
|
||||||
const { content, bindings } = compile(`
|
const { content, bindings } = compile(`
|
||||||
<script setup lang="ts">
|
<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', () => {
|
test('aliasing', () => {
|
||||||
const { content, bindings } = compile(`
|
const { content, bindings } = compile(`
|
||||||
<script setup>
|
<script setup>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vue/compiler-sfc",
|
"name": "@vue/compiler-sfc",
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"description": "@vue/compiler-sfc",
|
"description": "@vue/compiler-sfc",
|
||||||
"main": "dist/compiler-sfc.cjs.js",
|
"main": "dist/compiler-sfc.cjs.js",
|
||||||
"module": "dist/compiler-sfc.esm-browser.js",
|
"module": "dist/compiler-sfc.esm-browser.js",
|
||||||
|
@ -62,6 +62,6 @@
|
||||||
"postcss-modules": "^6.0.0",
|
"postcss-modules": "^6.0.0",
|
||||||
"postcss-selector-parser": "^6.1.2",
|
"postcss-selector-parser": "^6.1.2",
|
||||||
"pug": "^3.0.3",
|
"pug": "^3.0.3",
|
||||||
"sass": "^1.79.4"
|
"sass": "^1.79.5"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ import type {
|
||||||
import { walk } from 'estree-walker'
|
import { walk } from 'estree-walker'
|
||||||
import {
|
import {
|
||||||
BindingTypes,
|
BindingTypes,
|
||||||
|
TS_NODE_TYPES,
|
||||||
extractIdentifiers,
|
extractIdentifiers,
|
||||||
isFunctionType,
|
isFunctionType,
|
||||||
isInDestructureAssignment,
|
isInDestructureAssignment,
|
||||||
|
@ -240,10 +241,7 @@ export function transformDestructuredProps(
|
||||||
if (
|
if (
|
||||||
parent &&
|
parent &&
|
||||||
parent.type.startsWith('TS') &&
|
parent.type.startsWith('TS') &&
|
||||||
parent.type !== 'TSAsExpression' &&
|
!TS_NODE_TYPES.includes(parent.type)
|
||||||
parent.type !== 'TSNonNullExpression' &&
|
|
||||||
parent.type !== 'TSSatisfiesExpression' &&
|
|
||||||
parent.type !== 'TSTypeAssertion'
|
|
||||||
) {
|
) {
|
||||||
return this.skip()
|
return this.skip()
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,28 +23,48 @@ export interface StylePreprocessorResults {
|
||||||
|
|
||||||
// .scss/.sass processor
|
// .scss/.sass processor
|
||||||
const scss: StylePreprocessor = (source, map, options, load = require) => {
|
const scss: StylePreprocessor = (source, map, options, load = require) => {
|
||||||
const nodeSass = load('sass')
|
const nodeSass: typeof import('sass') = load('sass')
|
||||||
const finalOptions = {
|
const { compileString, renderSync } = nodeSass
|
||||||
|
|
||||||
|
const data = getSource(source, options.filename, options.additionalData)
|
||||||
|
let css: string
|
||||||
|
let dependencies: string[]
|
||||||
|
let sourceMap: any
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (compileString) {
|
||||||
|
const { pathToFileURL, fileURLToPath }: typeof import('url') = load('url')
|
||||||
|
|
||||||
|
const result = compileString(data, {
|
||||||
...options,
|
...options,
|
||||||
data: getSource(source, options.filename, options.additionalData),
|
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,
|
file: options.filename,
|
||||||
outFile: options.filename,
|
outFile: options.filename,
|
||||||
sourceMap: !!map,
|
sourceMap: !!map,
|
||||||
|
})
|
||||||
|
css = result.css.toString()
|
||||||
|
dependencies = result.stats.includedFiles
|
||||||
|
sourceMap = map ? JSON.parse(result.map!.toString()) : undefined
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
|
||||||
const result = nodeSass.renderSync(finalOptions)
|
|
||||||
const dependencies = result.stats.includedFiles
|
|
||||||
if (map) {
|
if (map) {
|
||||||
return {
|
return {
|
||||||
code: result.css.toString(),
|
code: css,
|
||||||
map: merge(map, JSON.parse(result.map.toString())),
|
|
||||||
errors: [],
|
errors: [],
|
||||||
dependencies,
|
dependencies,
|
||||||
|
map: merge(map, sourceMap!),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return { code: css, errors: [], dependencies }
|
||||||
return { code: result.css.toString(), errors: [], dependencies }
|
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
return { code: '', errors: [e], dependencies: [] }
|
return { code: '', errors: [e], dependencies: [] }
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vue/compiler-ssr",
|
"name": "@vue/compiler-ssr",
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"description": "@vue/compiler-ssr",
|
"description": "@vue/compiler-ssr",
|
||||||
"main": "dist/compiler-ssr.cjs.js",
|
"main": "dist/compiler-ssr.cjs.js",
|
||||||
"types": "dist/compiler-ssr.d.ts",
|
"types": "dist/compiler-ssr.d.ts",
|
||||||
|
|
|
@ -1107,4 +1107,36 @@ describe('reactivity/computed', () => {
|
||||||
end.prop4.value,
|
end.prop4.value,
|
||||||
]).toMatchObject([-2, -4, 2, 3])
|
]).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()
|
e.effect.stop()
|
||||||
expect(targetMap.get(obj)?.get('x')).toBeFalsy()
|
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 raw = {}
|
||||||
const arr = reactive([{}, {}])
|
const arr = reactive([{}, {}])
|
||||||
arr.push(raw)
|
arr.push(raw)
|
||||||
|
|
||||||
expect(arr.indexOf(raw)).toBe(2)
|
expect(arr.indexOf(raw)).toBe(2)
|
||||||
expect(arr.indexOf(raw, 3)).toBe(-1)
|
expect(arr.indexOf(raw, 3)).toBe(-1)
|
||||||
expect(arr.includes(raw)).toBe(true)
|
expect(arr.includes(raw)).toBe(true)
|
||||||
|
@ -89,6 +90,84 @@ describe('reactivity/reactive/Array', () => {
|
||||||
expect(index).toBe(1)
|
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', () => {
|
test('delete on Array should not trigger length dependency', () => {
|
||||||
const arr = reactive([1, 2, 3])
|
const arr = reactive([1, 2, 3])
|
||||||
const fn = vi.fn()
|
const fn = vi.fn()
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vue/reactivity",
|
"name": "@vue/reactivity",
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"description": "@vue/reactivity",
|
"description": "@vue/reactivity",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"module": "dist/reactivity.esm-bundler.js",
|
"module": "dist/reactivity.esm-bundler.js",
|
||||||
|
|
|
@ -8,7 +8,14 @@ import {
|
||||||
} from './reactive'
|
} from './reactive'
|
||||||
import { ITERATE_KEY, MAP_KEY_ITERATE_KEY, track, trigger } from './dep'
|
import { ITERATE_KEY, MAP_KEY_ITERATE_KEY, track, trigger } from './dep'
|
||||||
import { ReactiveFlags, TrackOpTypes, TriggerOpTypes } from './constants'
|
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'
|
import { warn } from './warning'
|
||||||
|
|
||||||
type CollectionTypes = IterableCollections | WeakCollections
|
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 =>
|
const getProto = <T extends CollectionTypes>(v: T): any =>
|
||||||
Reflect.getPrototypeOf(v)
|
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(
|
function createIterableMethod(
|
||||||
method: string | symbol,
|
method: string | symbol,
|
||||||
isReadonly: boolean,
|
isReadonly: boolean,
|
||||||
|
@ -232,74 +93,158 @@ function createReadonlyMethod(type: TriggerOpTypes): Function {
|
||||||
|
|
||||||
type Instrumentations = Record<string | symbol, Function | number>
|
type Instrumentations = Record<string | symbol, Function | number>
|
||||||
|
|
||||||
function createInstrumentations() {
|
function createInstrumentations(
|
||||||
const mutableInstrumentations: Instrumentations = {
|
readonly: boolean,
|
||||||
|
shallow: boolean,
|
||||||
|
): Instrumentations {
|
||||||
|
const instrumentations: Instrumentations = {
|
||||||
get(this: MapTypes, key: unknown) {
|
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() {
|
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 = {
|
extend(
|
||||||
get(this: MapTypes, key: unknown) {
|
instrumentations,
|
||||||
return get(this, key, false, true)
|
readonly
|
||||||
},
|
? {
|
||||||
get size() {
|
add: createReadonlyMethod(TriggerOpTypes.ADD),
|
||||||
return size(this as unknown as IterableCollections)
|
set: createReadonlyMethod(TriggerOpTypes.SET),
|
||||||
},
|
delete: createReadonlyMethod(TriggerOpTypes.DELETE),
|
||||||
has,
|
clear: createReadonlyMethod(TriggerOpTypes.CLEAR),
|
||||||
|
}
|
||||||
|
: {
|
||||||
add(this: SetTypes, value: unknown) {
|
add(this: SetTypes, value: unknown) {
|
||||||
return add.call(this, value, true)
|
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) {
|
set(this: MapTypes, key: unknown, value: unknown) {
|
||||||
return set.call(this, key, value, true)
|
if (!shallow && !isShallow(value) && !isReadonly(value)) {
|
||||||
},
|
value = toRaw(value)
|
||||||
delete: deleteEntry,
|
}
|
||||||
clear,
|
const target = toRaw(this)
|
||||||
forEach: createForEach(false, true),
|
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 readonlyInstrumentations: Instrumentations = {
|
const oldValue = get.call(target, key)
|
||||||
get(this: MapTypes, key: unknown) {
|
target.set(key, value)
|
||||||
return get(this, key, true)
|
if (!hadKey) {
|
||||||
|
trigger(target, TriggerOpTypes.ADD, key, value)
|
||||||
|
} else if (hasChanged(value, oldValue)) {
|
||||||
|
trigger(target, TriggerOpTypes.SET, key, value, oldValue)
|
||||||
|
}
|
||||||
|
return this
|
||||||
},
|
},
|
||||||
get size() {
|
delete(this: CollectionTypes, key: unknown) {
|
||||||
return size(this as unknown as IterableCollections, true)
|
const target = toRaw(this)
|
||||||
},
|
const { has, get } = getProto(target)
|
||||||
has(this: MapTypes, key: unknown) {
|
let hadKey = has.call(target, key)
|
||||||
return has.call(this, key, true)
|
if (!hadKey) {
|
||||||
},
|
key = toRaw(key)
|
||||||
add: createReadonlyMethod(TriggerOpTypes.ADD),
|
hadKey = has.call(target, key)
|
||||||
set: createReadonlyMethod(TriggerOpTypes.SET),
|
} else if (__DEV__) {
|
||||||
delete: createReadonlyMethod(TriggerOpTypes.DELETE),
|
checkIdentityKeys(target, has, key)
|
||||||
clear: createReadonlyMethod(TriggerOpTypes.CLEAR),
|
|
||||||
forEach: createForEach(true, false),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const shallowReadonlyInstrumentations: Instrumentations = {
|
const oldValue = get ? get.call(target, key) : undefined
|
||||||
get(this: MapTypes, key: unknown) {
|
// forward the operation before queueing reactions
|
||||||
return get(this, key, true, true)
|
const result = target.delete(key)
|
||||||
},
|
if (hadKey) {
|
||||||
get size() {
|
trigger(target, TriggerOpTypes.DELETE, key, undefined, oldValue)
|
||||||
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),
|
|
||||||
}
|
}
|
||||||
|
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 = [
|
const iteratorMethods = [
|
||||||
'keys',
|
'keys',
|
||||||
|
@ -309,39 +254,14 @@ function createInstrumentations() {
|
||||||
] as const
|
] as const
|
||||||
|
|
||||||
iteratorMethods.forEach(method => {
|
iteratorMethods.forEach(method => {
|
||||||
mutableInstrumentations[method] = createIterableMethod(method, false, false)
|
instrumentations[method] = createIterableMethod(method, readonly, shallow)
|
||||||
readonlyInstrumentations[method] = createIterableMethod(method, true, false)
|
|
||||||
shallowInstrumentations[method] = createIterableMethod(method, false, true)
|
|
||||||
shallowReadonlyInstrumentations[method] = createIterableMethod(
|
|
||||||
method,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
return [
|
return instrumentations
|
||||||
mutableInstrumentations,
|
|
||||||
readonlyInstrumentations,
|
|
||||||
shallowInstrumentations,
|
|
||||||
shallowReadonlyInstrumentations,
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const [
|
|
||||||
mutableInstrumentations,
|
|
||||||
readonlyInstrumentations,
|
|
||||||
shallowInstrumentations,
|
|
||||||
shallowReadonlyInstrumentations,
|
|
||||||
] = /* @__PURE__*/ createInstrumentations()
|
|
||||||
|
|
||||||
function createInstrumentationGetter(isReadonly: boolean, shallow: boolean) {
|
function createInstrumentationGetter(isReadonly: boolean, shallow: boolean) {
|
||||||
const instrumentations = shallow
|
const instrumentations = createInstrumentations(isReadonly, shallow)
|
||||||
? isReadonly
|
|
||||||
? shallowReadonlyInstrumentations
|
|
||||||
: shallowInstrumentations
|
|
||||||
: isReadonly
|
|
||||||
? readonlyInstrumentations
|
|
||||||
: mutableInstrumentations
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
target: CollectionTypes,
|
target: CollectionTypes,
|
||||||
|
|
|
@ -340,7 +340,7 @@ export function trigger(
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// schedule runs for SET | ADD | DELETE
|
// schedule runs for SET | ADD | DELETE
|
||||||
if (key !== void 0) {
|
if (key !== void 0 || depsMap.has(void 0)) {
|
||||||
run(depsMap.get(key))
|
run(depsMap.get(key))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -426,16 +426,16 @@ function removeSub(link: Link, soft = false) {
|
||||||
nextSub.prevSub = prevSub
|
nextSub.prevSub = prevSub
|
||||||
link.nextSub = undefined
|
link.nextSub = undefined
|
||||||
}
|
}
|
||||||
if (dep.subs === link) {
|
|
||||||
// was previous tail, point new tail to prev
|
|
||||||
dep.subs = prevSub
|
|
||||||
}
|
|
||||||
if (__DEV__ && dep.subsHead === link) {
|
if (__DEV__ && dep.subsHead === link) {
|
||||||
// was previous head, point new head to next
|
// was previous head, point new head to next
|
||||||
dep.subsHead = nextSub
|
dep.subsHead = nextSub
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!dep.subs && dep.computed) {
|
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
|
// if computed, unsubscribe it from all its deps so this computed and its
|
||||||
// value can be GCed
|
// value can be GCed
|
||||||
dep.computed.flags &= ~EffectFlags.TRACKING
|
dep.computed.flags &= ~EffectFlags.TRACKING
|
||||||
|
@ -445,6 +445,7 @@ function removeSub(link: Link, soft = false) {
|
||||||
removeSub(l, true)
|
removeSub(l, true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!soft && !--dep.sc && dep.map) {
|
if (!soft && !--dep.sc && dep.map) {
|
||||||
// #11979
|
// #11979
|
||||||
|
|
|
@ -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', () => {
|
test('warn props mutation', () => {
|
||||||
let instance: ComponentInternalInstance
|
let instance: ComponentInternalInstance
|
||||||
let setupProps: any
|
let setupProps: any
|
||||||
|
|
|
@ -32,6 +32,12 @@ describe('renderSlot', () => {
|
||||||
expect(vnode.key).toBe('foo')
|
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', () => {
|
it('should render slot fallback', () => {
|
||||||
const vnode = renderSlot({}, 'default', { key: 'foo' }, () => ['fallback'])
|
const vnode = renderSlot({}, 'default', { key: 'foo' }, () => ['fallback'])
|
||||||
expect(vnode.children).toEqual(['fallback'])
|
expect(vnode.children).toEqual(['fallback'])
|
||||||
|
|
|
@ -8,6 +8,7 @@ import {
|
||||||
defineAsyncComponent,
|
defineAsyncComponent,
|
||||||
defineComponent,
|
defineComponent,
|
||||||
h,
|
h,
|
||||||
|
onServerPrefetch,
|
||||||
useId,
|
useId,
|
||||||
} from 'vue'
|
} from 'vue'
|
||||||
import { renderToString } from '@vue/server-renderer'
|
import { renderToString } from '@vue/server-renderer'
|
||||||
|
@ -145,6 +146,40 @@ describe('useId', () => {
|
||||||
expect(await getOutput(() => factory(16, 0))).toBe(expected)
|
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 () => {
|
test('async setup()', async () => {
|
||||||
const factory = (
|
const factory = (
|
||||||
delay1: number,
|
delay1: number,
|
||||||
|
|
|
@ -153,10 +153,10 @@ describe('useModel', () => {
|
||||||
|
|
||||||
const compRender = vi.fn()
|
const compRender = vi.fn()
|
||||||
const Comp = defineComponent({
|
const Comp = defineComponent({
|
||||||
props: ['fooBar'],
|
props: ['foo-bar'],
|
||||||
emits: ['update:fooBar'],
|
emits: ['update:foo-bar'],
|
||||||
setup(props) {
|
setup(props) {
|
||||||
foo = useModel(props, 'fooBar')
|
foo = useModel(props, 'foo-bar')
|
||||||
return () => {
|
return () => {
|
||||||
compRender()
|
compRender()
|
||||||
return foo.value
|
return foo.value
|
||||||
|
@ -192,10 +192,10 @@ describe('useModel', () => {
|
||||||
|
|
||||||
const compRender = vi.fn()
|
const compRender = vi.fn()
|
||||||
const Comp = defineComponent({
|
const Comp = defineComponent({
|
||||||
props: ['fooBar'],
|
props: ['foo-bar'],
|
||||||
emits: ['update:fooBar'],
|
emits: ['update:foo-bar'],
|
||||||
setup(props) {
|
setup(props) {
|
||||||
foo = useModel(props, 'fooBar')
|
foo = useModel(props, 'foo-bar')
|
||||||
return () => {
|
return () => {
|
||||||
compRender()
|
compRender()
|
||||||
return foo.value
|
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
|
// #10607
|
||||||
test('update component stable slot (prod + optimized mode)', async () => {
|
test('update component stable slot (prod + optimized mode)', async () => {
|
||||||
__DEV__ = false
|
__DEV__ = false
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
import {
|
import {
|
||||||
Fragment,
|
Fragment,
|
||||||
type FunctionalComponent,
|
type FunctionalComponent,
|
||||||
|
Teleport,
|
||||||
createBlock,
|
createBlock,
|
||||||
createCommentVNode,
|
createCommentVNode,
|
||||||
createElementBlock,
|
createElementBlock,
|
||||||
|
@ -391,6 +392,26 @@ describe('attribute fallthrough', () => {
|
||||||
expect(`Extraneous non-emits event listeners`).toHaveBeenWarned()
|
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', () => {
|
it('should dedupe same listeners when $attrs is used during render', () => {
|
||||||
const click = vi.fn()
|
const click = vi.fn()
|
||||||
const count = ref(0)
|
const count = ref(0)
|
||||||
|
|
|
@ -217,6 +217,7 @@ describe('api: template refs', () => {
|
||||||
}
|
}
|
||||||
render(h(Comp), root)
|
render(h(Comp), root)
|
||||||
expect(state.refKey).toBe(root.children[0])
|
expect(state.refKey).toBe(root.children[0])
|
||||||
|
expect('Template ref "refKey" used on a non-ref value').toHaveBeenWarned()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('multiple root refs', () => {
|
test('multiple root refs', () => {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vue/runtime-core",
|
"name": "@vue/runtime-core",
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"description": "@vue/runtime-core",
|
"description": "@vue/runtime-core",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"module": "dist/runtime-core.esm-bundler.js",
|
"module": "dist/runtime-core.esm-bundler.js",
|
||||||
|
|
|
@ -265,7 +265,7 @@ export function defineComponent<
|
||||||
Mixin,
|
Mixin,
|
||||||
Extends,
|
Extends,
|
||||||
ResolvedEmits,
|
ResolvedEmits,
|
||||||
RuntimeEmitsKeys,
|
{},
|
||||||
{},
|
{},
|
||||||
false,
|
false,
|
||||||
InjectOptions,
|
InjectOptions,
|
||||||
|
|
|
@ -331,7 +331,8 @@ type PropsWithDefaults<
|
||||||
T,
|
T,
|
||||||
Defaults extends InferDefaults<T>,
|
Defaults extends InferDefaults<T>,
|
||||||
BKeys extends keyof T,
|
BKeys extends keyof T,
|
||||||
> = Readonly<MappedOmit<T, keyof Defaults>> & {
|
> = T extends unknown
|
||||||
|
? Readonly<MappedOmit<T, keyof Defaults>> & {
|
||||||
readonly [K in keyof Defaults as K extends keyof T
|
readonly [K in keyof Defaults as K extends keyof T
|
||||||
? K
|
? K
|
||||||
: never]-?: K extends keyof T
|
: never]-?: K extends keyof T
|
||||||
|
@ -346,6 +347,7 @@ type PropsWithDefaults<
|
||||||
: boolean
|
: boolean
|
||||||
: boolean
|
: boolean
|
||||||
}
|
}
|
||||||
|
: never
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Vue `<script setup>` compiler macro for providing props default values when
|
* Vue `<script setup>` compiler macro for providing props default values when
|
||||||
|
|
|
@ -856,11 +856,10 @@ function setupStatefulComponent(
|
||||||
// 2. call setup()
|
// 2. call setup()
|
||||||
const { setup } = Component
|
const { setup } = Component
|
||||||
if (setup) {
|
if (setup) {
|
||||||
|
pauseTracking()
|
||||||
const setupContext = (instance.setupContext =
|
const setupContext = (instance.setupContext =
|
||||||
setup.length > 1 ? createSetupContext(instance) : null)
|
setup.length > 1 ? createSetupContext(instance) : null)
|
||||||
|
|
||||||
const reset = setCurrentInstance(instance)
|
const reset = setCurrentInstance(instance)
|
||||||
pauseTracking()
|
|
||||||
const setupResult = callWithErrorHandling(
|
const setupResult = callWithErrorHandling(
|
||||||
setup,
|
setup,
|
||||||
instance,
|
instance,
|
||||||
|
@ -870,12 +869,16 @@ function setupStatefulComponent(
|
||||||
setupContext,
|
setupContext,
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
const isAsyncSetup = isPromise(setupResult)
|
||||||
resetTracking()
|
resetTracking()
|
||||||
reset()
|
reset()
|
||||||
|
|
||||||
if (isPromise(setupResult)) {
|
if ((isAsyncSetup || instance.sp) && !isAsyncWrapper(instance)) {
|
||||||
// async setup, mark as async boundary for useId()
|
// async setup / serverPrefetch, mark as async boundary for useId()
|
||||||
if (!isAsyncWrapper(instance)) markAsyncBoundary(instance)
|
markAsyncBoundary(instance)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isAsyncSetup) {
|
||||||
setupResult.then(unsetCurrentInstance, unsetCurrentInstance)
|
setupResult.then(unsetCurrentInstance, unsetCurrentInstance)
|
||||||
if (isSSR) {
|
if (isSSR) {
|
||||||
// return the promise so server-renderer can wait on it
|
// return the promise so server-renderer can wait on it
|
||||||
|
@ -1003,7 +1006,7 @@ export function finishComponentSetup(
|
||||||
instance.vnode.props &&
|
instance.vnode.props &&
|
||||||
instance.vnode.props['inline-template']) ||
|
instance.vnode.props['inline-template']) ||
|
||||||
Component.template ||
|
Component.template ||
|
||||||
resolveMergedOptions(instance).template
|
(__FEATURE_OPTIONS_API__ && resolveMergedOptions(instance).template)
|
||||||
if (template) {
|
if (template) {
|
||||||
if (__DEV__) {
|
if (__DEV__) {
|
||||||
startMeasure(instance, `compile`)
|
startMeasure(instance, `compile`)
|
||||||
|
|
|
@ -654,6 +654,7 @@ function validateProps(
|
||||||
) {
|
) {
|
||||||
const resolvedValues = toRaw(props)
|
const resolvedValues = toRaw(props)
|
||||||
const options = instance.propsOptions[0]
|
const options = instance.propsOptions[0]
|
||||||
|
const camelizePropsKey = Object.keys(rawProps).map(key => camelize(key))
|
||||||
for (const key in options) {
|
for (const key in options) {
|
||||||
let opt = options[key]
|
let opt = options[key]
|
||||||
if (opt == null) continue
|
if (opt == null) continue
|
||||||
|
@ -662,7 +663,7 @@ function validateProps(
|
||||||
resolvedValues[key],
|
resolvedValues[key],
|
||||||
opt,
|
opt,
|
||||||
__DEV__ ? shallowReadonly(resolvedValues) : resolvedValues,
|
__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 (` +
|
`Extraneous non-props attributes (` +
|
||||||
`${extraAttrs.join(', ')}) ` +
|
`${extraAttrs.join(', ')}) ` +
|
||||||
`were passed to component but could not be automatically inherited ` +
|
`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) {
|
if (eventAttrs.length) {
|
||||||
|
|
|
@ -147,7 +147,7 @@ export const TeleportImpl = {
|
||||||
}
|
}
|
||||||
if (!disabled) {
|
if (!disabled) {
|
||||||
mount(target, targetAnchor)
|
mount(target, targetAnchor)
|
||||||
updateCssVars(n2)
|
updateCssVars(n2, false)
|
||||||
}
|
}
|
||||||
} else if (__DEV__ && !disabled) {
|
} else if (__DEV__ && !disabled) {
|
||||||
warn(
|
warn(
|
||||||
|
@ -160,7 +160,7 @@ export const TeleportImpl = {
|
||||||
|
|
||||||
if (disabled) {
|
if (disabled) {
|
||||||
mount(container, mainAnchor)
|
mount(container, mainAnchor)
|
||||||
updateCssVars(n2)
|
updateCssVars(n2, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isTeleportDeferred(n2.props)) {
|
if (isTeleportDeferred(n2.props)) {
|
||||||
|
@ -267,7 +267,7 @@ export const TeleportImpl = {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateCssVars(n2)
|
updateCssVars(n2, disabled)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -389,12 +389,13 @@ function hydrateTeleport(
|
||||||
querySelector,
|
querySelector,
|
||||||
))
|
))
|
||||||
if (target) {
|
if (target) {
|
||||||
|
const disabled = isTeleportDisabled(vnode.props)
|
||||||
// if multiple teleports rendered to the same target element, we need to
|
// 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
|
// pick up from where the last teleport finished instead of the first node
|
||||||
const targetNode =
|
const targetNode =
|
||||||
(target as TeleportTargetElement)._lpa || target.firstChild
|
(target as TeleportTargetElement)._lpa || target.firstChild
|
||||||
if (vnode.shapeFlag & ShapeFlags.ARRAY_CHILDREN) {
|
if (vnode.shapeFlag & ShapeFlags.ARRAY_CHILDREN) {
|
||||||
if (isTeleportDisabled(vnode.props)) {
|
if (disabled) {
|
||||||
vnode.anchor = hydrateChildren(
|
vnode.anchor = hydrateChildren(
|
||||||
nextSibling(node),
|
nextSibling(node),
|
||||||
vnode,
|
vnode,
|
||||||
|
@ -446,7 +447,7 @@ function hydrateTeleport(
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateCssVars(vnode)
|
updateCssVars(vnode, disabled)
|
||||||
}
|
}
|
||||||
return vnode.anchor && nextSibling(vnode.anchor as Node)
|
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.
|
// presence of .ut method indicates owner component uses css vars.
|
||||||
// code path here can assume browser environment.
|
// code path here can assume browser environment.
|
||||||
const ctx = vnode.ctx
|
const ctx = vnode.ctx
|
||||||
if (ctx && ctx.ut) {
|
if (ctx && ctx.ut) {
|
||||||
let node = vnode.targetStart
|
let node, anchor
|
||||||
while (node && node !== vnode.targetAnchor) {
|
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)
|
if (node.nodeType === 1) node.setAttribute('data-v-owner', ctx.uid)
|
||||||
node = node.nextSibling
|
node = node.nextSibling
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ import {
|
||||||
isVNode,
|
isVNode,
|
||||||
openBlock,
|
openBlock,
|
||||||
} from '../vnode'
|
} from '../vnode'
|
||||||
import { PatchFlags, SlotFlags } from '@vue/shared'
|
import { PatchFlags, SlotFlags, isSymbol } from '@vue/shared'
|
||||||
import { warn } from '../warning'
|
import { warn } from '../warning'
|
||||||
import { isAsyncWrapper } from '../apiAsyncComponent'
|
import { isAsyncWrapper } from '../apiAsyncComponent'
|
||||||
|
|
||||||
|
@ -72,15 +72,16 @@ export function renderSlot(
|
||||||
}
|
}
|
||||||
openBlock()
|
openBlock()
|
||||||
const validSlotContent = slot && ensureValidVNode(slot(props))
|
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(
|
const rendered = createBlock(
|
||||||
Fragment,
|
Fragment,
|
||||||
{
|
{
|
||||||
key:
|
key:
|
||||||
(props.key ||
|
(slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) +
|
||||||
// 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}`) +
|
|
||||||
// #7256 force differentiate fallback content from actual content
|
// #7256 force differentiate fallback content from actual content
|
||||||
(!validSlotContent && fallback ? '_fb' : ''),
|
(!validSlotContent && fallback ? '_fb' : ''),
|
||||||
},
|
},
|
||||||
|
|
|
@ -28,14 +28,14 @@ export function useModel(
|
||||||
return ref() as any
|
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.`)
|
warn(`useModel() called with prop "${name}" which is not declared.`)
|
||||||
return ref() as any
|
return ref() as any
|
||||||
}
|
}
|
||||||
|
|
||||||
const camelizedName = camelize(name)
|
|
||||||
const hyphenatedName = hyphenate(name)
|
const hyphenatedName = hyphenate(name)
|
||||||
const modifiers = getModelModifiers(props, name)
|
const modifiers = getModelModifiers(props, camelizedName)
|
||||||
|
|
||||||
const res = customRef((track, trigger) => {
|
const res = customRef((track, trigger) => {
|
||||||
let localValue: any
|
let localValue: any
|
||||||
|
@ -43,7 +43,7 @@ export function useModel(
|
||||||
let prevEmittedValue: any
|
let prevEmittedValue: any
|
||||||
|
|
||||||
watchSyncEffect(() => {
|
watchSyncEffect(() => {
|
||||||
const propValue = props[name]
|
const propValue = props[camelizedName]
|
||||||
if (hasChanged(localValue, propValue)) {
|
if (hasChanged(localValue, propValue)) {
|
||||||
localValue = propValue
|
localValue = propValue
|
||||||
trigger()
|
trigger()
|
||||||
|
|
|
@ -385,7 +385,10 @@ export function createHydrationFunctions(
|
||||||
let needCallTransitionHooks = false
|
let needCallTransitionHooks = false
|
||||||
if (isTemplateNode(el)) {
|
if (isTemplateNode(el)) {
|
||||||
needCallTransitionHooks =
|
needCallTransitionHooks =
|
||||||
needTransition(parentSuspense, transition) &&
|
needTransition(
|
||||||
|
null, // no need check parentSuspense in hydration
|
||||||
|
transition,
|
||||||
|
) &&
|
||||||
parentComponent &&
|
parentComponent &&
|
||||||
parentComponent.vnode.props &&
|
parentComponent.vnode.props &&
|
||||||
parentComponent.vnode.props.appear
|
parentComponent.vnode.props.appear
|
||||||
|
|
|
@ -1,6 +1,13 @@
|
||||||
import { isString } from '@vue/shared'
|
import { getGlobalThis, isString } from '@vue/shared'
|
||||||
import { DOMNodeTypes, isComment } from './hydration'
|
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.
|
* A lazy hydration strategy for async components.
|
||||||
* @param hydrate - call this to perform the actual hydration.
|
* @param hydrate - call this to perform the actual hydration.
|
||||||
|
|
|
@ -69,9 +69,18 @@ export function setRef(
|
||||||
setupState === EMPTY_OBJ
|
setupState === EMPTY_OBJ
|
||||||
? () => false
|
? () => false
|
||||||
: (key: string) => {
|
: (key: string) => {
|
||||||
if (__DEV__ && knownTemplateRefs.has(rawSetupState[key] as any)) {
|
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 false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return hasOwn(rawSetupState, key)
|
return hasOwn(rawSetupState, key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1416,4 +1416,39 @@ describe('defineCustomElement', () => {
|
||||||
expect(e.shadowRoot!.innerHTML).toBe(`<div>hello</div>`)
|
expect(e.shadowRoot!.innerHTML).toBe(`<div>hello</div>`)
|
||||||
expect(e._internals).toBeTruthy()
|
expect(e._internals).toBeTruthy()
|
||||||
})
|
})
|
||||||
|
|
||||||
|
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)
|
expect(() => render(h(App), root)).not.toThrow(TypeError)
|
||||||
await nextTick()
|
await nextTick()
|
||||||
expect(target.children.length).toBe(0)
|
expect(target.children.length).toBe(0)
|
||||||
|
expect(root.children[0].outerHTML.includes('data-v-owner')).toBe(true)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('with string style', async () => {
|
test('with string style', async () => {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vue/runtime-dom",
|
"name": "@vue/runtime-dom",
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"description": "@vue/runtime-dom",
|
"description": "@vue/runtime-dom",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"module": "dist/runtime-dom.esm-bundler.js",
|
"module": "dist/runtime-dom.esm-bundler.js",
|
||||||
|
|
|
@ -160,7 +160,7 @@ export const vModelCheckbox: ModelDirective<HTMLInputElement> = {
|
||||||
|
|
||||||
function setChecked(
|
function setChecked(
|
||||||
el: HTMLInputElement,
|
el: HTMLInputElement,
|
||||||
{ value }: DirectiveBinding,
|
{ value, oldValue }: DirectiveBinding,
|
||||||
vnode: VNode,
|
vnode: VNode,
|
||||||
) {
|
) {
|
||||||
// store the v-model value on the element so it can be accessed by the
|
// 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)) {
|
} else if (isSet(value)) {
|
||||||
checked = value.has(vnode.props!.value)
|
checked = value.has(vnode.props!.value)
|
||||||
} else {
|
} else {
|
||||||
|
if (value === oldValue) return
|
||||||
checked = looseEqual(value, getCheckboxValue(el, true))
|
checked = looseEqual(value, getCheckboxValue(el, true))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ export function patchDOMProp(
|
||||||
key: string,
|
key: string,
|
||||||
value: any,
|
value: any,
|
||||||
parentComponent: any,
|
parentComponent: any,
|
||||||
|
attrName?: string,
|
||||||
): void {
|
): void {
|
||||||
// __UNSAFE__
|
// __UNSAFE__
|
||||||
// Reason: potentially setting innerHTML.
|
// 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 &&
|
(el as VueElement)._isVueCE &&
|
||||||
(/[A-Z]/.test(key) || !isString(nextValue))
|
(/[A-Z]/.test(key) || !isString(nextValue))
|
||||||
) {
|
) {
|
||||||
patchDOMProp(el, camelize(key), nextValue, parentComponent)
|
patchDOMProp(el, camelize(key), nextValue, parentComponent, key)
|
||||||
} else {
|
} else {
|
||||||
// special case for <input v-model type="checkbox"> with
|
// special case for <input v-model type="checkbox"> with
|
||||||
// :true-value & :false-value
|
// :true-value & :false-value
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vue/server-renderer",
|
"name": "@vue/server-renderer",
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"description": "@vue/server-renderer",
|
"description": "@vue/server-renderer",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"module": "dist/server-renderer.esm-bundler.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', () => {
|
describe('normalizeClass', () => {
|
||||||
test('handles undefined correctly', () => {
|
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', () => {
|
test('handles empty array correctly', () => {
|
||||||
expect(normalizeClass([])).toEqual('')
|
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",
|
"name": "@vue/shared",
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"description": "internal utils shared across @vue packages",
|
"description": "internal utils shared across @vue packages",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"module": "dist/shared.esm-bundler.js",
|
"module": "dist/shared.esm-bundler.js",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "@vue/compat",
|
"name": "@vue/compat",
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"description": "Vue 3 compatibility build for Vue 2",
|
"description": "Vue 3 compatibility build for Vue 2",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"module": "dist/vue.runtime.esm-bundler.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",
|
"name": "vue",
|
||||||
"version": "3.5.11",
|
"version": "3.5.12",
|
||||||
"description": "The progressive JavaScript framework for building modern web UI.",
|
"description": "The progressive JavaScript framework for building modern web UI.",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"module": "dist/vue.runtime.esm-bundler.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
|
specifier: 5.0.4
|
||||||
version: 5.0.4(rollup@4.24.0)
|
version: 5.0.4(rollup@4.24.0)
|
||||||
'@swc/core':
|
'@swc/core':
|
||||||
specifier: ^1.7.28
|
specifier: ^1.7.35
|
||||||
version: 1.7.28
|
version: 1.7.35
|
||||||
'@types/hash-sum':
|
'@types/hash-sum':
|
||||||
specifier: ^1.0.2
|
specifier: ^1.0.2
|
||||||
version: 1.0.2
|
version: 1.0.2
|
||||||
'@types/node':
|
'@types/node':
|
||||||
specifier: ^20.16.10
|
specifier: ^20.16.11
|
||||||
version: 20.16.10
|
version: 20.16.11
|
||||||
'@types/semver':
|
'@types/semver':
|
||||||
specifier: ^7.5.8
|
specifier: ^7.5.8
|
||||||
version: 7.5.8
|
version: 7.5.8
|
||||||
|
@ -70,10 +70,10 @@ importers:
|
||||||
version: 6.1.4
|
version: 6.1.4
|
||||||
'@vitest/coverage-v8':
|
'@vitest/coverage-v8':
|
||||||
specifier: ^2.1.1
|
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':
|
'@vitest/eslint-plugin':
|
||||||
specifier: ^1.0.1
|
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':
|
'@vue/consolidate':
|
||||||
specifier: 1.0.0
|
specifier: 1.0.0
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
|
@ -108,8 +108,8 @@ importers:
|
||||||
specifier: ^4.17.21
|
specifier: ^4.17.21
|
||||||
version: 4.17.21
|
version: 4.17.21
|
||||||
magic-string:
|
magic-string:
|
||||||
specifier: ^0.30.11
|
specifier: ^0.30.12
|
||||||
version: 0.30.11
|
version: 0.30.12
|
||||||
markdown-table:
|
markdown-table:
|
||||||
specifier: ^3.0.3
|
specifier: ^3.0.3
|
||||||
version: 3.0.3
|
version: 3.0.3
|
||||||
|
@ -171,14 +171,14 @@ importers:
|
||||||
specifier: ~5.6.2
|
specifier: ~5.6.2
|
||||||
version: 5.6.2
|
version: 5.6.2
|
||||||
typescript-eslint:
|
typescript-eslint:
|
||||||
specifier: ^8.8.0
|
specifier: ^8.8.1
|
||||||
version: 8.8.0(eslint@9.12.0)(typescript@5.6.2)
|
version: 8.8.1(eslint@9.12.0)(typescript@5.6.2)
|
||||||
vite:
|
vite:
|
||||||
specifier: 'catalog:'
|
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:
|
vitest:
|
||||||
specifier: ^2.1.1
|
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:
|
packages-private/dts-built-test:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -218,10 +218,10 @@ importers:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@vitejs/plugin-vue':
|
'@vitejs/plugin-vue':
|
||||||
specifier: 'catalog:'
|
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:
|
vite:
|
||||||
specifier: 'catalog:'
|
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:
|
packages-private/template-explorer:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -236,10 +236,10 @@ importers:
|
||||||
devDependencies:
|
devDependencies:
|
||||||
'@vitejs/plugin-vue':
|
'@vitejs/plugin-vue':
|
||||||
specifier: 'catalog:'
|
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:
|
vite:
|
||||||
specifier: 'catalog:'
|
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:
|
vue:
|
||||||
specifier: workspace:*
|
specifier: workspace:*
|
||||||
version: link:../../packages/vue
|
version: link:../../packages/vue
|
||||||
|
@ -333,8 +333,8 @@ importers:
|
||||||
specifier: ^3.0.3
|
specifier: ^3.0.3
|
||||||
version: 3.0.3
|
version: 3.0.3
|
||||||
sass:
|
sass:
|
||||||
specifier: ^1.79.4
|
specifier: ^1.79.5
|
||||||
version: 1.79.4
|
version: 1.79.5
|
||||||
|
|
||||||
packages/compiler-ssr:
|
packages/compiler-ssr:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -861,6 +861,82 @@ packages:
|
||||||
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
|
||||||
engines: {node: '>= 8'}
|
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':
|
'@pkgjs/parseargs@0.11.0':
|
||||||
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
@ -1093,68 +1169,68 @@ packages:
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@swc/core-darwin-arm64@1.7.28':
|
'@swc/core-darwin-arm64@1.7.35':
|
||||||
resolution: {integrity: sha512-BNkj6enHo2pdzOpCtQGKZbXT2A/qWIr0CVtbTM4WkJ3MCK/glbFsyO6X59p1r8+gfaZG4bWYnTTu+RuUAcsL5g==}
|
resolution: {integrity: sha512-BQSSozVxjxS+SVQz6e3GC/+OBWGIK3jfe52pWdANmycdjF3ch7lrCKTHTU7eHwyoJ96mofszPf5AsiVJF34Fwg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@swc/core-darwin-x64@1.7.28':
|
'@swc/core-darwin-x64@1.7.35':
|
||||||
resolution: {integrity: sha512-96zQ+X5Fd6P/RNPkOyikTJgEc2M4TzznfYvjRd2hye5h22jhxCLL/csoauDgN7lYfd7mwsZ/sVXwJTMKl+vZSA==}
|
resolution: {integrity: sha512-44TYdKN/EWtkU88foXR7IGki9JzhEJzaFOoPevfi9Xe7hjAD/x2+AJOWWqQNzDPMz9+QewLdUVLyR6s5okRgtg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [darwin]
|
os: [darwin]
|
||||||
|
|
||||||
'@swc/core-linux-arm-gnueabihf@1.7.28':
|
'@swc/core-linux-arm-gnueabihf@1.7.35':
|
||||||
resolution: {integrity: sha512-l2100Wx6LdXMOmOW3+KoHhBhyZrGdz8ylkygcVOC0QHp6YIATfuG+rRHksfyEWCSOdL3anM9MJZJX26KT/s+XQ==}
|
resolution: {integrity: sha512-ccfA5h3zxwioD+/z/AmYtkwtKz9m4rWTV7RoHq6Jfsb0cXHrd6tbcvgqRWXra1kASlE+cDWsMtEZygs9dJRtUQ==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
cpu: [arm]
|
cpu: [arm]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@swc/core-linux-arm64-gnu@1.7.28':
|
'@swc/core-linux-arm64-gnu@1.7.35':
|
||||||
resolution: {integrity: sha512-03m6iQ5Bv9u2VPnNRyaBmE8eHi056eE39L0gXcqGoo46GAGuoqYHt9pDz8wS6EgoN4t85iBMUZrkCNqFKkN6ZQ==}
|
resolution: {integrity: sha512-hx65Qz+G4iG/IVtxJKewC5SJdki8PAPFGl6gC/57Jb0+jA4BIoGLD/J3Q3rCPeoHfdqpkCYpahtyUq8CKx41Jg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@swc/core-linux-arm64-musl@1.7.28':
|
'@swc/core-linux-arm64-musl@1.7.35':
|
||||||
resolution: {integrity: sha512-vqVOpG/jc8mvTKQjaPBLhr7tnWyzuztOHsPnJqMWmg7zGcMeQC/2c5pU4uzRAfXMTp25iId6s4Y4wWfPS1EeDw==}
|
resolution: {integrity: sha512-kL6tQL9No7UEoEvDRuPxzPTpxrvbwYteNRbdChSSP74j13/55G2/2hLmult5yFFaWuyoyU/2lvzjRL/i8OLZxg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@swc/core-linux-x64-gnu@1.7.28':
|
'@swc/core-linux-x64-gnu@1.7.35':
|
||||||
resolution: {integrity: sha512-HGwpWuB83Kr+V0E+zT5UwIIY9OxiS8aLd0UVMRVWuO8SrQyKm9HKJ46+zoAb8tfJrpZftfxvbn2ayZWR7gqosA==}
|
resolution: {integrity: sha512-Ke4rcLQSwCQ2LHdJX1FtnqmYNQ3IX6BddKlUtS7mcK13IHkQzZWp0Dcu6MgNA3twzb/dBpKX5GLy07XdGgfmyw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@swc/core-linux-x64-musl@1.7.28':
|
'@swc/core-linux-x64-musl@1.7.35':
|
||||||
resolution: {integrity: sha512-q2Y2T8y8EgFtIiRyInnAXNe94aaHX74F0ha1Bl9VdRxE0u1/So+3VLbPvtp4V3Z6pj5pOePfCQJKifnllgAQ9A==}
|
resolution: {integrity: sha512-T30tlLnz0kYyDFyO5RQF5EQ4ENjW9+b56hEGgFUYmfhFhGA4E4V67iEx7KIG4u0whdPG7oy3qjyyIeTb7nElEw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [linux]
|
os: [linux]
|
||||||
|
|
||||||
'@swc/core-win32-arm64-msvc@1.7.28':
|
'@swc/core-win32-arm64-msvc@1.7.35':
|
||||||
resolution: {integrity: sha512-bCqh4uBT/59h3dWK1v91In6qzz8rKoWoFRxCtNQLIK4jP55K0U231ZK9oN7neZD6bzcOUeFvOGgcyMAgDfFWfA==}
|
resolution: {integrity: sha512-CfM/k8mvtuMyX+okRhemfLt784PLS0KF7Q9djA8/Dtavk0L5Ghnq+XsGltO3d8B8+XZ7YOITsB14CrjehzeHsg==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
cpu: [arm64]
|
cpu: [arm64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@swc/core-win32-ia32-msvc@1.7.28':
|
'@swc/core-win32-ia32-msvc@1.7.35':
|
||||||
resolution: {integrity: sha512-XTHbHrksnrqK3JSJ2sbuMWvdJ6/G0roRpgyVTmNDfhTYPOwcVaL/mSrPGLwbksYUbq7ckwoKzrobhdxvQzPsDA==}
|
resolution: {integrity: sha512-ATB3uuH8j/RmS64EXQZJSbo2WXfRNpTnQszHME/sGaexsuxeijrp3DTYSFAA3R2Bu6HbIIX6jempe1Au8I3j+A==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
cpu: [ia32]
|
cpu: [ia32]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@swc/core-win32-x64-msvc@1.7.28':
|
'@swc/core-win32-x64-msvc@1.7.35':
|
||||||
resolution: {integrity: sha512-jyXeoq6nX8abiCy2EpporsC5ywNENs4ocYuvxo1LSxDktWN1E2MTXq3cdJcEWB2Vydxq0rDcsGyzkRPMzFhkZw==}
|
resolution: {integrity: sha512-iDGfQO1571NqWUXtLYDhwIELA/wadH42ioGn+J9R336nWx40YICzy9UQyslWRhqzhQ5kT+QXAW/MoCWc058N6Q==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
cpu: [x64]
|
cpu: [x64]
|
||||||
os: [win32]
|
os: [win32]
|
||||||
|
|
||||||
'@swc/core@1.7.28':
|
'@swc/core@1.7.35':
|
||||||
resolution: {integrity: sha512-XapcMgsOS0cKh01AFEj+qXOk6KM4NZhp7a5vPicdhkRR8RzvjrCa7DTtijMxfotU8bqaEHguxmiIag2HUlT8QQ==}
|
resolution: {integrity: sha512-3cUteCTbr2r5jqfgx0r091sfq5Mgh6F1SQh8XAOnSvtKzwv2bC31mvBHVAieD1uPa2kHJhLav20DQgXOhpEitw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@swc/helpers': '*'
|
'@swc/helpers': '*'
|
||||||
|
@ -1165,8 +1241,8 @@ packages:
|
||||||
'@swc/counter@0.1.3':
|
'@swc/counter@0.1.3':
|
||||||
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
|
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
|
||||||
|
|
||||||
'@swc/types@0.1.12':
|
'@swc/types@0.1.13':
|
||||||
resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==}
|
resolution: {integrity: sha512-JL7eeCk6zWCbiYQg2xQSdLXQJl8Qoc9rXmG2cEKvHe3CKwMHwHGpfOb8frzNLmbycOo6I51qxnLnn9ESf4I20Q==}
|
||||||
|
|
||||||
'@tootallnate/quickjs-emscripten@0.23.0':
|
'@tootallnate/quickjs-emscripten@0.23.0':
|
||||||
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
|
resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==}
|
||||||
|
@ -1183,8 +1259,8 @@ packages:
|
||||||
'@types/json-schema@7.0.15':
|
'@types/json-schema@7.0.15':
|
||||||
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
|
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
|
||||||
|
|
||||||
'@types/node@20.16.10':
|
'@types/node@20.16.11':
|
||||||
resolution: {integrity: sha512-vQUKgWTjEIRFCvK6CyriPH3MZYiYlNy0fKiEYHWbcoWLEgs4opurGGKlebrTLqdSMIbXImH6XExNiIyNUv3WpA==}
|
resolution: {integrity: sha512-y+cTCACu92FyA5fgQSAI8A1H429g7aSK2HsO7K4XYUWc4dY5IUz55JSDIYT6/VsOLfGy8vmvQYC2hfb0iF16Uw==}
|
||||||
|
|
||||||
'@types/normalize-package-data@2.4.4':
|
'@types/normalize-package-data@2.4.4':
|
||||||
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
|
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
|
||||||
|
@ -1204,8 +1280,8 @@ packages:
|
||||||
'@types/yauzl@2.10.3':
|
'@types/yauzl@2.10.3':
|
||||||
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
|
resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==}
|
||||||
|
|
||||||
'@typescript-eslint/eslint-plugin@8.8.0':
|
'@typescript-eslint/eslint-plugin@8.8.1':
|
||||||
resolution: {integrity: sha512-wORFWjU30B2WJ/aXBfOm1LX9v9nyt9D3jsSOxC3cCaTQGCW5k4jNpmjFv3U7p/7s4yvdjHzwtv2Sd2dOyhjS0A==}
|
resolution: {integrity: sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
|
'@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
|
||||||
|
@ -1215,8 +1291,8 @@ packages:
|
||||||
typescript:
|
typescript:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@typescript-eslint/parser@8.8.0':
|
'@typescript-eslint/parser@8.8.1':
|
||||||
resolution: {integrity: sha512-uEFUsgR+tl8GmzmLjRqz+VrDv4eoaMqMXW7ruXfgThaAShO9JTciKpEsB+TvnfFfbg5IpujgMXVV36gOJRLtZg==}
|
resolution: {integrity: sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: ^8.57.0 || ^9.0.0
|
eslint: ^8.57.0 || ^9.0.0
|
||||||
|
@ -1229,12 +1305,12 @@ packages:
|
||||||
resolution: {integrity: sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==}
|
resolution: {integrity: sha512-06JOQ9Qgj33yvBEx6tpC8ecP9o860rsR22hWMEd12WcTRrfaFgHr2RB/CA/B+7BMhHkXT4chg2MyboGdFGawYg==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@typescript-eslint/scope-manager@8.8.0':
|
'@typescript-eslint/scope-manager@8.8.1':
|
||||||
resolution: {integrity: sha512-EL8eaGC6gx3jDd8GwEFEV091210U97J0jeEHrAYvIYosmEGet4wJ+g0SYmLu+oRiAwbSA5AVrt6DxLHfdd+bUg==}
|
resolution: {integrity: sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@typescript-eslint/type-utils@8.8.0':
|
'@typescript-eslint/type-utils@8.8.1':
|
||||||
resolution: {integrity: sha512-IKwJSS7bCqyCeG4NVGxnOP6lLT9Okc3Zj8hLO96bpMkJab+10HIfJbMouLrlpyOr3yrQ1cA413YPFiGd1mW9/Q==}
|
resolution: {integrity: sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
typescript: '*'
|
typescript: '*'
|
||||||
|
@ -1246,8 +1322,8 @@ packages:
|
||||||
resolution: {integrity: sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==}
|
resolution: {integrity: sha512-qjkormnQS5wF9pjSi6q60bKUHH44j2APxfh9TQRXK8wbYVeDYYdYJGIROL87LGZZ2gz3Rbmjc736qyL8deVtdw==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@typescript-eslint/types@8.8.0':
|
'@typescript-eslint/types@8.8.1':
|
||||||
resolution: {integrity: sha512-QJwc50hRCgBd/k12sTykOJbESe1RrzmX6COk8Y525C9l7oweZ+1lw9JiU56im7Amm8swlz00DRIlxMYLizr2Vw==}
|
resolution: {integrity: sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@typescript-eslint/typescript-estree@8.5.0':
|
'@typescript-eslint/typescript-estree@8.5.0':
|
||||||
|
@ -1259,8 +1335,8 @@ packages:
|
||||||
typescript:
|
typescript:
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@typescript-eslint/typescript-estree@8.8.0':
|
'@typescript-eslint/typescript-estree@8.8.1':
|
||||||
resolution: {integrity: sha512-ZaMJwc/0ckLz5DaAZ+pNLmHv8AMVGtfWxZe/x2JVEkD5LnmhWiQMMcYT7IY7gkdJuzJ9P14fRy28lUrlDSWYdw==}
|
resolution: {integrity: sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
typescript: '*'
|
typescript: '*'
|
||||||
|
@ -1274,8 +1350,8 @@ packages:
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: ^8.57.0 || ^9.0.0
|
eslint: ^8.57.0 || ^9.0.0
|
||||||
|
|
||||||
'@typescript-eslint/utils@8.8.0':
|
'@typescript-eslint/utils@8.8.1':
|
||||||
resolution: {integrity: sha512-QE2MgfOTem00qrlPgyByaCHay9yb1+9BjnMFnSFkUKQfu7adBXDTnCAivURnuPPAG/qiB+kzKkZKmKfaMT0zVg==}
|
resolution: {integrity: sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
eslint: ^8.57.0 || ^9.0.0
|
eslint: ^8.57.0 || ^9.0.0
|
||||||
|
@ -1284,8 +1360,8 @@ packages:
|
||||||
resolution: {integrity: sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==}
|
resolution: {integrity: sha512-yTPqMnbAZJNy2Xq2XU8AdtOW9tJIr+UQb64aXB9f3B1498Zx9JorVgFJcZpEc9UBuCCrdzKID2RGAMkYcDtZOw==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@typescript-eslint/visitor-keys@8.8.0':
|
'@typescript-eslint/visitor-keys@8.8.1':
|
||||||
resolution: {integrity: sha512-8mq51Lx6Hpmd7HnA2fcHQo3YgfX1qbccxQOgZcb4tvasu//zXRaA1j5ZRFeCw/VRAdFi4mRM9DnZw0Nu0Q2d1g==}
|
resolution: {integrity: sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
|
|
||||||
'@vitejs/plugin-vue@5.1.2':
|
'@vitejs/plugin-vue@5.1.2':
|
||||||
|
@ -1785,6 +1861,11 @@ packages:
|
||||||
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
||||||
engines: {node: '>=0.4.0'}
|
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:
|
devtools-protocol@0.0.1330662:
|
||||||
resolution: {integrity: sha512-pzh6YQ8zZfz3iKlCvgzVCu22NdpZ8hNmwU6WnQjNVquh0A9iVosPtNLWDwaWVGyrntQlltPFztTMK5Cg6lfCuw==}
|
resolution: {integrity: sha512-pzh6YQ8zZfz3iKlCvgzVCu22NdpZ8hNmwU6WnQjNVquh0A9iVosPtNLWDwaWVGyrntQlltPFztTMK5Cg6lfCuw==}
|
||||||
|
|
||||||
|
@ -2442,6 +2523,9 @@ packages:
|
||||||
magic-string@0.30.11:
|
magic-string@0.30.11:
|
||||||
resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==}
|
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:
|
magicast@0.3.4:
|
||||||
resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==}
|
resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==}
|
||||||
|
|
||||||
|
@ -2563,6 +2647,9 @@ packages:
|
||||||
resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
|
resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==}
|
||||||
engines: {node: '>= 0.4.0'}
|
engines: {node: '>= 0.4.0'}
|
||||||
|
|
||||||
|
node-addon-api@7.1.1:
|
||||||
|
resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
|
||||||
|
|
||||||
normalize-package-data@6.0.2:
|
normalize-package-data@6.0.2:
|
||||||
resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==}
|
resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==}
|
||||||
engines: {node: ^16.14.0 || >=18.0.0}
|
engines: {node: ^16.14.0 || >=18.0.0}
|
||||||
|
@ -2965,8 +3052,8 @@ packages:
|
||||||
safer-buffer@2.1.2:
|
safer-buffer@2.1.2:
|
||||||
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
|
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
|
||||||
|
|
||||||
sass@1.79.4:
|
sass@1.79.5:
|
||||||
resolution: {integrity: sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==}
|
resolution: {integrity: sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==}
|
||||||
engines: {node: '>=14.0.0'}
|
engines: {node: '>=14.0.0'}
|
||||||
hasBin: true
|
hasBin: true
|
||||||
|
|
||||||
|
@ -3231,8 +3318,8 @@ packages:
|
||||||
typed-query-selector@2.12.0:
|
typed-query-selector@2.12.0:
|
||||||
resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==}
|
resolution: {integrity: sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==}
|
||||||
|
|
||||||
typescript-eslint@8.8.0:
|
typescript-eslint@8.8.1:
|
||||||
resolution: {integrity: sha512-BjIT/VwJ8+0rVO01ZQ2ZVnjE1svFBiRczcpr1t1Yxt7sT25VSbPfrJtDsQ8uQTy2pilX5nI9gwxhUyLULNentw==}
|
resolution: {integrity: sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==}
|
||||||
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
|
||||||
peerDependencies:
|
peerDependencies:
|
||||||
typescript: '*'
|
typescript: '*'
|
||||||
|
@ -3775,6 +3862,62 @@ snapshots:
|
||||||
'@nodelib/fs.scandir': 2.1.5
|
'@nodelib/fs.scandir': 2.1.5
|
||||||
fastq: 1.17.1
|
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':
|
'@pkgjs/parseargs@0.11.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
|
@ -3802,7 +3945,7 @@ snapshots:
|
||||||
estree-walker: 2.0.2
|
estree-walker: 2.0.2
|
||||||
fdir: 6.4.0(picomatch@2.3.1)
|
fdir: 6.4.0(picomatch@2.3.1)
|
||||||
is-reference: 1.2.1
|
is-reference: 1.2.1
|
||||||
magic-string: 0.30.11
|
magic-string: 0.30.12
|
||||||
picomatch: 2.3.1
|
picomatch: 2.3.1
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
rollup: 4.24.0
|
rollup: 4.24.0
|
||||||
|
@ -3811,7 +3954,7 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@rollup/pluginutils': 5.1.0(rollup@4.24.0)
|
'@rollup/pluginutils': 5.1.0(rollup@4.24.0)
|
||||||
estree-walker: 2.0.2
|
estree-walker: 2.0.2
|
||||||
magic-string: 0.30.11
|
magic-string: 0.30.12
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
rollup: 4.24.0
|
rollup: 4.24.0
|
||||||
|
|
||||||
|
@ -3834,7 +3977,7 @@ snapshots:
|
||||||
'@rollup/plugin-replace@5.0.4(rollup@4.24.0)':
|
'@rollup/plugin-replace@5.0.4(rollup@4.24.0)':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@rollup/pluginutils': 5.1.0(rollup@4.24.0)
|
'@rollup/pluginutils': 5.1.0(rollup@4.24.0)
|
||||||
magic-string: 0.30.11
|
magic-string: 0.30.12
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
rollup: 4.24.0
|
rollup: 4.24.0
|
||||||
|
|
||||||
|
@ -3942,55 +4085,55 @@ snapshots:
|
||||||
'@rollup/rollup-win32-x64-msvc@4.24.0':
|
'@rollup/rollup-win32-x64-msvc@4.24.0':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@swc/core-darwin-arm64@1.7.28':
|
'@swc/core-darwin-arm64@1.7.35':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@swc/core-darwin-x64@1.7.28':
|
'@swc/core-darwin-x64@1.7.35':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@swc/core-linux-arm-gnueabihf@1.7.28':
|
'@swc/core-linux-arm-gnueabihf@1.7.35':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@swc/core-linux-arm64-gnu@1.7.28':
|
'@swc/core-linux-arm64-gnu@1.7.35':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@swc/core-linux-arm64-musl@1.7.28':
|
'@swc/core-linux-arm64-musl@1.7.35':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@swc/core-linux-x64-gnu@1.7.28':
|
'@swc/core-linux-x64-gnu@1.7.35':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@swc/core-linux-x64-musl@1.7.28':
|
'@swc/core-linux-x64-musl@1.7.35':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@swc/core-win32-arm64-msvc@1.7.28':
|
'@swc/core-win32-arm64-msvc@1.7.35':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@swc/core-win32-ia32-msvc@1.7.28':
|
'@swc/core-win32-ia32-msvc@1.7.35':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@swc/core-win32-x64-msvc@1.7.28':
|
'@swc/core-win32-x64-msvc@1.7.35':
|
||||||
optional: true
|
optional: true
|
||||||
|
|
||||||
'@swc/core@1.7.28':
|
'@swc/core@1.7.35':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@swc/counter': 0.1.3
|
'@swc/counter': 0.1.3
|
||||||
'@swc/types': 0.1.12
|
'@swc/types': 0.1.13
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@swc/core-darwin-arm64': 1.7.28
|
'@swc/core-darwin-arm64': 1.7.35
|
||||||
'@swc/core-darwin-x64': 1.7.28
|
'@swc/core-darwin-x64': 1.7.35
|
||||||
'@swc/core-linux-arm-gnueabihf': 1.7.28
|
'@swc/core-linux-arm-gnueabihf': 1.7.35
|
||||||
'@swc/core-linux-arm64-gnu': 1.7.28
|
'@swc/core-linux-arm64-gnu': 1.7.35
|
||||||
'@swc/core-linux-arm64-musl': 1.7.28
|
'@swc/core-linux-arm64-musl': 1.7.35
|
||||||
'@swc/core-linux-x64-gnu': 1.7.28
|
'@swc/core-linux-x64-gnu': 1.7.35
|
||||||
'@swc/core-linux-x64-musl': 1.7.28
|
'@swc/core-linux-x64-musl': 1.7.35
|
||||||
'@swc/core-win32-arm64-msvc': 1.7.28
|
'@swc/core-win32-arm64-msvc': 1.7.35
|
||||||
'@swc/core-win32-ia32-msvc': 1.7.28
|
'@swc/core-win32-ia32-msvc': 1.7.35
|
||||||
'@swc/core-win32-x64-msvc': 1.7.28
|
'@swc/core-win32-x64-msvc': 1.7.35
|
||||||
|
|
||||||
'@swc/counter@0.1.3': {}
|
'@swc/counter@0.1.3': {}
|
||||||
|
|
||||||
'@swc/types@0.1.12':
|
'@swc/types@0.1.13':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@swc/counter': 0.1.3
|
'@swc/counter': 0.1.3
|
||||||
|
|
||||||
|
@ -4004,7 +4147,7 @@ snapshots:
|
||||||
|
|
||||||
'@types/json-schema@7.0.15': {}
|
'@types/json-schema@7.0.15': {}
|
||||||
|
|
||||||
'@types/node@20.16.10':
|
'@types/node@20.16.11':
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types: 6.19.6
|
undici-types: 6.19.6
|
||||||
|
|
||||||
|
@ -4016,23 +4159,23 @@ snapshots:
|
||||||
|
|
||||||
'@types/serve-handler@6.1.4':
|
'@types/serve-handler@6.1.4':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.16.10
|
'@types/node': 20.16.11
|
||||||
|
|
||||||
'@types/trusted-types@2.0.7': {}
|
'@types/trusted-types@2.0.7': {}
|
||||||
|
|
||||||
'@types/yauzl@2.10.3':
|
'@types/yauzl@2.10.3':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@types/node': 20.16.10
|
'@types/node': 20.16.11
|
||||||
optional: true
|
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:
|
dependencies:
|
||||||
'@eslint-community/regexpp': 4.11.0
|
'@eslint-community/regexpp': 4.11.0
|
||||||
'@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)
|
||||||
'@typescript-eslint/scope-manager': 8.8.0
|
'@typescript-eslint/scope-manager': 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)
|
||||||
'@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)
|
||||||
'@typescript-eslint/visitor-keys': 8.8.0
|
'@typescript-eslint/visitor-keys': 8.8.1
|
||||||
eslint: 9.12.0
|
eslint: 9.12.0
|
||||||
graphemer: 1.4.0
|
graphemer: 1.4.0
|
||||||
ignore: 5.3.1
|
ignore: 5.3.1
|
||||||
|
@ -4043,12 +4186,12 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- 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:
|
dependencies:
|
||||||
'@typescript-eslint/scope-manager': 8.8.0
|
'@typescript-eslint/scope-manager': 8.8.1
|
||||||
'@typescript-eslint/types': 8.8.0
|
'@typescript-eslint/types': 8.8.1
|
||||||
'@typescript-eslint/typescript-estree': 8.8.0(typescript@5.6.2)
|
'@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.2)
|
||||||
'@typescript-eslint/visitor-keys': 8.8.0
|
'@typescript-eslint/visitor-keys': 8.8.1
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
eslint: 9.12.0
|
eslint: 9.12.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
|
@ -4061,15 +4204,15 @@ snapshots:
|
||||||
'@typescript-eslint/types': 8.5.0
|
'@typescript-eslint/types': 8.5.0
|
||||||
'@typescript-eslint/visitor-keys': 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:
|
dependencies:
|
||||||
'@typescript-eslint/types': 8.8.0
|
'@typescript-eslint/types': 8.8.1
|
||||||
'@typescript-eslint/visitor-keys': 8.8.0
|
'@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:
|
dependencies:
|
||||||
'@typescript-eslint/typescript-estree': 8.8.0(typescript@5.6.2)
|
'@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.2)
|
||||||
'@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)
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
ts-api-utils: 1.3.0(typescript@5.6.2)
|
ts-api-utils: 1.3.0(typescript@5.6.2)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
|
@ -4080,7 +4223,7 @@ snapshots:
|
||||||
|
|
||||||
'@typescript-eslint/types@8.5.0': {}
|
'@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)':
|
'@typescript-eslint/typescript-estree@8.5.0(typescript@5.6.2)':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -4097,10 +4240,10 @@ snapshots:
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- 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:
|
dependencies:
|
||||||
'@typescript-eslint/types': 8.8.0
|
'@typescript-eslint/types': 8.8.1
|
||||||
'@typescript-eslint/visitor-keys': 8.8.0
|
'@typescript-eslint/visitor-keys': 8.8.1
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
fast-glob: 3.3.2
|
fast-glob: 3.3.2
|
||||||
is-glob: 4.0.3
|
is-glob: 4.0.3
|
||||||
|
@ -4123,12 +4266,12 @@ snapshots:
|
||||||
- supports-color
|
- supports-color
|
||||||
- typescript
|
- 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:
|
dependencies:
|
||||||
'@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0)
|
'@eslint-community/eslint-utils': 4.4.0(eslint@9.12.0)
|
||||||
'@typescript-eslint/scope-manager': 8.8.0
|
'@typescript-eslint/scope-manager': 8.8.1
|
||||||
'@typescript-eslint/types': 8.8.0
|
'@typescript-eslint/types': 8.8.1
|
||||||
'@typescript-eslint/typescript-estree': 8.8.0(typescript@5.6.2)
|
'@typescript-eslint/typescript-estree': 8.8.1(typescript@5.6.2)
|
||||||
eslint: 9.12.0
|
eslint: 9.12.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
@ -4139,17 +4282,17 @@ snapshots:
|
||||||
'@typescript-eslint/types': 8.5.0
|
'@typescript-eslint/types': 8.5.0
|
||||||
eslint-visitor-keys: 3.4.3
|
eslint-visitor-keys: 3.4.3
|
||||||
|
|
||||||
'@typescript-eslint/visitor-keys@8.8.0':
|
'@typescript-eslint/visitor-keys@8.8.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@typescript-eslint/types': 8.8.0
|
'@typescript-eslint/types': 8.8.1
|
||||||
eslint-visitor-keys: 3.4.3
|
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:
|
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
|
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:
|
dependencies:
|
||||||
'@ampproject/remapping': 2.3.0
|
'@ampproject/remapping': 2.3.0
|
||||||
'@bcoe/v8-coverage': 0.2.3
|
'@bcoe/v8-coverage': 0.2.3
|
||||||
|
@ -4158,20 +4301,20 @@ snapshots:
|
||||||
istanbul-lib-report: 3.0.1
|
istanbul-lib-report: 3.0.1
|
||||||
istanbul-lib-source-maps: 5.0.6
|
istanbul-lib-source-maps: 5.0.6
|
||||||
istanbul-reports: 3.1.7
|
istanbul-reports: 3.1.7
|
||||||
magic-string: 0.30.11
|
magic-string: 0.30.12
|
||||||
magicast: 0.3.4
|
magicast: 0.3.4
|
||||||
std-env: 3.7.0
|
std-env: 3.7.0
|
||||||
test-exclude: 7.0.1
|
test-exclude: 7.0.1
|
||||||
tinyrainbow: 1.2.0
|
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:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- 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:
|
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
|
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:
|
optionalDependencies:
|
||||||
typescript: 5.6.2
|
typescript: 5.6.2
|
||||||
|
|
||||||
|
@ -4182,13 +4325,13 @@ snapshots:
|
||||||
chai: 5.1.1
|
chai: 5.1.1
|
||||||
tinyrainbow: 1.2.0
|
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:
|
dependencies:
|
||||||
'@vitest/spy': 2.1.1
|
'@vitest/spy': 2.1.1
|
||||||
estree-walker: 3.0.3
|
estree-walker: 3.0.3
|
||||||
magic-string: 0.30.11
|
magic-string: 0.30.12
|
||||||
optionalDependencies:
|
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':
|
'@vitest/pretty-format@2.1.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
|
@ -4202,7 +4345,7 @@ snapshots:
|
||||||
'@vitest/snapshot@2.1.1':
|
'@vitest/snapshot@2.1.1':
|
||||||
dependencies:
|
dependencies:
|
||||||
'@vitest/pretty-format': 2.1.1
|
'@vitest/pretty-format': 2.1.1
|
||||||
magic-string: 0.30.11
|
magic-string: 0.30.12
|
||||||
pathe: 1.1.2
|
pathe: 1.1.2
|
||||||
|
|
||||||
'@vitest/spy@2.1.1':
|
'@vitest/spy@2.1.1':
|
||||||
|
@ -4649,6 +4792,8 @@ snapshots:
|
||||||
|
|
||||||
delayed-stream@1.0.0: {}
|
delayed-stream@1.0.0: {}
|
||||||
|
|
||||||
|
detect-libc@1.0.3: {}
|
||||||
|
|
||||||
devtools-protocol@0.0.1330662: {}
|
devtools-protocol@0.0.1330662: {}
|
||||||
|
|
||||||
doctrine@3.0.0:
|
doctrine@3.0.0:
|
||||||
|
@ -5407,6 +5552,10 @@ snapshots:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@jridgewell/sourcemap-codec': 1.5.0
|
'@jridgewell/sourcemap-codec': 1.5.0
|
||||||
|
|
||||||
|
magic-string@0.30.12:
|
||||||
|
dependencies:
|
||||||
|
'@jridgewell/sourcemap-codec': 1.5.0
|
||||||
|
|
||||||
magicast@0.3.4:
|
magicast@0.3.4:
|
||||||
dependencies:
|
dependencies:
|
||||||
'@babel/parser': 7.25.3
|
'@babel/parser': 7.25.3
|
||||||
|
@ -5494,6 +5643,8 @@ snapshots:
|
||||||
|
|
||||||
netmask@2.0.2: {}
|
netmask@2.0.2: {}
|
||||||
|
|
||||||
|
node-addon-api@7.1.1: {}
|
||||||
|
|
||||||
normalize-package-data@6.0.2:
|
normalize-package-data@6.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
hosted-git-info: 7.0.2
|
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):
|
rollup-plugin-dts@6.1.1(rollup@4.24.0)(typescript@5.6.2):
|
||||||
dependencies:
|
dependencies:
|
||||||
magic-string: 0.30.11
|
magic-string: 0.30.12
|
||||||
rollup: 4.24.0
|
rollup: 4.24.0
|
||||||
typescript: 5.6.2
|
typescript: 5.6.2
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
|
@ -5991,8 +6142,9 @@ snapshots:
|
||||||
|
|
||||||
safer-buffer@2.1.2: {}
|
safer-buffer@2.1.2: {}
|
||||||
|
|
||||||
sass@1.79.4:
|
sass@1.79.5:
|
||||||
dependencies:
|
dependencies:
|
||||||
|
'@parcel/watcher': 2.4.1
|
||||||
chokidar: 4.0.1
|
chokidar: 4.0.1
|
||||||
immutable: 4.3.7
|
immutable: 4.3.7
|
||||||
source-map-js: 1.2.1
|
source-map-js: 1.2.1
|
||||||
|
@ -6253,11 +6405,11 @@ snapshots:
|
||||||
|
|
||||||
typed-query-selector@2.12.0: {}
|
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:
|
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/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.0(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.0(eslint@9.12.0)(typescript@5.6.2)
|
'@typescript-eslint/utils': 8.8.1(eslint@9.12.0)(typescript@5.6.2)
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
typescript: 5.6.2
|
typescript: 5.6.2
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
|
@ -6309,12 +6461,12 @@ snapshots:
|
||||||
|
|
||||||
vary@1.1.2: {}
|
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:
|
dependencies:
|
||||||
cac: 6.7.14
|
cac: 6.7.14
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
pathe: 1.1.2
|
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:
|
transitivePeerDependencies:
|
||||||
- '@types/node'
|
- '@types/node'
|
||||||
- less
|
- less
|
||||||
|
@ -6326,30 +6478,30 @@ snapshots:
|
||||||
- supports-color
|
- supports-color
|
||||||
- terser
|
- 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:
|
dependencies:
|
||||||
esbuild: 0.21.5
|
esbuild: 0.21.5
|
||||||
postcss: 8.4.41
|
postcss: 8.4.41
|
||||||
rollup: 4.20.0
|
rollup: 4.20.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@types/node': 20.16.10
|
'@types/node': 20.16.11
|
||||||
fsevents: 2.3.3
|
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:
|
dependencies:
|
||||||
esbuild: 0.21.5
|
esbuild: 0.21.5
|
||||||
postcss: 8.4.47
|
postcss: 8.4.47
|
||||||
rollup: 4.24.0
|
rollup: 4.24.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@types/node': 20.16.10
|
'@types/node': 20.16.11
|
||||||
fsevents: 2.3.3
|
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:
|
dependencies:
|
||||||
'@vitest/expect': 2.1.1
|
'@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/pretty-format': 2.1.1
|
||||||
'@vitest/runner': 2.1.1
|
'@vitest/runner': 2.1.1
|
||||||
'@vitest/snapshot': 2.1.1
|
'@vitest/snapshot': 2.1.1
|
||||||
|
@ -6357,18 +6509,18 @@ snapshots:
|
||||||
'@vitest/utils': 2.1.1
|
'@vitest/utils': 2.1.1
|
||||||
chai: 5.1.1
|
chai: 5.1.1
|
||||||
debug: 4.3.6
|
debug: 4.3.6
|
||||||
magic-string: 0.30.11
|
magic-string: 0.30.12
|
||||||
pathe: 1.1.2
|
pathe: 1.1.2
|
||||||
std-env: 3.7.0
|
std-env: 3.7.0
|
||||||
tinybench: 2.9.0
|
tinybench: 2.9.0
|
||||||
tinyexec: 0.3.0
|
tinyexec: 0.3.0
|
||||||
tinypool: 1.0.0
|
tinypool: 1.0.0
|
||||||
tinyrainbow: 1.2.0
|
tinyrainbow: 1.2.0
|
||||||
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)
|
||||||
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)
|
||||||
why-is-node-running: 2.3.0
|
why-is-node-running: 2.3.0
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
'@types/node': 20.16.10
|
'@types/node': 20.16.11
|
||||||
jsdom: 25.0.0
|
jsdom: 25.0.0
|
||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- less
|
- less
|
||||||
|
|
Loading…
Reference in New Issue