diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index b8afcf984..65653f40d 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -19,6 +19,7 @@ module.exports = {
plugins: ['jest', 'import', '@typescript-eslint'],
rules: {
'no-debugger': 'error',
+ 'no-console': ['error', { allow: ['warn', 'error', 'info'] }],
// most of the codebase are expected to be env agnostic
'no-restricted-globals': ['error', ...DOMGlobals, ...NodeGlobals],
@@ -58,6 +59,7 @@ module.exports = {
{
files: ['**/__tests__/**', 'packages/dts-test/**'],
rules: {
+ 'no-console': 'off',
'no-restricted-globals': 'off',
'no-restricted-syntax': 'off',
'jest/no-disabled-tests': 'error',
@@ -92,6 +94,7 @@ module.exports = {
rules: {
'no-restricted-globals': ['error', ...NodeGlobals],
'no-restricted-syntax': ['error', banConstEnum],
+ 'no-console': 'off',
},
},
// JavaScript files
@@ -113,6 +116,7 @@ module.exports = {
rules: {
'no-restricted-globals': 'off',
'no-restricted-syntax': ['error', banConstEnum],
+ 'no-console': 'off',
},
},
// Import nodejs modules in compiler-sfc
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e10e5632c..3bc712c0f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,32 @@
+## [3.4.4](https://github.com/vuejs/core/compare/v3.4.3...v3.4.4) (2024-01-03)
+
+
+### Bug Fixes
+
+* **compiler-sfc:** fix scss source map regression ([71d3121](https://github.com/vuejs/core/commit/71d3121b72c449351e718ee1539bdfa35b68bb32)), closes [#9970](https://github.com/vuejs/core/issues/9970) [#9969](https://github.com/vuejs/core/issues/9969)
+* **compiler-sfc:** use compilerOptions when re-parsing consumed AST ([d94d8d4](https://github.com/vuejs/core/commit/d94d8d4bffd1daf171a655b292745ffc3e63052d))
+* **defineModel:** support kebab-case/camelCase mismatches ([#9950](https://github.com/vuejs/core/issues/9950)) ([10ccb9b](https://github.com/vuejs/core/commit/10ccb9bfa0f5f3016207fc32b9611bab98e6f090))
+* **runtime-core:** correctly assign suspenseId to avoid conflicts with the default id ([#9966](https://github.com/vuejs/core/issues/9966)) ([0648804](https://github.com/vuejs/core/commit/06488047c184dae3070d0008379716690edceb46)), closes [#9944](https://github.com/vuejs/core/issues/9944)
+* **ssr:** avoid rendering transition-group slot content as a fragment ([#9961](https://github.com/vuejs/core/issues/9961)) ([0160264](https://github.com/vuejs/core/commit/0160264d677478ee928e8e851f39a9e94f97e337)), closes [#9933](https://github.com/vuejs/core/issues/9933)
+* **watch:** remove instance unmounted short circuit in getter of `watchEffect` ([#9948](https://github.com/vuejs/core/issues/9948)) ([f300a40](https://github.com/vuejs/core/commit/f300a4001ec40cadef2520267eb5841ab48cf005))
+* **watch:** revert watch behavior when watching shallow reactive objects ([a9f781a](https://github.com/vuejs/core/commit/a9f781a92cbc7de7b25c9e3d5b1295ca99eb6d86)), closes [#9965](https://github.com/vuejs/core/issues/9965)
+
+
+### Performance Improvements
+
+* **watch:** avoid double traverse for reactive source ([24d77c2](https://github.com/vuejs/core/commit/24d77c25ce5d5356adb5367beef1d23e6e340b35))
+
+
+
+## [3.4.3](https://github.com/vuejs/core/compare/v3.4.2...v3.4.3) (2023-12-30)
+
+
+### Bug Fixes
+
+* **compiler-sfc:** respect sfc parse options in cache key ([b8d58ec](https://github.com/vuejs/core/commit/b8d58ec4f42cbeb9443bf06138add46158db9af0))
+
+
+
## [3.4.2](https://github.com/vuejs/core/compare/v3.4.1...v3.4.2) (2023-12-30)
diff --git a/package.json b/package.json
index 62ddb7d7a..eab2a5502 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
{
"private": true,
"version": "0.0.0-vapor",
- "packageManager": "pnpm@8.12.1",
+ "packageManager": "pnpm@8.14.0",
"type": "module",
"scripts": {
"dev": "node scripts/dev.js vue vue-vapor",
@@ -71,11 +71,11 @@
"@rollup/plugin-terser": "^0.4.4",
"@types/hash-sum": "^1.0.2",
"@types/minimist": "^1.2.5",
- "@types/node": "^20.10.5",
- "@types/semver": "^7.5.5",
- "@typescript-eslint/eslint-plugin": "^6.16.0",
- "@typescript-eslint/parser": "^6.15.0",
- "@vitest/coverage-istanbul": "^1.1.0",
+ "@types/node": "^20.10.6",
+ "@types/semver": "^7.5.6",
+ "@typescript-eslint/eslint-plugin": "^6.17.0",
+ "@typescript-eslint/parser": "^6.17.0",
+ "@vitest/coverage-istanbul": "^1.1.1",
"@vue/consolidate": "0.17.3",
"conventional-changelog-cli": "^4.1.0",
"enquirer": "^2.4.1",
@@ -84,7 +84,7 @@
"eslint": "^8.56.0",
"eslint-define-config": "^1.24.1",
"eslint-plugin-import": "npm:eslint-plugin-i@^2.29.1",
- "eslint-plugin-jest": "^27.6.0",
+ "eslint-plugin-jest": "^27.6.1",
"estree-walker": "^2.0.2",
"execa": "^8.0.1",
"jsdom": "^23.0.1",
@@ -92,7 +92,7 @@
"lodash": "^4.17.21",
"magic-string": "^0.30.5",
"markdown-table": "^3.0.3",
- "marked": "^11.1.0",
+ "marked": "^11.1.1",
"minimist": "^1.2.8",
"npm-run-all": "^4.1.5",
"picocolors": "^1.0.0",
@@ -114,6 +114,6 @@
"tsx": "^4.7.0",
"typescript": "^5.2.2",
"vite": "^5.0.5",
- "vitest": "^1.1.0"
+ "vitest": "^1.1.1"
}
}
diff --git a/packages/compiler-core/package.json b/packages/compiler-core/package.json
index ac26dcf61..308a478dd 100644
--- a/packages/compiler-core/package.json
+++ b/packages/compiler-core/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue/compiler-core",
- "version": "3.4.2",
+ "version": "3.4.4",
"description": "@vue/compiler-core",
"main": "index.js",
"module": "dist/compiler-core.esm-bundler.js",
@@ -9,6 +9,19 @@
"index.js",
"dist"
],
+ "exports": {
+ ".": {
+ "types": "./dist/compiler-core.d.ts",
+ "node": {
+ "production": "./dist/compiler-core.cjs.prod.js",
+ "development": "./dist/compiler-core.cjs.js",
+ "default": "./index.js"
+ },
+ "import": "./dist/compiler-core.esm-bundler.js",
+ "require": "./index.js"
+ },
+ "./*": "./*"
+ },
"buildOptions": {
"name": "VueCompilerCore",
"compat": true,
diff --git a/packages/compiler-core/src/babelUtils.ts b/packages/compiler-core/src/babelUtils.ts
index e0e0ef222..0a7f48af9 100644
--- a/packages/compiler-core/src/babelUtils.ts
+++ b/packages/compiler-core/src/babelUtils.ts
@@ -146,6 +146,19 @@ export function isInDestructureAssignment(
return false
}
+export function isInNewExpression(parentStack: Node[]): boolean {
+ let i = parentStack.length
+ while (i--) {
+ const p = parentStack[i]
+ if (p.type === 'NewExpression') {
+ return true
+ } else if (p.type !== 'MemberExpression') {
+ break
+ }
+ }
+ return false
+}
+
export function walkFunctionParams(
node: Function,
onIdent: (id: Identifier) => void,
diff --git a/packages/compiler-core/src/transforms/transformExpression.ts b/packages/compiler-core/src/transforms/transformExpression.ts
index 093fb4447..c7cd1b63d 100644
--- a/packages/compiler-core/src/transforms/transformExpression.ts
+++ b/packages/compiler-core/src/transforms/transformExpression.ts
@@ -19,6 +19,7 @@ import {
} from '../ast'
import {
isInDestructureAssignment,
+ isInNewExpression,
isStaticProperty,
isStaticPropertyKey,
walkIdentifiers,
@@ -131,6 +132,11 @@ export function processExpression(
// ({ x } = y)
const isDestructureAssignment =
parent && isInDestructureAssignment(parent, parentStack)
+ const isNewExpression = parent && isInNewExpression(parentStack)
+ const wrapWithUnref = (raw: string) => {
+ const wrapped = `${context.helperString(UNREF)}(${raw})`
+ return isNewExpression ? `(${wrapped})` : wrapped
+ }
if (
isConst(type) ||
@@ -147,7 +153,7 @@ export function processExpression(
// that assumes the value to be a ref for more efficiency
return isAssignmentLVal || isUpdateArg || isDestructureAssignment
? `${raw}.value`
- : `${context.helperString(UNREF)}(${raw})`
+ : wrapWithUnref(raw)
} else if (type === BindingTypes.SETUP_LET) {
if (isAssignmentLVal) {
// let binding.
@@ -190,7 +196,7 @@ export function processExpression(
// for now
return raw
} else {
- return `${context.helperString(UNREF)}(${raw})`
+ return wrapWithUnref(raw)
}
} else if (type === BindingTypes.PROPS) {
// use __props which is generated by compileScript so in ts mode
diff --git a/packages/compiler-dom/package.json b/packages/compiler-dom/package.json
index 85edcc0e5..38018cee0 100644
--- a/packages/compiler-dom/package.json
+++ b/packages/compiler-dom/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue/compiler-dom",
- "version": "3.4.2",
+ "version": "3.4.4",
"description": "@vue/compiler-dom",
"main": "index.js",
"module": "dist/compiler-dom.esm-bundler.js",
@@ -11,6 +11,19 @@
"index.js",
"dist"
],
+ "exports": {
+ ".": {
+ "types": "./dist/compiler-dom.d.ts",
+ "node": {
+ "production": "./dist/compiler-dom.cjs.prod.js",
+ "development": "./dist/compiler-dom.cjs.js",
+ "default": "./index.js"
+ },
+ "import": "./dist/compiler-dom.esm-bundler.js",
+ "require": "./index.js"
+ },
+ "./*": "./*"
+ },
"sideEffects": false,
"buildOptions": {
"name": "VueCompilerDOM",
diff --git a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap
index d63e6ec4d..6efe6fb92 100644
--- a/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap
+++ b/packages/compiler-sfc/__tests__/__snapshots__/compileScript.spec.ts.snap
@@ -1028,6 +1028,26 @@ return (_ctx, _cache) => {
}"
`;
+exports[`SFC compile
+
+ {{ new Foo() }}
+ {{ new Foo.Bar() }}
+
+ `,
+ { inlineTemplate: true },
+ )
+ expect(content).toMatch(`new (_unref(Foo))()`)
+ expect(content).toMatch(`new (_unref(Foo)).Bar()`)
+ assertCode(content)
+ })
})
describe('with TypeScript', () => {
diff --git a/packages/compiler-sfc/__tests__/compileTemplate.spec.ts b/packages/compiler-sfc/__tests__/compileTemplate.spec.ts
index 7ab64bb26..45dc54a69 100644
--- a/packages/compiler-sfc/__tests__/compileTemplate.spec.ts
+++ b/packages/compiler-sfc/__tests__/compileTemplate.spec.ts
@@ -427,6 +427,31 @@ test('prefixing edge case for reused AST', () => {
expect(code).not.toMatch(`_ctx.t`)
})
+test('prefixing edge case for reused AST ssr mode', () => {
+ const src = `
+
+
+
+
+
+
+ `
+ const { descriptor } = parse(src)
+ // compileScript triggers importUsageCheck
+ compileScript(descriptor, { id: 'xxx' })
+ expect(() =>
+ compileTemplate({
+ id: 'xxx',
+ filename: 'test.vue',
+ ast: descriptor.template!.ast,
+ source: descriptor.template!.content,
+ ssr: true,
+ }),
+ ).not.toThrowError()
+})
+
interface Pos {
line: number
column: number
diff --git a/packages/compiler-sfc/package.json b/packages/compiler-sfc/package.json
index 70aabfb14..da9f91e1a 100644
--- a/packages/compiler-sfc/package.json
+++ b/packages/compiler-sfc/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue/compiler-sfc",
- "version": "3.4.2",
+ "version": "3.4.4",
"description": "@vue/compiler-sfc",
"main": "dist/compiler-sfc.cjs.js",
"module": "dist/compiler-sfc.esm-browser.js",
@@ -8,6 +8,15 @@
"files": [
"dist"
],
+ "exports": {
+ ".": {
+ "types": "./dist/compiler-sfc.d.ts",
+ "node": "./dist/compiler-sfc.cjs.js",
+ "import": "./dist/compiler-sfc.esm-browser.js",
+ "require": "./dist/compiler-sfc.cjs.js"
+ },
+ "./*": "./*"
+ },
"buildOptions": {
"name": "VueCompilerSFC",
"formats": [
@@ -50,8 +59,8 @@
"merge-source-map": "^1.1.0",
"minimatch": "^9.0.3",
"postcss-modules": "^6.0.0",
- "postcss-selector-parser": "^6.0.13",
+ "postcss-selector-parser": "^6.0.15",
"pug": "^3.0.2",
- "sass": "^1.69.5"
+ "sass": "^1.69.7"
}
}
diff --git a/packages/compiler-sfc/src/compileTemplate.ts b/packages/compiler-sfc/src/compileTemplate.ts
index 019aa5b0d..5b7fe2683 100644
--- a/packages/compiler-sfc/src/compileTemplate.ts
+++ b/packages/compiler-sfc/src/compileTemplate.ts
@@ -219,6 +219,7 @@ function doCompileTemplate({
// We need to parse a fresh one. Can't just use `source` here since we need
// the AST location info to be relative to the entire SFC.
const newAST = (ssr ? CompilerDOM : compiler).parse(inAST.source, {
+ ...compilerOptions,
parseMode: 'sfc',
onError: e => errors.push(e),
})
diff --git a/packages/compiler-sfc/src/style/preprocessors.ts b/packages/compiler-sfc/src/style/preprocessors.ts
index b09c3ec98..7915d1d14 100644
--- a/packages/compiler-sfc/src/style/preprocessors.ts
+++ b/packages/compiler-sfc/src/style/preprocessors.ts
@@ -38,12 +38,7 @@ const scss: StylePreprocessor = (source, map, options, load = require) => {
if (map) {
return {
code: result.css.toString(),
- map: merge(
- map,
- result.map.toJSON
- ? result.map.toJSON()
- : JSON.parse(result.map.toString()),
- ),
+ map: merge(map, JSON.parse(result.map.toString())),
errors: [],
dependencies,
}
diff --git a/packages/compiler-ssr/package.json b/packages/compiler-ssr/package.json
index 45d1c1754..786cafb33 100644
--- a/packages/compiler-ssr/package.json
+++ b/packages/compiler-ssr/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue/compiler-ssr",
- "version": "3.4.2",
+ "version": "3.4.4",
"description": "@vue/compiler-ssr",
"main": "dist/compiler-ssr.cjs.js",
"types": "dist/compiler-ssr.d.ts",
diff --git a/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts b/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts
index c179cd50c..962faddab 100644
--- a/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts
+++ b/packages/compiler-ssr/src/transforms/ssrTransformComponent.ts
@@ -55,7 +55,7 @@ import {
ssrProcessTransitionGroup,
ssrTransformTransitionGroup,
} from './ssrTransformTransitionGroup'
-import { extend, isArray, isObject, isSymbol } from '@vue/shared'
+import { extend, isArray, isObject, isPlainObject, isSymbol } from '@vue/shared'
import { buildSSRProps } from './ssrTransformElement'
import {
ssrProcessTransition,
@@ -371,10 +371,10 @@ function subTransform(
function clone(v: any): any {
if (isArray(v)) {
return v.map(clone)
- } else if (isObject(v)) {
+ } else if (isPlainObject(v)) {
const res: any = {}
for (const key in v) {
- res[key] = clone(v[key])
+ res[key] = clone(v[key as keyof typeof v])
}
return res
} else {
diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json
index 7d6a792b1..4d5159489 100644
--- a/packages/reactivity/package.json
+++ b/packages/reactivity/package.json
@@ -1,6 +1,6 @@
{
"name": "@vue/reactivity",
- "version": "3.4.2",
+ "version": "3.4.4",
"description": "@vue/reactivity",
"main": "index.js",
"module": "dist/reactivity.esm-bundler.js",
@@ -11,6 +11,19 @@
"index.js",
"dist"
],
+ "exports": {
+ ".": {
+ "types": "./dist/reactivity.d.ts",
+ "node": {
+ "production": "./dist/reactivity.cjs.prod.js",
+ "development": "./dist/reactivity.cjs.js",
+ "default": "./index.js"
+ },
+ "import": "./dist/reactivity.esm-bundler.js",
+ "require": "./index.js"
+ },
+ "./*": "./*"
+ },
"sideEffects": false,
"repository": {
"type": "git",
diff --git a/packages/runtime-core/__tests__/apiSetupHelpers.spec.ts b/packages/runtime-core/__tests__/apiSetupHelpers.spec.ts
index b50da90d4..04df0ae59 100644
--- a/packages/runtime-core/__tests__/apiSetupHelpers.spec.ts
+++ b/packages/runtime-core/__tests__/apiSetupHelpers.spec.ts
@@ -314,6 +314,84 @@ describe('SFC