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 + + `, + { 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