diff --git a/.eslintrc.cjs b/.eslintrc.cjs index db6d35dde..508a6dca6 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -26,13 +26,23 @@ module.exports = { 'no-restricted-syntax': [ 'error', banConstEnum, - // since we target ES2015 for baseline support, we need to forbid object - // rest spread usage in destructure as it compiles into a verbose helper. - 'ObjectPattern > RestElement', - // tsc compiles assignment spread into Object.assign() calls, but esbuild - // still generates verbose helpers, so spread assignment is also prohiboted - 'ObjectExpression > SpreadElement', - 'AwaitExpression', + { + selector: 'ObjectPattern > RestElement', + message: + 'Our output target is ES2016, and object rest spread results in ' + + 'verbose helpers and should be avoided.', + }, + { + selector: 'ObjectExpression > SpreadElement', + message: + 'esbuild transpiles object spread into very verbose inline helpers.\n' + + 'Please use the `extend` helper from @vue/shared instead.', + }, + { + selector: 'AwaitExpression', + message: + 'Our output target is ES2016, so async/await syntax should be avoided.', + }, ], 'sort-imports': ['error', { ignoreDeclarationSort: true }], diff --git a/.gitignore b/.gitignore index 810f88526..9dd21f59b 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ TODOs.md .eslintcache dts-build/packages *.tsbuildinfo +*.tgz diff --git a/.vscode/launch.json b/.vscode/launch.json index b616400b4..9fc03aa9b 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -5,24 +5,15 @@ "version": "0.2.0", "configurations": [ { - "name": "Jest", "type": "node", "request": "launch", - "program": "${workspaceFolder}/node_modules/.bin/jest", - "stopOnEntry": false, - "args": ["${fileBasename}", "--runInBand", "--detectOpenHandles"], - "cwd": "${workspaceFolder}", - "preLaunchTask": null, - "runtimeExecutable": null, - "runtimeArgs": ["--nolazy"], - "env": { - "NODE_ENV": "development" - }, - "console": "integratedTerminal", - "sourceMaps": true, - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - } + "name": "Vitest - Debug Current Test File", + "autoAttachChildProcesses": true, + "skipFiles": ["/**", "**/node_modules/**"], + "program": "${workspaceRoot}/node_modules/vitest/vitest.mjs", + "args": ["run", "${relativeFile}"], + "smartStep": true, + "console": "integratedTerminal" } ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 28447dfe3..a0d590a5b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,44 @@ +## [3.4.22](https://github.com/vuejs/core/compare/v3.4.21...v3.4.22) (2024-04-15) + + +### Bug Fixes + +* **compat:** fix $options mutation + adjust private API initialization ([d58d133](https://github.com/vuejs/core/commit/d58d133b1cde5085cc5ab0012d544cafd62a6ee6)), closes [#10626](https://github.com/vuejs/core/issues/10626) [#10636](https://github.com/vuejs/core/issues/10636) +* **compile-sfc:** analyze v-bind shorthand usage in template ([#10518](https://github.com/vuejs/core/issues/10518)) ([e5919d4](https://github.com/vuejs/core/commit/e5919d4658cfe0bb18c76611dd3c3432c57f94ab)), closes [#10515](https://github.com/vuejs/core/issues/10515) +* **compiler-core:** fix loc.source for end tags with whitespace before > ([16174da](https://github.com/vuejs/core/commit/16174da21d6c8ac0aae027dd964fc35e221ded0a)), closes [#10694](https://github.com/vuejs/core/issues/10694) [#10695](https://github.com/vuejs/core/issues/10695) +* **compiler-core:** fix v-bind shorthand for component :is ([04af950](https://github.com/vuejs/core/commit/04af9504a720c8e6de26c04b1282cf14fa1bcee3)), closes [#10469](https://github.com/vuejs/core/issues/10469) [#10471](https://github.com/vuejs/core/issues/10471) +* **compiler-sfc:** :is() and :where() in compound selectors ([#10522](https://github.com/vuejs/core/issues/10522)) ([660cadc](https://github.com/vuejs/core/commit/660cadc7aadb909ef33a6055c4374902a82607a4)), closes [#10511](https://github.com/vuejs/core/issues/10511) +* **compiler-sfc:** also search for `.tsx` when type import's extension is omitted ([#10637](https://github.com/vuejs/core/issues/10637)) ([34106bc](https://github.com/vuejs/core/commit/34106bc9c715247211273bb9c64712f04bd4879d)), closes [#10635](https://github.com/vuejs/core/issues/10635) +* **compiler-sfc:** fix defineModel coercion for boolean + string union types ([#9603](https://github.com/vuejs/core/issues/9603)) ([0cef65c](https://github.com/vuejs/core/commit/0cef65cee411356e721bbc90d731fc52fc8fce94)), closes [#9587](https://github.com/vuejs/core/issues/9587) [#10676](https://github.com/vuejs/core/issues/10676) +* **compiler-sfc:** fix universal selector scope ([#10551](https://github.com/vuejs/core/issues/10551)) ([54a6afa](https://github.com/vuejs/core/commit/54a6afa75a546078e901ce0882da53b97420fe94)), closes [#10548](https://github.com/vuejs/core/issues/10548) +* **compiler-sfc:** use options module name if options provide runtimeModuleName options ([#10457](https://github.com/vuejs/core/issues/10457)) ([e76d743](https://github.com/vuejs/core/commit/e76d7430aa7470342f3fe263145a0fa92f5898ca)), closes [#10454](https://github.com/vuejs/core/issues/10454) +* **custom-element:** avoid setting attr to null if it is removed ([#9012](https://github.com/vuejs/core/issues/9012)) ([b49306a](https://github.com/vuejs/core/commit/b49306adff4572d90a42ccd231387f16eb966bbe)), closes [#9006](https://github.com/vuejs/core/issues/9006) [#10324](https://github.com/vuejs/core/issues/10324) +* **hydration:** properly handle optimized mode during hydrate node ([#10638](https://github.com/vuejs/core/issues/10638)) ([2ec06fd](https://github.com/vuejs/core/commit/2ec06fd6c8383e11cdf4efcab1707f973bd6a54c)), closes [#10607](https://github.com/vuejs/core/issues/10607) +* **reactivity:** computed should not be detected as true by isProxy ([#10401](https://github.com/vuejs/core/issues/10401)) ([9da34d7](https://github.com/vuejs/core/commit/9da34d7af81607fddd1f32f21b3b4002402ff1cc)) +* **reactivity:** fix hasOwnProperty key coercion edge cases ([969c5fb](https://github.com/vuejs/core/commit/969c5fb30f4c725757c7385abfc74772514eae4b)) +* **reactivity:** fix tracking when hasOwnProperty is called with non-string value ([c3c5dc9](https://github.com/vuejs/core/commit/c3c5dc93fbccc196771458f0b43cd5b7ad1863f4)), closes [#10455](https://github.com/vuejs/core/issues/10455) [#10464](https://github.com/vuejs/core/issues/10464) +* **runtime-core:** fix errorHandler causes an infinite loop during execution ([#9575](https://github.com/vuejs/core/issues/9575)) ([ab59bed](https://github.com/vuejs/core/commit/ab59bedae4e5e40b28804d88a51305b236d4a873)) +* **runtime-core:** handle invalid values in callWithAsyncErrorHandling ([53d15d3](https://github.com/vuejs/core/commit/53d15d3f76184eed67a18d35e43d9a2062f8e121)) +* **runtime-core:** show hydration mismatch details for non-rectified mismatches too when __PROD_HYDRATION_MISMATCH_DETAILS__ is set ([#10599](https://github.com/vuejs/core/issues/10599)) ([0dea7f9](https://github.com/vuejs/core/commit/0dea7f9a260d93eb6c39aabac8c94c2c9b2042dd)) +* **runtime-dom:** `v-model` string/number coercion for multiselect options ([#10576](https://github.com/vuejs/core/issues/10576)) ([db374e5](https://github.com/vuejs/core/commit/db374e54c9f5e07324728b85c74eca84e28dd352)) +* **runtime-dom:** fix css v-bind for suspensed components ([#8523](https://github.com/vuejs/core/issues/8523)) ([67722ba](https://github.com/vuejs/core/commit/67722ba23b7c36ab8f3fa2d2b4df08e4ddc322e1)), closes [#8520](https://github.com/vuejs/core/issues/8520) +* **runtime-dom:** force update v-model number with leading 0 ([#10506](https://github.com/vuejs/core/issues/10506)) ([15ffe8f](https://github.com/vuejs/core/commit/15ffe8f2c954359770c57e4d9e589b0b622e4a60)), closes [#10503](https://github.com/vuejs/core/issues/10503) [#10615](https://github.com/vuejs/core/issues/10615) +* **runtime-dom:** sanitize wrongly passed string value as event handler ([#8953](https://github.com/vuejs/core/issues/8953)) ([7ccd453](https://github.com/vuejs/core/commit/7ccd453dd004076cad49ec9f56cd5fe97b7b6ed8)), closes [#8818](https://github.com/vuejs/core/issues/8818) +* **ssr:** don't render v-if comments in TransitionGroup ([#6732](https://github.com/vuejs/core/issues/6732)) ([5a96267](https://github.com/vuejs/core/commit/5a9626708e970c6fc0b6f786e3c80c22273d126f)), closes [#6715](https://github.com/vuejs/core/issues/6715) +* **Transition:** ensure the KeepAlive children unmount w/ out-in mode ([#10632](https://github.com/vuejs/core/issues/10632)) ([fc99e4d](https://github.com/vuejs/core/commit/fc99e4d3f01b190ef9fd3c218a668ba9124a32bc)), closes [#10620](https://github.com/vuejs/core/issues/10620) +* **TransitionGroup:** avoid set transition hooks for comment nodes and text nodes ([#9421](https://github.com/vuejs/core/issues/9421)) ([140a768](https://github.com/vuejs/core/commit/140a7681cc3bba22f55d97fd85a5eafe97a1230f)), closes [#4621](https://github.com/vuejs/core/issues/4621) [#4622](https://github.com/vuejs/core/issues/4622) [#5153](https://github.com/vuejs/core/issues/5153) [#5168](https://github.com/vuejs/core/issues/5168) [#7898](https://github.com/vuejs/core/issues/7898) [#9067](https://github.com/vuejs/core/issues/9067) +* **types:** avoid merging object union types when using withDefaults ([#10596](https://github.com/vuejs/core/issues/10596)) ([37ba93c](https://github.com/vuejs/core/commit/37ba93c213a81f99a68a99ef5d4065d61b150ba3)), closes [#10594](https://github.com/vuejs/core/issues/10594) + + +### Performance Improvements + +* add `__NO_SIDE_EFFECTS__` comments ([#9053](https://github.com/vuejs/core/issues/9053)) ([d46df6b](https://github.com/vuejs/core/commit/d46df6bdb14b0509eb2134b3f85297a306821c61)) +* optimize component props/slots internal object checks ([6af733d](https://github.com/vuejs/core/commit/6af733d68eb400a3d2c5ef5f465fff32b72a324e)) +* **ssr:** avoid calling markRaw on component instance proxy ([4bc9f39](https://github.com/vuejs/core/commit/4bc9f39f028af7313e5cf24c16915a1985d27bf8)) +* **ssr:** optimize setup context creation for ssr in v8 ([ca84316](https://github.com/vuejs/core/commit/ca84316bfb3410efe21333670a6ad5cd21857396)) + + + ## [3.4.21](https://github.com/vuejs/core/compare/v3.4.20...v3.4.21) (2024-02-28) diff --git a/FUNDING.json b/FUNDING.json new file mode 100644 index 000000000..552dc453c --- /dev/null +++ b/FUNDING.json @@ -0,0 +1,7 @@ +{ + "drips": { + "ethereum": { + "ownedBy": "0x5393BdeA2a020769256d9f337B0fc81a2F64850A" + } + } +} diff --git a/package.json b/package.json index 31a15f4d4..c24f1e844 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "dev": "node scripts/dev.js vue vue-vapor", "build": "node scripts/build.js", - "build-dts": "tsc -p tsconfig.build.json && rollup -c rollup.dts.config.js", + "build-dts": "tsc -p tsconfig.build-browser.json && tsc -p tsconfig.build-node.json && rollup -c rollup.dts.config.js", "clean": "rimraf packages/*/dist temp .eslintcache", "size": "run-s \"size-*\" && tsx scripts/usage-size.ts", "size-global": "node scripts/build.js vue vue-vapor runtime-dom runtime-vapor compiler-dom compiler-vapor -f global -p --size", @@ -20,7 +20,7 @@ "test-unit": "vitest -c vitest.unit.config.ts", "test-e2e": "node scripts/build.js vue -f global -d && vitest -c vitest.e2e.config.ts", "test-dts": "run-s build-dts test-dts-only", - "test-dts-only": "tsc -p ./packages/dts-test/tsconfig.test.json", + "test-dts-only": "tsc -p packages/dts-built-test/tsconfig.json && tsc -p ./packages/dts-test/tsconfig.test.json", "test-coverage": "vitest -c vitest.unit.config.ts --coverage", "test-bench": "vitest bench", "release": "node scripts/release.js", @@ -59,9 +59,9 @@ "node": ">=18.12.0" }, "devDependencies": { - "@babel/parser": "^7.24.0", + "@babel/parser": "^7.24.1", "@babel/types": "^7.24.0", - "@codspeed/vitest-plugin": "^2.3.1", + "@codspeed/vitest-plugin": "^3.1.0", "@rollup/plugin-alias": "^5.1.0", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-json": "^6.1.0", @@ -70,16 +70,16 @@ "@rollup/plugin-terser": "^0.4.4", "@types/hash-sum": "^1.0.2", "@types/minimist": "^1.2.5", - "@types/node": "^20.11.25", + "@types/node": "^20.12.5", "@types/semver": "^7.5.8", - "@typescript-eslint/eslint-plugin": "^7.1.1", - "@typescript-eslint/parser": "^7.1.1", - "@vitest/coverage-istanbul": "^1.3.1", - "@vitest/ui": "^1.2.2", + "@typescript-eslint/eslint-plugin": "^7.4.0", + "@typescript-eslint/parser": "^7.4.0", + "@vitest/coverage-istanbul": "^1.4.0", + "@vitest/ui": "^1.4.0", "@vue/consolidate": "1.0.0", "conventional-changelog-cli": "^4.1.0", "enquirer": "^2.4.1", - "esbuild": "^0.20.1", + "esbuild": "^0.20.2", "esbuild-plugin-polyfill-node": "^0.3.0", "eslint": "^8.57.0", "eslint-define-config": "^2.1.0", @@ -99,21 +99,21 @@ "prettier": "^3.2.5", "pretty-bytes": "^6.1.1", "pug": "^3.0.2", - "puppeteer": "~22.4.1", + "puppeteer": "~22.6.3", "rimraf": "^5.0.5", - "rollup": "^4.12.1", + "rollup": "^4.13.2", "rollup-plugin-dts": "^6.1.0", "rollup-plugin-esbuild": "^6.1.1", "rollup-plugin-polyfill-node": "^0.13.0", "semver": "^7.6.0", "serve": "^14.2.1", - "simple-git-hooks": "^2.10.0", - "terser": "^5.29.1", + "simple-git-hooks": "^2.11.1", + "terser": "^5.30.1", "todomvc-app-css": "^2.4.3", "tslib": "^2.6.2", - "tsx": "^4.7.1", - "typescript": "^5.2.2", - "vite": "^5.1.5", - "vitest": "^1.3.1" + "tsx": "^4.7.2", + "typescript": "~5.4.5", + "vite": "^5.2.7", + "vitest": "^1.4.0" } } diff --git a/packages/compiler-core/__tests__/parse.spec.ts b/packages/compiler-core/__tests__/parse.spec.ts index d5bdb4bc5..429a79686 100644 --- a/packages/compiler-core/__tests__/parse.spec.ts +++ b/packages/compiler-core/__tests__/parse.spec.ts @@ -2070,6 +2070,16 @@ describe('compiler: parse', () => { baseParse(``, { parseMode: 'sfc', onError() {} }) expect(() => baseParse(`{ foo }`)).not.toThrow() }) + + test('correct loc when the closing > is foarmatted', () => { + const [span] = baseParse(``).children + + expect(span.loc.source).toBe('') + expect(span.loc.start.offset).toBe(0) + expect(span.loc.end.offset).toBe(27) + }) }) describe('decodeEntities option', () => { @@ -2166,7 +2176,7 @@ describe('compiler: parse', () => { }) test('should remove leading newline character immediately following the pre element start tag', () => { - const ast = baseParse(`
\n  foo  bar  
`, { + const ast = parse(`
\n  foo  bar  
`, { isPreTag: tag => tag === 'pre', }) expect(ast.children).toHaveLength(1) @@ -2176,7 +2186,7 @@ describe('compiler: parse', () => { }) test('should NOT remove leading newline character immediately following child-tag of pre element', () => { - const ast = baseParse(`
\n  foo  bar  
`, { + const ast = parse(`
\n  foo  bar  
`, { isPreTag: tag => tag === 'pre', }) const preElement = ast.children[0] as ElementNode @@ -2187,7 +2197,7 @@ describe('compiler: parse', () => { }) test('self-closing pre tag', () => { - const ast = baseParse(`
\n  foo   bar`, {
+      const ast = parse(`
\n  foo   bar`, {
         isPreTag: tag => tag === 'pre',
       })
       const elementAfterPre = ast.children[1] as ElementNode
@@ -2196,7 +2206,7 @@ describe('compiler: parse', () => {
     })
 
     test('should NOT condense whitespaces in RCDATA text mode', () => {
-      const ast = baseParse(``, {
+      const ast = parse(``, {
         parseMode: 'html',
       })
       const preElement = ast.children[0] as ElementNode
diff --git a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts
index 5d3f92ced..c30840a21 100644
--- a/packages/compiler-core/__tests__/transforms/transformElement.spec.ts
+++ b/packages/compiler-core/__tests__/transforms/transformElement.spec.ts
@@ -1231,6 +1231,24 @@ describe('compiler: element transform', () => {
       })
     })
 
+    test('dynamic binding shorthand', () => {
+      const { node, root } = parseWithBind(``)
+      expect(root.helpers).toContain(RESOLVE_DYNAMIC_COMPONENT)
+      expect(node).toMatchObject({
+        isBlock: true,
+        tag: {
+          callee: RESOLVE_DYNAMIC_COMPONENT,
+          arguments: [
+            {
+              type: NodeTypes.SIMPLE_EXPRESSION,
+              content: 'is',
+              isStatic: false,
+            },
+          ],
+        },
+      })
+    })
+
     test('is casting', () => {
       const { node, root } = parseWithBind(`
`) expect(root.helpers).toContain(RESOLVE_COMPONENT) diff --git a/packages/compiler-core/package.json b/packages/compiler-core/package.json index b8a414537..dc7e4c17c 100644 --- a/packages/compiler-core/package.json +++ b/packages/compiler-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-core", - "version": "3.4.21", + "version": "3.4.22", "description": "@vue/compiler-core", "main": "index.js", "module": "dist/compiler-core.esm-bundler.js", @@ -46,11 +46,11 @@ }, "homepage": "https://github.com/vuejs/core-vapor/tree/main/packages/compiler-core#readme", "dependencies": { - "@babel/parser": "^7.24.0", + "@babel/parser": "^7.24.1", "@vue/shared": "workspace:*", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "devDependencies": { "@babel/types": "^7.24.0" diff --git a/packages/compiler-core/src/codegen.ts b/packages/compiler-core/src/codegen.ts index e1674a0d4..e419ac0b8 100644 --- a/packages/compiler-core/src/codegen.ts +++ b/packages/compiler-core/src/codegen.ts @@ -28,7 +28,7 @@ import { getVNodeHelper, locStub, } from './ast' -import { type RawSourceMap, SourceMapGenerator } from 'source-map-js' +import { SourceMapGenerator } from 'source-map-js' import { advancePositionWithMutation, assert, @@ -56,6 +56,45 @@ import { } from './runtimeHelpers' import type { ImportItem } from './transform' +/** + * The `SourceMapGenerator` type from `source-map-js` is a bit incomplete as it + * misses `toJSON()`. We also need to add types for internal properties which we + * need to access for better performance. + * + * Since TS 5.3, dts generation starts to strangely include broken triple slash + * references for source-map-js, so we are inlining all source map related types + * here to to workaround that. + */ +export interface CodegenSourceMapGenerator { + setSourceContent(sourceFile: string, sourceContent: string): void + // SourceMapGenerator has this method but the types do not include it + toJSON(): RawSourceMap + _sources: Set + _names: Set + _mappings: { + add(mapping: MappingItem): void + } +} + +export interface RawSourceMap { + file?: string + sourceRoot?: string + version: string + sources: string[] + names: string[] + sourcesContent?: string[] + mappings: string +} + +interface MappingItem { + source: string + generatedLine: number + generatedColumn: number + originalLine: number + originalColumn: number + name: string | null +} + const PURE_ANNOTATION = `/*#__PURE__*/` const aliasHelper = (s: symbol) => `${helperNameMap[s]}: _${helperNameMap[s]}` @@ -101,7 +140,7 @@ export interface CodegenContext offset: number indentLevel: number pure: boolean - map?: SourceMapGenerator + map?: CodegenSourceMapGenerator helper(key: symbol): string push(code: string, newlineIndex?: number, node?: CodegenNode): void indent(): void @@ -234,14 +273,14 @@ function createCodegenContext( generatedLine: context.line, generatedColumn: context.column - 1, source: filename, - // @ts-expect-error it is possible to be null name, }) } if (!__BROWSER__ && sourceMap) { // lazy require source-map implementation, only in non-browser builds - context.map = new SourceMapGenerator() + context.map = + new SourceMapGenerator() as unknown as CodegenSourceMapGenerator context.map.setSourceContent(filename, context.source) context.map._sources.add(filename) } diff --git a/packages/compiler-core/src/index.ts b/packages/compiler-core/src/index.ts index 1b5eda990..b2679e9c6 100644 --- a/packages/compiler-core/src/index.ts +++ b/packages/compiler-core/src/index.ts @@ -26,6 +26,8 @@ export { NewlineType, type CodegenContext, type CodegenResult, + type CodegenSourceMapGenerator, + type RawSourceMap, type BaseCodegenResult, } from './codegen' export { diff --git a/packages/compiler-core/src/options.ts b/packages/compiler-core/src/options.ts index 8e1af21e2..6c3f8e51c 100644 --- a/packages/compiler-core/src/options.ts +++ b/packages/compiler-core/src/options.ts @@ -74,6 +74,7 @@ export interface ParserOptions delimiters?: [string, string] /** * Whitespace handling strategy + * @default 'condense' */ whitespace?: 'preserve' | 'condense' /** diff --git a/packages/compiler-core/src/parser.ts b/packages/compiler-core/src/parser.ts index 202fba81b..da8861b92 100644 --- a/packages/compiler-core/src/parser.ts +++ b/packages/compiler-core/src/parser.ts @@ -613,7 +613,7 @@ function onCloseTag(el: ElementNode, end: number, isImplied = false) { // implied close, end should be backtracked to close setLocEnd(el.loc, backTrack(end, CharCodes.Lt)) } else { - setLocEnd(el.loc, end + 1) + setLocEnd(el.loc, lookAhead(end, CharCodes.Gt) + 1) } if (tokenizer.inSFCRoot) { @@ -736,6 +736,12 @@ function onCloseTag(el: ElementNode, end: number, isImplied = false) { } } +function lookAhead(index: number, c: number) { + let i = index + while (currentInput.charCodeAt(i) !== c && i < currentInput.length - 1) i++ + return i +} + function backTrack(index: number, c: number) { let i = index while (currentInput.charCodeAt(i) !== c && i >= 0) i-- diff --git a/packages/compiler-core/src/transforms/transformElement.ts b/packages/compiler-core/src/transforms/transformElement.ts index c50f7f5e9..ca6e59df3 100644 --- a/packages/compiler-core/src/transforms/transformElement.ts +++ b/packages/compiler-core/src/transforms/transformElement.ts @@ -64,6 +64,7 @@ import { checkCompatEnabled, isCompatEnabled, } from '../compat/compatConfig' +import { processExpression } from './transformExpression' // some directive transforms (e.g. v-model) may return a symbol for runtime // import, which should be used instead of a resolveDirective call. @@ -253,7 +254,7 @@ export function resolveComponentType( // 1. dynamic component const isExplicitDynamic = isComponentTag(tag) - const isProp = findProp(node, 'is') + const isProp = findProp(node, 'is', false, true /* allow empty */) if (isProp) { if ( isExplicitDynamic || @@ -263,10 +264,19 @@ export function resolveComponentType( context, )) ) { - const exp = - isProp.type === NodeTypes.ATTRIBUTE - ? isProp.value && createSimpleExpression(isProp.value.content, true) - : isProp.exp + let exp: ExpressionNode | undefined + if (isProp.type === NodeTypes.ATTRIBUTE) { + exp = isProp.value && createSimpleExpression(isProp.value.content, true) + } else { + exp = isProp.exp + if (!exp) { + // #10469 handle :is shorthand + exp = createSimpleExpression(`is`, false, isProp.loc) + if (!__BROWSER__) { + exp = isProp.exp = processExpression(exp, context) + } + } + } if (exp) { return createCallExpression(context.helper(RESOLVE_DYNAMIC_COMPONENT), [ exp, diff --git a/packages/compiler-dom/package.json b/packages/compiler-dom/package.json index a92d1315c..c72182935 100644 --- a/packages/compiler-dom/package.json +++ b/packages/compiler-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-dom", - "version": "3.4.21", + "version": "3.4.22", "description": "@vue/compiler-dom", "main": "index.js", "module": "dist/compiler-dom.esm-bundler.js", diff --git a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap index b6a93541d..6e9967fd0 100644 --- a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap @@ -103,6 +103,26 @@ return { modelValue } })" `; +exports[`defineModel() > w/ Boolean And Function types, production mode 1`] = ` +"import { useModel as _useModel, defineComponent as _defineComponent } from 'vue' + +export default /*#__PURE__*/_defineComponent({ + props: { + "modelValue": { type: [Boolean, String] }, + "modelModifiers": {}, + }, + emits: ["update:modelValue"], + setup(__props, { expose: __expose }) { + __expose(); + + const modelValue = _useModel(__props, "modelValue") + +return { modelValue } +} + +})" +`; + exports[`defineModel() > w/ array props 1`] = ` "import { useModel as _useModel, mergeModels as _mergeModels } from 'vue' diff --git a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/importUsageCheck.spec.ts.snap b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/importUsageCheck.spec.ts.snap index 764d120a7..722e3340a 100644 --- a/packages/compiler-sfc/__tests__/compileScript/__snapshots__/importUsageCheck.spec.ts.snap +++ b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/importUsageCheck.spec.ts.snap @@ -66,14 +66,14 @@ return { get vMyDir() { return vMyDir } } exports[`dynamic arguments 1`] = ` "import { defineComponent as _defineComponent } from 'vue' -import { FooBar, foo, bar, unused, baz } from './x' +import { FooBar, foo, bar, unused, baz, msg } from './x' export default /*#__PURE__*/_defineComponent({ setup(__props, { expose: __expose }) { __expose(); -return { get FooBar() { return FooBar }, get foo() { return foo }, get bar() { return bar }, get baz() { return baz } } +return { get FooBar() { return FooBar }, get foo() { return foo }, get bar() { return bar }, get baz() { return baz }, get msg() { return msg } } } })" diff --git a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts index 304258615..bd048a847 100644 --- a/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/defineModel.spec.ts @@ -221,4 +221,24 @@ describe('defineModel()', () => { assertCode(content) expect(content).toMatch(`set: (v) => { return v + __props.x }`) }) + + test('w/ Boolean And Function types, production mode', () => { + const { content, bindings } = compile( + ` + + `, + { isProd: true }, + ) + assertCode(content) + expect(content).toMatch('"modelValue": { type: [Boolean, String] }') + expect(content).toMatch('emits: ["update:modelValue"]') + expect(content).toMatch( + `const modelValue = _useModel(__props, "modelValue")`, + ) + expect(bindings).toStrictEqual({ + modelValue: BindingTypes.SETUP_REF, + }) + }) }) diff --git a/packages/compiler-sfc/__tests__/compileScript/importUsageCheck.spec.ts b/packages/compiler-sfc/__tests__/compileScript/importUsageCheck.spec.ts index d9fd1dfe5..b842f7a46 100644 --- a/packages/compiler-sfc/__tests__/compileScript/importUsageCheck.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/importUsageCheck.spec.ts @@ -45,7 +45,7 @@ test('directive', () => { test('dynamic arguments', () => { const { content } = compile(` `) expect(content).toMatch( `return { get FooBar() { return FooBar }, get foo() { return foo }, ` + - `get bar() { return bar }, get baz() { return baz } }`, + `get bar() { return bar }, get baz() { return baz }, get msg() { return msg } }`, ) assertCode(content) }) diff --git a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts index 0c5c95cd1..f3be58a30 100644 --- a/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts +++ b/packages/compiler-sfc/__tests__/compileScript/resolveType.spec.ts @@ -561,6 +561,27 @@ describe('resolveType', () => { expect(deps && [...deps]).toStrictEqual(Object.keys(files)) }) + // #10635 + test('relative tsx', () => { + const files = { + '/foo.tsx': 'export type P = { foo: number }', + '/bar/index.tsx': 'export type PP = { bar: string }', + } + const { props, deps } = resolve( + ` + import { P } from './foo' + import { PP } from './bar' + defineProps

() + `, + files, + ) + expect(props).toStrictEqual({ + foo: ['Number'], + bar: ['String'], + }) + expect(deps && [...deps]).toStrictEqual(Object.keys(files)) + }) + test.runIf(process.platform === 'win32')('relative ts on Windows', () => { const files = { 'C:\\Test\\FolderA\\foo.ts': 'export type P = { foo: number }', diff --git a/packages/compiler-sfc/__tests__/compileStyle.spec.ts b/packages/compiler-sfc/__tests__/compileStyle.spec.ts index 1f9ae6722..71c0689a3 100644 --- a/packages/compiler-sfc/__tests__/compileStyle.spec.ts +++ b/packages/compiler-sfc/__tests__/compileStyle.spec.ts @@ -161,6 +161,45 @@ describe('SFC scoped CSS', () => { `) }) + // #10511 + test(':is() and :where() in compound selectors', () => { + expect( + compileScoped(`.div { color: red; } .div:where(:hover) { color: blue; }`), + ).toMatchInlineSnapshot(` + ".div[data-v-test] { color: red; + } + .div[data-v-test]:where(:hover) { color: blue; + }"`) + + expect( + compileScoped(`.div { color: red; } .div:is(:hover) { color: blue; }`), + ).toMatchInlineSnapshot(` + ".div[data-v-test] { color: red; + } + .div[data-v-test]:is(:hover) { color: blue; + }"`) + + expect( + compileScoped( + `.div { color: red; } .div:where(.foo:hover) { color: blue; }`, + ), + ).toMatchInlineSnapshot(` + ".div[data-v-test] { color: red; + } + .div[data-v-test]:where(.foo:hover) { color: blue; + }"`) + + expect( + compileScoped( + `.div { color: red; } .div:is(.foo:hover) { color: blue; }`, + ), + ).toMatchInlineSnapshot(` + ".div[data-v-test] { color: red; + } + .div[data-v-test]:is(.foo:hover) { color: blue; + }"`) + }) + test('media query', () => { expect(compileScoped(`@media print { .foo { color: red }}`)) .toMatchInlineSnapshot(` @@ -390,4 +429,23 @@ describe('SFC style preprocessors', () => { expect(res.errors.length).toBe(0) }) + + test('should mount scope on correct selector when have universal selector', () => { + expect(compileScoped(`* { color: red; }`)).toMatchInlineSnapshot(` + "[data-v-test] { color: red; + }" + `) + expect(compileScoped('* .foo { color: red; }')).toMatchInlineSnapshot(` + ".foo[data-v-test] { color: red; + }" + `) + expect(compileScoped(`*.foo { color: red; }`)).toMatchInlineSnapshot(` + ".foo[data-v-test] { color: red; + }" + `) + expect(compileScoped(`.foo * { color: red; }`)).toMatchInlineSnapshot(` + ".foo[data-v-test] * { color: red; + }" + `) + }) }) diff --git a/packages/compiler-sfc/package.json b/packages/compiler-sfc/package.json index 770e190b4..cce4c6843 100644 --- a/packages/compiler-sfc/package.json +++ b/packages/compiler-sfc/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-sfc", - "version": "3.4.21", + "version": "3.4.22", "description": "@vue/compiler-sfc", "main": "dist/compiler-sfc.cjs.js", "module": "dist/compiler-sfc.esm-browser.js", @@ -42,7 +42,7 @@ }, "homepage": "https://github.com/vuejs/core-vapor/tree/main/packages/compiler-sfc#readme", "dependencies": { - "@babel/parser": "^7.24.0", + "@babel/parser": "^7.24.1", "@vue/compiler-core": "workspace:*", "@vue/compiler-dom": "workspace:*", "@vue/compiler-ssr": "workspace:*", @@ -50,8 +50,8 @@ "@vue/shared": "workspace:*", "estree-walker": "^2.0.2", "magic-string": "^0.30.8", - "postcss": "^8.4.35", - "source-map-js": "^1.0.2" + "postcss": "^8.4.38", + "source-map-js": "^1.2.0" }, "devDependencies": { "@babel/types": "^7.24.0", @@ -59,10 +59,10 @@ "hash-sum": "^2.0.0", "lru-cache": "10.1.0", "merge-source-map": "^1.1.0", - "minimatch": "^9.0.3", + "minimatch": "^9.0.4", "postcss-modules": "^6.0.0", - "postcss-selector-parser": "^6.0.15", + "postcss-selector-parser": "^6.0.16", "pug": "^3.0.2", - "sass": "^1.71.1" + "sass": "^1.74.1" } } diff --git a/packages/compiler-sfc/src/compileStyle.ts b/packages/compiler-sfc/src/compileStyle.ts index 4390014e8..f27a6338e 100644 --- a/packages/compiler-sfc/src/compileStyle.ts +++ b/packages/compiler-sfc/src/compileStyle.ts @@ -13,7 +13,7 @@ import { type StylePreprocessorResults, processors, } from './style/preprocessors' -import type { RawSourceMap } from 'source-map-js' +import type { RawSourceMap } from '@vue/compiler-core' import { cssVarsPlugin } from './style/cssVars' import postcssModules from 'postcss-modules' diff --git a/packages/compiler-sfc/src/compileTemplate.ts b/packages/compiler-sfc/src/compileTemplate.ts index 957269e01..7551e7009 100644 --- a/packages/compiler-sfc/src/compileTemplate.ts +++ b/packages/compiler-sfc/src/compileTemplate.ts @@ -6,14 +6,11 @@ import { type NodeTransform, NodeTypes, type ParserOptions, + type RawSourceMap, type RootNode, createRoot, } from '@vue/compiler-core' -import { - type RawSourceMap, - SourceMapConsumer, - SourceMapGenerator, -} from 'source-map-js' +import { SourceMapConsumer, SourceMapGenerator } from 'source-map-js' import { type AssetURLOptions, type AssetURLTagConfig, diff --git a/packages/compiler-sfc/src/parse.ts b/packages/compiler-sfc/src/parse.ts index 7a05d3020..369a8252e 100644 --- a/packages/compiler-sfc/src/parse.ts +++ b/packages/compiler-sfc/src/parse.ts @@ -1,15 +1,17 @@ import { type BindingMetadata, + type CodegenSourceMapGenerator, type CompilerError, type ElementNode, NodeTypes, type ParserOptions, + type RawSourceMap, type RootNode, type SourceLocation, createRoot, } from '@vue/compiler-core' import * as CompilerDOM from '@vue/compiler-dom' -import { type RawSourceMap, SourceMapGenerator } from 'source-map-js' +import { SourceMapGenerator } from 'source-map-js' import type { TemplateCompiler } from './compileTemplate' import { parseCssVars } from './style/cssVars' import { createCache } from './cache' @@ -382,7 +384,7 @@ function generateSourceMap( const map = new SourceMapGenerator({ file: filename.replace(/\\/g, '/'), sourceRoot: sourceRoot.replace(/\\/g, '/'), - }) + }) as unknown as CodegenSourceMapGenerator map.setSourceContent(filename, source) map._sources.add(filename) generated.split(splitRE).forEach((line, index) => { @@ -397,7 +399,6 @@ function generateSourceMap( generatedLine, generatedColumn: i, source: filename, - // @ts-expect-error name: null, }) } diff --git a/packages/compiler-sfc/src/script/defineModel.ts b/packages/compiler-sfc/src/script/defineModel.ts index 24fd0780e..e5e2ed0e5 100644 --- a/packages/compiler-sfc/src/script/defineModel.ts +++ b/packages/compiler-sfc/src/script/defineModel.ts @@ -129,15 +129,19 @@ export function genModelProps(ctx: ScriptCompileContext) { let runtimeTypes = type && inferRuntimeType(ctx, type) if (runtimeTypes) { + const hasBoolean = runtimeTypes.includes('Boolean') const hasUnknownType = runtimeTypes.includes(UNKNOWN_TYPE) - runtimeTypes = runtimeTypes.filter(el => { - if (el === UNKNOWN_TYPE) return false - return isProd - ? el === 'Boolean' || (el === 'Function' && options) - : true - }) - skipCheck = !isProd && hasUnknownType && runtimeTypes.length > 0 + if (isProd || hasUnknownType) { + runtimeTypes = runtimeTypes.filter( + t => + t === 'Boolean' || + (hasBoolean && t === 'String') || + (t === 'Function' && options), + ) + + skipCheck = !isProd && hasUnknownType && runtimeTypes.length > 0 + } } let runtimeType = diff --git a/packages/compiler-sfc/src/script/importUsageCheck.ts b/packages/compiler-sfc/src/script/importUsageCheck.ts index 211efc490..6b9fbc634 100644 --- a/packages/compiler-sfc/src/script/importUsageCheck.ts +++ b/packages/compiler-sfc/src/script/importUsageCheck.ts @@ -60,6 +60,9 @@ function resolveTemplateUsedIdentifiers(sfc: SFCDescriptor): Set { extractIdentifiers(ids, prop.forParseResult!.source) } else if (prop.exp) { extractIdentifiers(ids, prop.exp) + } else if (prop.name === 'bind' && !prop.exp) { + // v-bind shorthand name as identifier + ids.add((prop.arg as SimpleExpressionNode).content) } } if ( diff --git a/packages/compiler-sfc/src/script/resolveType.ts b/packages/compiler-sfc/src/script/resolveType.ts index 968c168dd..f6e291791 100644 --- a/packages/compiler-sfc/src/script/resolveType.ts +++ b/packages/compiler-sfc/src/script/resolveType.ts @@ -956,8 +956,10 @@ function resolveExt(filename: string, fs: FS) { return ( tryResolve(filename) || tryResolve(filename + `.ts`) || + tryResolve(filename + `.tsx`) || tryResolve(filename + `.d.ts`) || tryResolve(joinPaths(filename, `index.ts`)) || + tryResolve(joinPaths(filename, `index.tsx`)) || tryResolve(joinPaths(filename, `index.d.ts`)) ) } diff --git a/packages/compiler-sfc/src/style/pluginScoped.ts b/packages/compiler-sfc/src/style/pluginScoped.ts index c5e018961..3812e6709 100644 --- a/packages/compiler-sfc/src/style/pluginScoped.ts +++ b/packages/compiler-sfc/src/style/pluginScoped.ts @@ -170,9 +170,37 @@ function rewriteSelector( } } + if (n.type === 'universal') { + const prev = selector.at(selector.index(n) - 1) + const next = selector.at(selector.index(n) + 1) + // * ... {} + if (!prev) { + // * .foo {} -> .foo[xxxxxxx] {} + if (next) { + if (next.type === 'combinator' && next.value === ' ') { + selector.removeChild(next) + } + selector.removeChild(n) + return + } else { + // * {} -> [xxxxxxx] {} + node = selectorParser.combinator({ + value: '', + }) + selector.insertBefore(n, node) + selector.removeChild(n) + return false + } + } + // .foo * -> .foo[xxxxxxx] * + if (node) return + } + if ( (n.type !== 'pseudo' && n.type !== 'combinator') || - (n.type === 'pseudo' && (n.value === ':is' || n.value === ':where')) + (n.type === 'pseudo' && + (n.value === ':is' || n.value === ':where') && + !node) ) { node = n } diff --git a/packages/compiler-sfc/src/style/preprocessors.ts b/packages/compiler-sfc/src/style/preprocessors.ts index 7915d1d14..6a974368e 100644 --- a/packages/compiler-sfc/src/style/preprocessors.ts +++ b/packages/compiler-sfc/src/style/preprocessors.ts @@ -1,5 +1,5 @@ import merge from 'merge-source-map' -import type { RawSourceMap } from 'source-map-js' +import type { RawSourceMap } from '@vue/compiler-core' import type { SFCStyleCompileOptions } from '../compileStyle' import { isFunction } from '@vue/shared' diff --git a/packages/compiler-ssr/__tests__/ssrTransitionGroup.spec.ts b/packages/compiler-ssr/__tests__/ssrTransitionGroup.spec.ts index d2a576fd0..905e6a489 100644 --- a/packages/compiler-ssr/__tests__/ssrTransitionGroup.spec.ts +++ b/packages/compiler-ssr/__tests__/ssrTransitionGroup.spec.ts @@ -82,8 +82,6 @@ describe('transition-group', () => { }) if (_ctx.ok) { _push(\`

ok
\`) - } else { - _push(\`\`) } _push(\`\`) }" diff --git a/packages/compiler-ssr/package.json b/packages/compiler-ssr/package.json index fede83c2c..32864257e 100644 --- a/packages/compiler-ssr/package.json +++ b/packages/compiler-ssr/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compiler-ssr", - "version": "3.4.21", + "version": "3.4.22", "description": "@vue/compiler-ssr", "main": "dist/compiler-ssr.cjs.js", "types": "dist/compiler-ssr.d.ts", diff --git a/packages/compiler-ssr/src/ssrCodegenTransform.ts b/packages/compiler-ssr/src/ssrCodegenTransform.ts index 1755be3a3..53a7a0605 100644 --- a/packages/compiler-ssr/src/ssrCodegenTransform.ts +++ b/packages/compiler-ssr/src/ssrCodegenTransform.ts @@ -141,6 +141,7 @@ export function processChildren( context: SSRTransformContext, asFragment = false, disableNestedFragments = false, + disableCommentAsIfAlternate = false, ) { if (asFragment) { context.pushStringPart(``) @@ -191,7 +192,12 @@ export function processChildren( ) break case NodeTypes.IF: - ssrProcessIf(child, context, disableNestedFragments) + ssrProcessIf( + child, + context, + disableNestedFragments, + disableCommentAsIfAlternate, + ) break case NodeTypes.FOR: ssrProcessFor(child, context, disableNestedFragments) diff --git a/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts b/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts index 2d434010e..a2e284ae8 100644 --- a/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts +++ b/packages/compiler-ssr/src/transforms/ssrTransformTransitionGroup.ts @@ -87,6 +87,13 @@ export function ssrProcessTransitionGroup( * by disabling nested fragment wrappers from being generated. */ true, + /** + * TransitionGroup filters out comment children at runtime and thus + * doesn't expect comments to be present during hydration. We need to + * account for that by disabling the empty comment that is otherwise + * rendered for a falsy v-if that has no v-else specified. (#6715) + */ + true, ) context.pushStringPart(``']), ]) diff --git a/packages/dts-built-test/package.json b/packages/dts-built-test/package.json index dca0f80fa..dd81cab68 100644 --- a/packages/dts-built-test/package.json +++ b/packages/dts-built-test/package.json @@ -2,7 +2,7 @@ "name": "@vue/dts-built-test", "private": true, "version": "0.0.0", - "types": "dist/dts-built-test.d.ts", + "types": "dist/index.d.ts", "dependencies": { "@vue/shared": "workspace:*", "@vue/reactivity": "workspace:*", diff --git a/packages/dts-built-test/tsconfig.json b/packages/dts-built-test/tsconfig.json new file mode 100644 index 000000000..99d9024dc --- /dev/null +++ b/packages/dts-built-test/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist", + "jsx": "preserve", + "module": "esnext", + "strict": true, + "moduleResolution": "Bundler", + "lib": ["esnext", "dom"], + "declaration": true, + "emitDeclarationOnly": true + }, + "include": ["./src"] +} diff --git a/packages/dts-test/setupHelpers.test-d.ts b/packages/dts-test/setupHelpers.test-d.ts index c749e80a5..883ebe6b2 100644 --- a/packages/dts-test/setupHelpers.test-d.ts +++ b/packages/dts-test/setupHelpers.test-d.ts @@ -102,6 +102,41 @@ describe('defineProps w/ union type declaration + withDefaults', () => { ) }) +describe('defineProps w/ object union + withDefaults', () => { + const props = withDefaults( + defineProps< + { + foo: string + } & ( + | { + type: 'hello' + bar: string + } + | { + type: 'world' + bar: number + } + ) + >(), + { + foo: 'default value!', + }, + ) + + expectType< + | { + readonly type: 'hello' + readonly bar: string + readonly foo: string + } + | { + readonly type: 'world' + readonly bar: number + readonly foo: string + } + >(props) +}) + describe('defineProps w/ generic type declaration + withDefaults', - _names: Set - _mappings: { - add(mapping: MappingItem): void - } - } -} - declare interface String { /** * @deprecated Please use String.prototype.slice instead of String.prototype.substring in the repository. diff --git a/packages/reactivity/__tests__/effectScope.spec.ts b/packages/reactivity/__tests__/effectScope.spec.ts index 8a7f26dbb..4d83d867c 100644 --- a/packages/reactivity/__tests__/effectScope.spec.ts +++ b/packages/reactivity/__tests__/effectScope.spec.ts @@ -4,6 +4,7 @@ import { EffectScope, computed, effect, + effectScope, getCurrentScope, onScopeDispose, reactive, @@ -13,21 +14,21 @@ import { describe('reactivity/effect/scope', () => { it('should run', () => { const fnSpy = vi.fn(() => {}) - new EffectScope().run(fnSpy) + effectScope().run(fnSpy) expect(fnSpy).toHaveBeenCalledTimes(1) }) it('should accept zero argument', () => { - const scope = new EffectScope() + const scope = effectScope() expect(scope.effects.length).toBe(0) }) it('should return run value', () => { - expect(new EffectScope().run(() => 1)).toBe(1) + expect(effectScope().run(() => 1)).toBe(1) }) it('should work w/ active property', () => { - const scope = new EffectScope() + const scope = effectScope() scope.run(() => 1) expect(scope.active).toBe(true) scope.stop() @@ -35,7 +36,7 @@ describe('reactivity/effect/scope', () => { }) it('should collect the effects', () => { - const scope = new EffectScope() + const scope = effectScope() scope.run(() => { let dummy const counter = reactive({ num: 0 }) @@ -53,7 +54,7 @@ describe('reactivity/effect/scope', () => { let dummy, doubled const counter = reactive({ num: 0 }) - const scope = new EffectScope() + const scope = effectScope() scope.run(() => { effect(() => (dummy = counter.num)) effect(() => (doubled = counter.num * 2)) @@ -77,11 +78,11 @@ describe('reactivity/effect/scope', () => { let dummy, doubled const counter = reactive({ num: 0 }) - const scope = new EffectScope() + const scope = effectScope() scope.run(() => { effect(() => (dummy = counter.num)) // nested scope - new EffectScope().run(() => { + effectScope().run(() => { effect(() => (doubled = counter.num * 2)) }) }) @@ -107,11 +108,11 @@ describe('reactivity/effect/scope', () => { let dummy, doubled const counter = reactive({ num: 0 }) - const scope = new EffectScope() + const scope = effectScope() scope.run(() => { effect(() => (dummy = counter.num)) // nested scope - new EffectScope(true).run(() => { + effectScope(true).run(() => { effect(() => (doubled = counter.num * 2)) }) }) @@ -136,7 +137,7 @@ describe('reactivity/effect/scope', () => { let dummy, doubled const counter = reactive({ num: 0 }) - const scope = new EffectScope() + const scope = effectScope() scope.run(() => { effect(() => (dummy = counter.num)) }) @@ -160,7 +161,7 @@ describe('reactivity/effect/scope', () => { let dummy, doubled const counter = reactive({ num: 0 }) - const scope = new EffectScope() + const scope = effectScope() scope.run(() => { effect(() => (dummy = counter.num)) }) @@ -185,7 +186,7 @@ describe('reactivity/effect/scope', () => { it('should fire onScopeDispose hook', () => { let dummy = 0 - const scope = new EffectScope() + const scope = effectScope() scope.run(() => { onScopeDispose(() => (dummy += 1)) onScopeDispose(() => (dummy += 2)) @@ -203,7 +204,7 @@ describe('reactivity/effect/scope', () => { it('should warn onScopeDispose() is called when there is no active effect scope', () => { const spy = vi.fn() - const scope = new EffectScope() + const scope = effectScope() scope.run(() => { onScopeDispose(spy) }) @@ -221,8 +222,8 @@ describe('reactivity/effect/scope', () => { }) it('should dereference child scope from parent scope after stopping child scope (no memleaks)', () => { - const parent = new EffectScope() - const child = parent.run(() => new EffectScope())! + const parent = effectScope() + const child = parent.run(() => effectScope())! expect(parent.scopes!.includes(child)).toBe(true) child.stop() expect(parent.scopes!.includes(child)).toBe(false) @@ -236,7 +237,7 @@ describe('reactivity/effect/scope', () => { const watchEffectSpy = vi.fn() let c: ComputedRef - const scope = new EffectScope() + const scope = effectScope() scope.run(() => { c = computed(() => { computedSpy() @@ -272,12 +273,12 @@ describe('reactivity/effect/scope', () => { }) it('getCurrentScope() stays valid when running a detached nested EffectScope', () => { - const parentScope = new EffectScope() + const parentScope = effectScope() parentScope.run(() => { const currentScope = getCurrentScope() expect(currentScope).toBeDefined() - const detachedScope = new EffectScope(true) + const detachedScope = effectScope(true) detachedScope.run(() => {}) expect(getCurrentScope()).toBe(currentScope) @@ -285,10 +286,10 @@ describe('reactivity/effect/scope', () => { }) it('calling .off() of a detached scope inside an active scope should not break currentScope', () => { - const parentScope = new EffectScope() + const parentScope = effectScope() parentScope.run(() => { - const childScope = new EffectScope(true) + const childScope = effectScope(true) childScope.on() childScope.off() expect(getCurrentScope()).toBe(parentScope) diff --git a/packages/reactivity/__tests__/reactive.spec.ts b/packages/reactivity/__tests__/reactive.spec.ts index ab953ff89..bd4ec402b 100644 --- a/packages/reactivity/__tests__/reactive.spec.ts +++ b/packages/reactivity/__tests__/reactive.spec.ts @@ -1,5 +1,14 @@ import { isRef, ref } from '../src/ref' -import { isReactive, markRaw, reactive, toRaw } from '../src/reactive' +import { + isProxy, + isReactive, + markRaw, + reactive, + readonly, + shallowReactive, + shallowReadonly, + toRaw, +} from '../src/reactive' import { computed } from '../src/computed' import { effect } from '../src/effect' @@ -302,4 +311,52 @@ describe('reactivity/reactive', () => { const observed = reactive(original) expect(isReactive(observed)).toBe(false) }) + + test('hasOwnProperty edge case: Symbol values', () => { + const key = Symbol() + const obj = reactive({ [key]: 1 }) as { [key]?: 1 } + let dummy + effect(() => { + dummy = obj.hasOwnProperty(key) + }) + expect(dummy).toBe(true) + + delete obj[key] + expect(dummy).toBe(false) + }) + + test('hasOwnProperty edge case: non-string values', () => { + const key = {} + const obj = reactive({ '[object Object]': 1 }) as { '[object Object]'?: 1 } + let dummy + effect(() => { + // @ts-expect-error + dummy = obj.hasOwnProperty(key) + }) + expect(dummy).toBe(true) + + // @ts-expect-error + delete obj[key] + expect(dummy).toBe(false) + }) + + test('isProxy', () => { + const foo = {} + expect(isProxy(foo)).toBe(false) + + const fooRe = reactive(foo) + expect(isProxy(fooRe)).toBe(true) + + const fooSRe = shallowReactive(foo) + expect(isProxy(fooSRe)).toBe(true) + + const barRl = readonly(foo) + expect(isProxy(barRl)).toBe(true) + + const barSRl = shallowReadonly(foo) + expect(isProxy(barSRl)).toBe(true) + + const c = computed(() => {}) + expect(isProxy(c)).toBe(false) + }) }) diff --git a/packages/reactivity/__tests__/reactiveArray.spec.ts b/packages/reactivity/__tests__/reactiveArray.spec.ts index 9caeaf116..6ea3c9539 100644 --- a/packages/reactivity/__tests__/reactiveArray.spec.ts +++ b/packages/reactivity/__tests__/reactiveArray.spec.ts @@ -100,6 +100,21 @@ describe('reactivity/reactive/Array', () => { expect(fn).toHaveBeenCalledTimes(1) }) + test('should track hasOwnProperty call with index', () => { + const original = [1, 2, 3] + const observed = reactive(original) + + let dummy + effect(() => { + dummy = observed.hasOwnProperty(0) + }) + + expect(dummy).toBe(true) + + delete observed[0] + expect(dummy).toBe(false) + }) + test('shift on Array should trigger dependency once', () => { const arr = reactive([1, 2, 3]) const fn = vi.fn() diff --git a/packages/reactivity/package.json b/packages/reactivity/package.json index 60997b87b..b7020c8ee 100644 --- a/packages/reactivity/package.json +++ b/packages/reactivity/package.json @@ -1,6 +1,6 @@ { "name": "@vue/reactivity", - "version": "3.4.21", + "version": "3.4.22", "description": "@vue/reactivity", "main": "index.js", "module": "dist/reactivity.esm-bundler.js", diff --git a/packages/reactivity/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index c8034dd07..9a899c955 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -38,10 +38,12 @@ const builtInSymbols = new Set( .filter(isSymbol), ) -function hasOwnProperty(this: object, key: string) { +function hasOwnProperty(this: object, key: unknown) { + // #10455 hasOwnProperty may be called with non-string values + if (!isSymbol(key)) key = String(key) const obj = toRaw(this) track(obj, TrackOpTypes.HAS, key) - return obj.hasOwnProperty(key) + return obj.hasOwnProperty(key as string) } class BaseReactiveHandler implements ProxyHandler { diff --git a/packages/reactivity/src/reactive.ts b/packages/reactivity/src/reactive.ts index 1e0f9365d..f6fcbbdb9 100644 --- a/packages/reactivity/src/reactive.ts +++ b/packages/reactivity/src/reactive.ts @@ -329,8 +329,8 @@ export function isShallow(value: unknown): boolean { * @param value - The value to check. * @see {@link https://vuejs.org/api/reactivity-utilities.html#isproxy} */ -export function isProxy(value: unknown): boolean { - return isReactive(value) || isReadonly(value) +export function isProxy(value: any): boolean { + return value ? !!value[ReactiveFlags.RAW] : false } /** @@ -409,5 +409,5 @@ export const toReactive = (value: T): T => * * @param value - The value for which a readonly proxy shall be created. */ -export const toReadonly = (value: T): T => - isObject(value) ? readonly(value) : value +export const toReadonly = (value: T): DeepReadonly => + isObject(value) ? readonly(value) : (value as DeepReadonly) diff --git a/packages/runtime-core/__tests__/components/BaseTransition.spec.ts b/packages/runtime-core/__tests__/components/BaseTransition.spec.ts index 7c389fe1e..3184c9c9c 100644 --- a/packages/runtime-core/__tests__/components/BaseTransition.spec.ts +++ b/packages/runtime-core/__tests__/components/BaseTransition.spec.ts @@ -7,6 +7,7 @@ import { h, nextTick, nodeOps, + onUnmounted, ref, render, serialize, @@ -768,6 +769,42 @@ describe('BaseTransition', () => { test('w/ KeepAlive', async () => { await runTestWithKeepAlive(testOutIn) }) + + test('w/ KeepAlive + unmount innerChild', async () => { + const unmountSpy = vi.fn() + const includeRef = ref(['TrueBranch']) + const trueComp = { + name: 'TrueBranch', + setup() { + onUnmounted(unmountSpy) + const count = ref(0) + return () => h('div', count.value) + }, + } + + const toggle = ref(true) + const { props } = mockProps({ mode: 'out-in' }, true /*withKeepAlive*/) + const root = nodeOps.createElement('div') + const App = { + render() { + return h(BaseTransition, props, () => { + return h( + KeepAlive, + { include: includeRef.value }, + toggle.value ? h(trueComp) : h('div'), + ) + }) + }, + } + render(h(App), root) + + // trigger toggle + toggle.value = false + includeRef.value = [] + + await nextTick() + expect(unmountSpy).toHaveBeenCalledTimes(1) + }) }) // #6835 diff --git a/packages/runtime-core/__tests__/errorHandling.spec.ts b/packages/runtime-core/__tests__/errorHandling.spec.ts index d995c5fa0..085127677 100644 --- a/packages/runtime-core/__tests__/errorHandling.spec.ts +++ b/packages/runtime-core/__tests__/errorHandling.spec.ts @@ -583,5 +583,31 @@ describe('error handling', () => { expect(handler).toHaveBeenCalledTimes(4) }) + // #9574 + test('should pause tracking in error handler', async () => { + const error = new Error('error') + const x = ref(Math.random()) + + const handler = vi.fn(() => { + x.value + x.value = Math.random() + }) + + const app = createApp({ + setup() { + return () => { + throw error + } + }, + }) + + app.config.errorHandler = handler + app.mount(nodeOps.createElement('div')) + + await nextTick() + expect(handler).toHaveBeenCalledWith(error, {}, 'render function') + expect(handler).toHaveBeenCalledTimes(1) + }) + // native event handler handling should be tested in respective renderers }) diff --git a/packages/runtime-core/__tests__/hydration.spec.ts b/packages/runtime-core/__tests__/hydration.spec.ts index 6caa2442e..e0277622c 100644 --- a/packages/runtime-core/__tests__/hydration.spec.ts +++ b/packages/runtime-core/__tests__/hydration.spec.ts @@ -7,7 +7,10 @@ import { Teleport, Transition, type VNode, + createBlock, createCommentVNode, + createElementBlock, + createElementVNode, createSSRApp, createStaticVNode, createTextVNode, @@ -17,16 +20,19 @@ import { h, nextTick, onMounted, + openBlock, ref, renderSlot, useCssVars, vModelCheckbox, vShow, + withCtx, withDirectives, } from '@vue/runtime-dom' import { type SSRContext, renderToString } from '@vue/server-renderer' import { PatchFlags } from '@vue/shared' import { vShowOriginalDisplay } from '../../runtime-dom/src/directives/vShow' +import { expect } from 'vitest' function mountWithHydration(html: string, render: () => any) { const container = document.createElement('div') @@ -1292,6 +1298,81 @@ describe('SSR hydration', () => { `) }) + // #10607 + test('update component stable slot (prod + optimized mode)', async () => { + __DEV__ = false + const container = document.createElement('div') + container.innerHTML = `` + const Comp = { + render(this: any) { + return ( + openBlock(), + createElementBlock('div', null, [renderSlot(this.$slots, 'default')]) + ) + }, + } + const show = ref(false) + const clicked = ref(false) + + const Wrapper = { + setup() { + const items = ref([]) + onMounted(() => { + items.value = [1] + }) + return () => { + return ( + openBlock(), + createBlock(Comp, null, { + default: withCtx(() => [ + createElementVNode('div', null, [ + createElementVNode('div', null, [ + clicked.value + ? (openBlock(), + createElementBlock('div', { key: 0 }, 'foo')) + : createCommentVNode('v-if', true), + ]), + ]), + createElementVNode( + 'div', + null, + items.value.length, + 1 /* TEXT */, + ), + ]), + _: 1 /* STABLE */, + }) + ) + } + }, + } + createSSRApp({ + components: { Wrapper }, + data() { + return { show } + }, + template: ``, + }).mount(container) + + await nextTick() + expect(container.innerHTML).toBe( + `
1
`, + ) + + show.value = true + await nextTick() + expect(async () => { + clicked.value = true + await nextTick() + }).not.toThrow("Cannot read properties of null (reading 'insertBefore')") + + await nextTick() + expect(container.innerHTML).toBe( + `
foo
1
`, + ) + __DEV__ = true + }) + describe('mismatch handling', () => { test('text node', () => { const { container } = mountWithHydration(`foo`, () => 'bar') diff --git a/packages/runtime-core/package.json b/packages/runtime-core/package.json index d38b8fa21..3250032c2 100644 --- a/packages/runtime-core/package.json +++ b/packages/runtime-core/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-core", - "version": "3.4.21", + "version": "3.4.22", "description": "@vue/runtime-core", "main": "index.js", "module": "dist/runtime-core.esm-bundler.js", diff --git a/packages/runtime-core/src/apiSetupHelpers.ts b/packages/runtime-core/src/apiSetupHelpers.ts index e5f79444d..382bb30b3 100644 --- a/packages/runtime-core/src/apiSetupHelpers.ts +++ b/packages/runtime-core/src/apiSetupHelpers.ts @@ -233,7 +233,7 @@ export type DefineModelOptions = { * Otherwise the prop name will default to "modelValue". In both cases, you * can also pass an additional object which will be used as the prop's options. * - * The the returned ref behaves differently depending on whether the parent + * The returned ref behaves differently depending on whether the parent * provided the corresponding v-model props or not: * - If yes, the returned ref's value will always be in sync with the parent * prop. @@ -284,6 +284,9 @@ export function defineModel(): any { } type NotUndefined = T extends undefined ? never : T +type MappedOmit = { + [P in keyof T as P extends K ? never : P]: T[P] +} type InferDefaults = { [K in keyof T]?: InferDefault @@ -299,7 +302,7 @@ type PropsWithDefaults< T, Defaults extends InferDefaults, BKeys extends keyof T, -> = Readonly> & { +> = Readonly> & { readonly [K in keyof Defaults]-?: K extends keyof T ? Defaults[K] extends undefined ? T[K] diff --git a/packages/runtime-core/src/compat/global.ts b/packages/runtime-core/src/compat/global.ts index 5bf234fcf..1c633ed52 100644 --- a/packages/runtime-core/src/compat/global.ts +++ b/packages/runtime-core/src/compat/global.ts @@ -427,15 +427,14 @@ function applySingletonPrototype(app: App, Ctor: Function) { app.config.globalProperties = Object.create(Ctor.prototype) } let hasPrototypeAugmentations = false - const descriptors = Object.getOwnPropertyDescriptors(Ctor.prototype) - for (const key in descriptors) { + for (const key of Object.getOwnPropertyNames(Ctor.prototype)) { if (key !== 'constructor') { hasPrototypeAugmentations = true if (enabled) { Object.defineProperty( app.config.globalProperties, key, - descriptors[key], + Object.getOwnPropertyDescriptor(Ctor.prototype, key)!, ) } } diff --git a/packages/runtime-core/src/compat/instance.ts b/packages/runtime-core/src/compat/instance.ts index 5beaf5f5e..d310de49a 100644 --- a/packages/runtime-core/src/compat/instance.ts +++ b/packages/runtime-core/src/compat/instance.ts @@ -15,6 +15,7 @@ import { DeprecationTypes, assertCompatEnabled, isCompatEnabled, + warnDeprecation, } from './compatConfig' import { off, on, once } from './instanceEventEmitter' import { getCompatListeners } from './instanceListeners' @@ -121,50 +122,77 @@ export function installCompatInstanceProperties(map: PublicPropertiesMap) { $children: getCompatChildren, $listeners: getCompatListeners, + + // inject additional properties into $options for compat + // e.g. vuex needs this.$options.parent + $options: i => { + if (!isCompatEnabled(DeprecationTypes.PRIVATE_APIS, i)) { + return resolveMergedOptions(i) + } + if (i.resolvedOptions) { + return i.resolvedOptions + } + const res = (i.resolvedOptions = extend({}, resolveMergedOptions(i))) + Object.defineProperties(res, { + parent: { + get() { + warnDeprecation(DeprecationTypes.PRIVATE_APIS, i, '$options.parent') + return i.proxy!.$parent + }, + }, + propsData: { + get() { + warnDeprecation( + DeprecationTypes.PRIVATE_APIS, + i, + '$options.propsData', + ) + return i.vnode.props + }, + }, + }) + return res + }, } as PublicPropertiesMap) - /* istanbul ignore if */ - if (isCompatEnabled(DeprecationTypes.PRIVATE_APIS, null)) { - extend(map, { - // needed by many libs / render fns - $vnode: i => i.vnode, + const privateAPIs = { + // needed by many libs / render fns + $vnode: i => i.vnode, - // inject additional properties into $options for compat - // e.g. vuex needs this.$options.parent - $options: i => { - const res = extend({}, resolveMergedOptions(i)) - res.parent = i.proxy!.$parent - res.propsData = i.vnode.props - return res - }, + // some private properties that are likely accessed... + _self: i => i.proxy, + _uid: i => i.uid, + _data: i => i.data, + _isMounted: i => i.isMounted, + _isDestroyed: i => i.isUnmounted, - // some private properties that are likely accessed... - _self: i => i.proxy, - _uid: i => i.uid, - _data: i => i.data, - _isMounted: i => i.isMounted, - _isDestroyed: i => i.isUnmounted, + // v2 render helpers + $createElement: () => compatH, + _c: () => compatH, + _o: () => legacyMarkOnce, + _n: () => looseToNumber, + _s: () => toDisplayString, + _l: () => renderList, + _t: i => legacyRenderSlot.bind(null, i), + _q: () => looseEqual, + _i: () => looseIndexOf, + _m: i => legacyRenderStatic.bind(null, i), + _f: () => resolveFilter, + _k: i => legacyCheckKeyCodes.bind(null, i), + _b: () => legacyBindObjectProps, + _v: () => createTextVNode, + _e: () => createCommentVNode, + _u: () => legacyresolveScopedSlots, + _g: () => legacyBindObjectListeners, + _d: () => legacyBindDynamicKeys, + _p: () => legacyPrependModifier, + } as PublicPropertiesMap - // v2 render helpers - $createElement: () => compatH, - _c: () => compatH, - _o: () => legacyMarkOnce, - _n: () => looseToNumber, - _s: () => toDisplayString, - _l: () => renderList, - _t: i => legacyRenderSlot.bind(null, i), - _q: () => looseEqual, - _i: () => looseIndexOf, - _m: i => legacyRenderStatic.bind(null, i), - _f: () => resolveFilter, - _k: i => legacyCheckKeyCodes.bind(null, i), - _b: () => legacyBindObjectProps, - _v: () => createTextVNode, - _e: () => createCommentVNode, - _u: () => legacyresolveScopedSlots, - _g: () => legacyBindObjectListeners, - _d: () => legacyBindDynamicKeys, - _p: () => legacyPrependModifier, - } as PublicPropertiesMap) + for (const key in privateAPIs) { + map[key] = i => { + if (isCompatEnabled(DeprecationTypes.PRIVATE_APIS, i)) { + return privateAPIs[key](i) + } + } } } diff --git a/packages/runtime-core/src/component.ts b/packages/runtime-core/src/component.ts index 4344b22ab..1011e1756 100644 --- a/packages/runtime-core/src/component.ts +++ b/packages/runtime-core/src/component.ts @@ -45,6 +45,7 @@ import { type Directive, validateDirectiveName } from './directives' import { type ComponentOptions, type ComputedOptions, + type MergedComponentOptions, type MethodOptions, applyOptions, resolveMergedOptions, @@ -527,6 +528,12 @@ export interface ComponentInternalInstance { * @internal */ getCssVars?: () => Record + + /** + * v2 compat only, for caching mutated $options + * @internal + */ + resolvedOptions?: MergedComponentOptions } const emptyAppContext = createAppContext() @@ -779,8 +786,7 @@ function setupStatefulComponent( // 0. create render proxy property access cache instance.accessCache = Object.create(null) // 1. create public instance / render proxy - // also mark it raw so it's never observed - instance.proxy = markRaw(new Proxy(instance.ctx, PublicInstanceProxyHandlers)) + instance.proxy = new Proxy(instance.ctx, PublicInstanceProxyHandlers) if (__DEV__) { exposePropsOnRenderContext(instance) } @@ -1009,36 +1015,28 @@ export function finishComponentSetup( } } -function getAttrsProxy(instance: ComponentInternalInstance): Data { - return ( - instance.attrsProxy || - (instance.attrsProxy = new Proxy( - instance.attrs, - __DEV__ - ? { - get(target, key: string) { - markAttrsAccessed() - track(instance, TrackOpTypes.GET, '$attrs') - return target[key] - }, - set() { - warn(`setupContext.attrs is readonly.`) - return false - }, - deleteProperty() { - warn(`setupContext.attrs is readonly.`) - return false - }, - } - : { - get(target, key: string) { - track(instance, TrackOpTypes.GET, '$attrs') - return target[key] - }, - }, - )) - ) -} +const attrsProxyHandlers = __DEV__ + ? { + get(target: Data, key: string) { + markAttrsAccessed() + track(target, TrackOpTypes.GET, '') + return target[key] + }, + set() { + warn(`setupContext.attrs is readonly.`) + return false + }, + deleteProperty() { + warn(`setupContext.attrs is readonly.`) + return false + }, + } + : { + get(target: Data, key: string) { + track(target, TrackOpTypes.GET, '') + return target[key] + }, + } /** * Dev-only @@ -1085,9 +1083,13 @@ export function createSetupContext( if (__DEV__) { // We use getters in dev in case libs like test-utils overwrite instance // properties (overwrites should not be done in prod) + let attrsProxy: Data return Object.freeze({ get attrs() { - return getAttrsProxy(instance) + return ( + attrsProxy || + (attrsProxy = new Proxy(instance.attrs, attrsProxyHandlers)) + ) }, get slots() { return getSlotsProxy(instance) @@ -1099,9 +1101,7 @@ export function createSetupContext( }) } else { return { - get attrs() { - return getAttrsProxy(instance) - }, + attrs: new Proxy(instance.attrs, attrsProxyHandlers), slots: instance.slots, emit: instance.emit, expose, diff --git a/packages/runtime-core/src/componentProps.ts b/packages/runtime-core/src/componentProps.ts index dcb9c3bb7..b45cc2207 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -13,7 +13,6 @@ import { PatchFlags, camelize, capitalize, - def, extend, hasOwn, hyphenate, @@ -34,7 +33,6 @@ import { setCurrentInstance, } from './component' import { isEmitListener } from './componentEmits' -import { InternalObjectKey } from './vnode' import type { AppContext } from './apiCreateApp' import { createPropsDefaultThis } from './compat/props' import { isCompatEnabled, softAssertCompatEnabled } from './compat/compatConfig' @@ -187,6 +185,13 @@ type NormalizedProp = export type NormalizedProps = Record export type NormalizedPropsOptions = [NormalizedProps, string[]] | [] +/** + * Used during vnode props normalization to check if the vnode props is the + * attrs object of a component via `Object.getPrototypeOf`. This is more + * performant than defining a non-enumerable property. + */ +export const attrsProto = {} + export function initProps( instance: ComponentInternalInstance, rawProps: Data | null, @@ -194,8 +199,7 @@ export function initProps( isSSR = false, ) { const props: Data = {} - const attrs: Data = {} - def(attrs, InternalObjectKey, 1) + const attrs: Data = Object.create(attrsProto) instance.propsDefaults = Object.create(null) @@ -361,7 +365,7 @@ export function updateProps( // trigger updates for $attrs in case it's used in component slots if (hasAttrsChanged) { - trigger(instance, TriggerOpTypes.SET, '$attrs') + trigger(instance.attrs, TriggerOpTypes.SET, '') } if (__DEV__) { diff --git a/packages/runtime-core/src/componentPublicInstance.ts b/packages/runtime-core/src/componentPublicInstance.ts index a0dcab201..ce584976d 100644 --- a/packages/runtime-core/src/componentPublicInstance.ts +++ b/packages/runtime-core/src/componentPublicInstance.ts @@ -23,6 +23,7 @@ import { isString, } from '@vue/shared' import { + ReactiveFlags, type ShallowUnwrapRef, TrackOpTypes, type UnwrapNestedRefs, @@ -306,6 +307,10 @@ const hasSetupBinding = (state: Data, key: string) => export const PublicInstanceProxyHandlers: ProxyHandler = { get({ _: instance }: ComponentRenderContext, key: string) { + if (key === ReactiveFlags.SKIP) { + return true + } + const { ctx, setupState, data, props, accessCache, type, appContext } = instance diff --git a/packages/runtime-core/src/componentSlots.ts b/packages/runtime-core/src/componentSlots.ts index 61e1ecc07..e0f051b39 100644 --- a/packages/runtime-core/src/componentSlots.ts +++ b/packages/runtime-core/src/componentSlots.ts @@ -1,6 +1,5 @@ import { type ComponentInternalInstance, currentInstance } from './component' import { - InternalObjectKey, type VNode, type VNodeChild, type VNodeNormalizedChildren, @@ -174,7 +173,7 @@ export const initSlots = ( // we should avoid the proxy object polluting the slots of the internal instance instance.slots = toRaw(children as InternalSlots) // make compiler marker non-enumerable - def(children as InternalSlots, '_', type) + def(instance.slots, '_', type) } else { normalizeObjectSlots( children as RawSlots, @@ -188,7 +187,6 @@ export const initSlots = ( normalizeVNodeSlots(instance, children) } } - def(instance.slots, InternalObjectKey, 1) } export const updateSlots = ( diff --git a/packages/runtime-core/src/components/KeepAlive.ts b/packages/runtime-core/src/components/KeepAlive.ts index db6088cf5..7697096bc 100644 --- a/packages/runtime-core/src/components/KeepAlive.ts +++ b/packages/runtime-core/src/components/KeepAlive.ts @@ -254,7 +254,7 @@ const KeepAliveImpl: ComponentOptions = { pendingCacheKey = null if (!slots.default) { - return null + return (current = null) } const children = slots.default() diff --git a/packages/runtime-core/src/errorHandling.ts b/packages/runtime-core/src/errorHandling.ts index 228691569..9f6e2ded3 100644 --- a/packages/runtime-core/src/errorHandling.ts +++ b/packages/runtime-core/src/errorHandling.ts @@ -1,7 +1,8 @@ +import { pauseTracking, resetTracking } from '@vue/reactivity' import type { VNode } from './vnode' import type { ComponentInternalInstance } from './component' import { popWarningContext, pushWarningContext, warn } from './warning' -import { isFunction, isPromise } from '@vue/shared' +import { isArray, isFunction, isPromise } from '@vue/shared' import { LifecycleHooks } from './enums' import { BaseWatchErrorCodes } from '@vue/reactivity' @@ -82,7 +83,7 @@ export function callWithAsyncErrorHandling( instance: ComponentInternalInstance | null, type: ErrorTypes, args?: unknown[], -): any[] { +): any { if (isFunction(fn)) { const res = callWithErrorHandling(fn, instance, type, args) if (res && isPromise(res)) { @@ -93,11 +94,17 @@ export function callWithAsyncErrorHandling( return res } - const values = [] - for (let i = 0; i < fn.length; i++) { - values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)) + if (isArray(fn)) { + const values = [] + for (let i = 0; i < fn.length; i++) { + values.push(callWithAsyncErrorHandling(fn[i], instance, type, args)) + } + return values + } else if (__DEV__) { + warn( + `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`, + ) } - return values } export function handleError( @@ -131,12 +138,14 @@ export function handleError( // app-level handling const appErrorHandler = instance.appContext.config.errorHandler if (appErrorHandler) { + pauseTracking() callWithErrorHandling( appErrorHandler, null, ErrorCodes.APP_ERROR_HANDLER, [err, exposedInstance, errorInfo], ) + resetTracking() return } } diff --git a/packages/runtime-core/src/hydration.ts b/packages/runtime-core/src/hydration.ts index de02ae46d..a7832ac3d 100644 --- a/packages/runtime-core/src/hydration.ts +++ b/packages/runtime-core/src/hydration.ts @@ -120,6 +120,7 @@ export function createHydrationFunctions( slotScopeIds: string[] | null, optimized = false, ): Node | null => { + optimized = optimized || !!vnode.dynamicChildren const isFragmentStart = isComment(node) && node.data === '[' const onMismatch = () => handleMismatch( @@ -443,6 +444,7 @@ export function createHydrationFunctions( if (props) { if ( __DEV__ || + __FEATURE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (PatchFlags.FULL_PROPS | PatchFlags.NEED_HYDRATION) @@ -450,7 +452,7 @@ export function createHydrationFunctions( for (const key in props) { // check hydration mismatch if ( - __DEV__ && + (__DEV__ || __FEATURE_PROD_HYDRATION_MISMATCH_DETAILS__) && propHasMismatch(el, key, props[key], vnode, parentComponent) ) { hasMismatch = true diff --git a/packages/runtime-core/src/vnode.ts b/packages/runtime-core/src/vnode.ts index ac283ad01..fb2d653cb 100644 --- a/packages/runtime-core/src/vnode.ts +++ b/packages/runtime-core/src/vnode.ts @@ -55,6 +55,7 @@ import { convertLegacyVModelProps } from './compat/componentVModel' import { defineLegacyVNodeProperties } from './compat/renderFn' import { ErrorCodes, callWithAsyncErrorHandling } from './errorHandling' import type { ComponentPublicInstance } from './componentPublicInstance' +import { attrsProto } from './componentProps' export const Fragment = Symbol.for('v-fgt') as any as { __isFragment: true @@ -404,8 +405,6 @@ const createVNodeWithArgsTransform = ( ) } -export const InternalObjectKey = `__vInternal` - const normalizeKey = ({ key }: VNodeProps): VNode['key'] => key != null ? key : null @@ -618,7 +617,7 @@ function _createVNode( export function guardReactiveProps(props: (Data & VNodeProps) | null) { if (!props) return null - return isProxy(props) || InternalObjectKey in props + return isProxy(props) || Object.getPrototypeOf(props) === attrsProto ? extend({}, props) : props } @@ -792,7 +791,7 @@ export function normalizeChildren(vnode: VNode, children: unknown) { } else { type = ShapeFlags.SLOTS_CHILDREN const slotFlag = (children as RawSlots)._ - if (!slotFlag && !(InternalObjectKey in children!)) { + if (!slotFlag) { // if slots are not normalized, attach context instance // (compiled / normalized slots already have context) ;(children as RawSlots)._ctx = currentRenderingInstance diff --git a/packages/runtime-dom/__tests__/customElement.spec.ts b/packages/runtime-dom/__tests__/customElement.spec.ts index bb08fb155..fb746f72c 100644 --- a/packages/runtime-dom/__tests__/customElement.spec.ts +++ b/packages/runtime-dom/__tests__/customElement.spec.ts @@ -139,6 +139,12 @@ describe('defineCustomElement', () => { expect(e.shadowRoot!.innerHTML).toBe('
two
') expect(e.hasAttribute('foo')).toBe(false) + e.foo = undefined + await nextTick() + expect(e.shadowRoot!.innerHTML).toBe('
two
') + expect(e.hasAttribute('foo')).toBe(false) + expect(e.foo).toBe(undefined) + e.bazQux = 'four' await nextTick() expect(e.shadowRoot!.innerHTML).toBe('
four
') diff --git a/packages/runtime-dom/__tests__/directives/vModel.spec.ts b/packages/runtime-dom/__tests__/directives/vModel.spec.ts index 6cc7b53e2..66b57b689 100644 --- a/packages/runtime-dom/__tests__/directives/vModel.spec.ts +++ b/packages/runtime-dom/__tests__/directives/vModel.spec.ts @@ -1237,4 +1237,73 @@ describe('vModel', () => { await nextTick() expect(data.value).toEqual('使用拼音输入') }) + + it('multiple select (model is number, option value is string)', async () => { + const component = defineComponent({ + data() { + return { + value: [1, 2], + } + }, + render() { + return [ + withVModel( + h( + 'select', + { + multiple: true, + 'onUpdate:modelValue': setValue.bind(this), + }, + [h('option', { value: '1' }), h('option', { value: '2' })], + ), + this.value, + ), + ] + }, + }) + render(h(component), root) + + await nextTick() + const [foo, bar] = root.querySelectorAll('option') + + expect(foo.selected).toEqual(true) + expect(bar.selected).toEqual(true) + }) + + // #10503 + test('equal value with a leading 0 should trigger update.', async () => { + const setNum = function (this: any, value: any) { + this.num = value + } + const component = defineComponent({ + data() { + return { num: 0 } + }, + render() { + return [ + withVModel( + h('input', { + id: 'input_num1', + type: 'number', + 'onUpdate:modelValue': setNum.bind(this), + }), + this.num, + ), + ] + }, + }) + + render(h(component), root) + const data = root._vnode.component.data + + const inputNum1 = root.querySelector('#input_num1')! + expect(inputNum1.value).toBe('0') + + inputNum1.value = '01' + triggerEvent('input', inputNum1) + await nextTick() + expect(data.num).toBe(1) + + expect(inputNum1.value).toBe('1') + }) }) diff --git a/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts b/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts index e26b9dfb4..9f860a5e3 100644 --- a/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts +++ b/packages/runtime-dom/__tests__/helpers/useCssVars.spec.ts @@ -118,6 +118,63 @@ describe('useCssVars', () => { } }) + test('with v-if & async component & suspense', async () => { + const state = reactive({ color: 'red' }) + const root = document.createElement('div') + const show = ref(false) + let resolveAsync: any + let asyncPromise: any + + const AsyncComp = { + setup() { + useCssVars(() => state) + asyncPromise = new Promise(r => { + resolveAsync = () => { + r(() => h('p', 'default')) + } + }) + return asyncPromise + }, + } + + const App = { + setup() { + return () => + h(Suspense, null, { + default: h('div', {}, show.value ? h(AsyncComp) : h('p')), + }) + }, + } + + render(h(App), root) + await nextTick() + // AsyncComp resolve + show.value = true + await nextTick() + resolveAsync() + await asyncPromise.then(() => {}) + // Suspense effects flush + await nextTick() + // css vars use with default tree + for (const c of [].slice.call(root.children as any)) { + expect( + ((c as any).children[0] as HTMLElement).style.getPropertyValue( + `--color`, + ), + ).toBe(`red`) + } + + state.color = 'green' + await nextTick() + for (const c of [].slice.call(root.children as any)) { + expect( + ((c as any).children[0] as HTMLElement).style.getPropertyValue( + `--color`, + ), + ).toBe('green') + } + }) + test('with subTree changed', async () => { const state = reactive({ color: 'red' }) const value = ref(true) diff --git a/packages/runtime-dom/__tests__/patchEvents.spec.ts b/packages/runtime-dom/__tests__/patchEvents.spec.ts index 1b08f85ca..f70bf327a 100644 --- a/packages/runtime-dom/__tests__/patchEvents.spec.ts +++ b/packages/runtime-dom/__tests__/patchEvents.spec.ts @@ -192,4 +192,14 @@ describe(`runtime-dom: events patching`, () => { testElement.dispatchEvent(new CustomEvent('foobar')) expect(fn2).toHaveBeenCalledTimes(1) }) + + it('handles an unknown type', () => { + const el = document.createElement('div') + patchProp(el, 'onClick', null, 'test') + el.dispatchEvent(new Event('click')) + expect( + `Wrong type passed as event handler to onClick - did you forget @ or : ` + + `in front of your prop?\nExpected function or array of functions, received type string.`, + ).toHaveBeenWarned() + }) }) diff --git a/packages/runtime-dom/package.json b/packages/runtime-dom/package.json index 591cae2be..a26f2e406 100644 --- a/packages/runtime-dom/package.json +++ b/packages/runtime-dom/package.json @@ -1,6 +1,6 @@ { "name": "@vue/runtime-dom", - "version": "3.4.21", + "version": "3.4.22", "description": "@vue/runtime-dom", "main": "index.js", "module": "dist/runtime-dom.esm-bundler.js", diff --git a/packages/runtime-dom/src/apiCustomElement.ts b/packages/runtime-dom/src/apiCustomElement.ts index 337a3d90f..01ce2bad4 100644 --- a/packages/runtime-dom/src/apiCustomElement.ts +++ b/packages/runtime-dom/src/apiCustomElement.ts @@ -313,7 +313,7 @@ export class VueElement extends BaseClass { } protected _setAttr(key: string) { - let value = this.getAttribute(key) + let value = this.hasAttribute(key) ? this.getAttribute(key) : undefined const camelKey = camelize(key) if (this._numberProps && this._numberProps[camelKey]) { value = toNumber(value) diff --git a/packages/runtime-dom/src/components/TransitionGroup.ts b/packages/runtime-dom/src/components/TransitionGroup.ts index f98e82b27..763b7a98b 100644 --- a/packages/runtime-dom/src/components/TransitionGroup.ts +++ b/packages/runtime-dom/src/components/TransitionGroup.ts @@ -112,7 +112,29 @@ const TransitionGroupImpl: ComponentOptions = { tag = 'span' } - prevChildren = children + prevChildren = [] + if (children) { + for (let i = 0; i < children.length; i++) { + const child = children[i] + if (child.el && child.el instanceof Element) { + prevChildren.push(child) + setTransitionHooks( + child, + resolveTransitionHooks( + child, + cssTransitionProps, + state, + instance, + ), + ) + positionMap.set( + child, + (child.el as Element).getBoundingClientRect(), + ) + } + } + } + children = slots.default ? getTransitionRawChildren(slots.default()) : [] for (let i = 0; i < children.length; i++) { @@ -127,17 +149,6 @@ const TransitionGroupImpl: ComponentOptions = { } } - if (prevChildren) { - for (let i = 0; i < prevChildren.length; i++) { - const child = prevChildren[i] - setTransitionHooks( - child, - resolveTransitionHooks(child, cssTransitionProps, state, instance), - ) - positionMap.set(child, (child.el as Element).getBoundingClientRect()) - } - } - return createVNode(tag, null, children) } }, diff --git a/packages/runtime-dom/src/directives/vModel.ts b/packages/runtime-dom/src/directives/vModel.ts index 9e94810d8..b0ea41728 100644 --- a/packages/runtime-dom/src/directives/vModel.ts +++ b/packages/runtime-dom/src/directives/vModel.ts @@ -86,9 +86,10 @@ export const vModelText: ModelDirective< el[assignKey] = getModelAssigner(vnode) // avoid clearing unresolved text. #2302 if ((el as any).composing) return - const elValue = - number || el.type === 'number' ? looseToNumber(el.value) : el.value + (number || el.type === 'number') && !/^0\d/.test(el.value) + ? looseToNumber(el.value) + : el.value const newValue = value == null ? '' : value if (elValue === newValue) { @@ -242,9 +243,7 @@ function setSelected(el: HTMLSelectElement, value: any, number: boolean) { const optionType = typeof optionValue // fast path for string / number values if (optionType === 'string' || optionType === 'number') { - option.selected = value.includes( - number ? looseToNumber(optionValue) : optionValue, - ) + option.selected = value.some(v => String(v) === String(optionValue)) } else { option.selected = looseIndexOf(value, optionValue) > -1 } diff --git a/packages/runtime-dom/src/helpers/useCssVars.ts b/packages/runtime-dom/src/helpers/useCssVars.ts index 1666e3cb3..286a41760 100644 --- a/packages/runtime-dom/src/helpers/useCssVars.ts +++ b/packages/runtime-dom/src/helpers/useCssVars.ts @@ -42,9 +42,8 @@ export function useCssVars(getter: (ctx: any) => Record) { updateTeleports(vars) } - watchPostEffect(setVars) - onMounted(() => { + watchPostEffect(setVars) const ob = new MutationObserver(setVars) ob.observe(instance.subTree.el!.parentNode, { childList: true }) onUnmounted(() => ob.disconnect()) diff --git a/packages/runtime-dom/src/modules/events.ts b/packages/runtime-dom/src/modules/events.ts index 0335b6be0..fd049a88f 100644 --- a/packages/runtime-dom/src/modules/events.ts +++ b/packages/runtime-dom/src/modules/events.ts @@ -1,8 +1,9 @@ -import { hyphenate, isArray } from '@vue/shared' +import { NOOP, hyphenate, isArray, isFunction } from '@vue/shared' import { type ComponentInternalInstance, ErrorCodes, callWithAsyncErrorHandling, + warn, } from '@vue/runtime-core' interface Invoker extends EventListener { @@ -36,7 +37,7 @@ export function patchEvent( el: Element & { [veiKey]?: Record }, rawName: string, prevValue: EventValue | null, - nextValue: EventValue | null, + nextValue: EventValue | unknown, instance: ComponentInternalInstance | null = null, ) { // vei = vue event invokers @@ -44,12 +45,19 @@ export function patchEvent( const existingInvoker = invokers[rawName] if (nextValue && existingInvoker) { // patch - existingInvoker.value = nextValue + existingInvoker.value = __DEV__ + ? sanitizeEventValue(nextValue, rawName) + : (nextValue as EventValue) } else { const [name, options] = parseName(rawName) if (nextValue) { // add - const invoker = (invokers[rawName] = createInvoker(nextValue, instance)) + const invoker = (invokers[rawName] = createInvoker( + __DEV__ + ? sanitizeEventValue(nextValue, rawName) + : (nextValue as EventValue), + instance, + )) addEventListener(el, name, invoker, options) } else if (existingInvoker) { // remove @@ -116,6 +124,17 @@ function createInvoker( return invoker } +function sanitizeEventValue(value: unknown, propName: string): EventValue { + if (isFunction(value) || isArray(value)) { + return value as EventValue + } + warn( + `Wrong type passed as event handler to ${propName} - did you forget @ or : ` + + `in front of your prop?\nExpected function or array of functions, received type ${typeof value}.`, + ) + return NOOP +} + function patchStopImmediatePropagation( e: Event, value: EventValue, @@ -126,7 +145,9 @@ function patchStopImmediatePropagation( originalStop.call(e) ;(e as any)._stopped = true } - return value.map(fn => (e: Event) => !(e as any)._stopped && fn && fn(e)) + return (value as Function[]).map( + fn => (e: Event) => !(e as any)._stopped && fn && fn(e), + ) } else { return value } diff --git a/packages/server-renderer/package.json b/packages/server-renderer/package.json index 71552fd5f..130c7bd2a 100644 --- a/packages/server-renderer/package.json +++ b/packages/server-renderer/package.json @@ -1,6 +1,6 @@ { "name": "@vue/server-renderer", - "version": "3.4.21", + "version": "3.4.22", "description": "@vue/server-renderer", "main": "index.js", "module": "dist/server-renderer.esm-bundler.js", diff --git a/packages/sfc-playground/package.json b/packages/sfc-playground/package.json index 6ccd3dd23..22d6fd4bc 100644 --- a/packages/sfc-playground/package.json +++ b/packages/sfc-playground/package.json @@ -10,7 +10,7 @@ }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", - "vite": "^5.1.5" + "vite": "^5.2.7" }, "dependencies": { "@vue/repl": "^4.1.1", diff --git a/packages/sfc-playground/src/download/template/package.json b/packages/sfc-playground/src/download/template/package.json index d84b9893b..d3429db9c 100644 --- a/packages/sfc-playground/src/download/template/package.json +++ b/packages/sfc-playground/src/download/template/package.json @@ -12,6 +12,6 @@ }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.4", - "vite": "^5.1.5" + "vite": "^5.2.7" } } diff --git a/packages/sfc-playground/src/vue-dev-proxy-prod.ts b/packages/sfc-playground/src/vue-dev-proxy-prod.ts index c20c51579..3b2faf195 100644 --- a/packages/sfc-playground/src/vue-dev-proxy-prod.ts +++ b/packages/sfc-playground/src/vue-dev-proxy-prod.ts @@ -1,3 +1,2 @@ // serve vue to the iframe sandbox during dev. -// @ts-expect-error export * from 'vue/dist/vue.runtime.esm-browser.prod.js' diff --git a/packages/shared/package.json b/packages/shared/package.json index 261e7e320..6cfe90387 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@vue/shared", - "version": "3.4.21", + "version": "3.4.22", "description": "internal utils shared across @vue packages", "main": "index.js", "module": "dist/shared.esm-bundler.js", diff --git a/packages/shared/src/general.ts b/packages/shared/src/general.ts index 06470fc6a..71b29b8e0 100644 --- a/packages/shared/src/general.ts +++ b/packages/shared/src/general.ts @@ -172,6 +172,9 @@ export const toNumber = (val: any): any => { return isNaN(n) ? val : n } +// for typeof global checks without @types/node +declare var global: {} + let _globalThis: any export const getGlobalThis = (): any => { return ( diff --git a/packages/shared/src/toDisplayString.ts b/packages/shared/src/toDisplayString.ts index aff107cd9..b63cb4112 100644 --- a/packages/shared/src/toDisplayString.ts +++ b/packages/shared/src/toDisplayString.ts @@ -54,4 +54,6 @@ const replacer = (_key: string, val: any): any => { } const stringifySymbol = (v: unknown, i: number | string = ''): any => - isSymbol(v) ? `Symbol(${v.description ?? i})` : v + // Symbol.description in es2019+ so we need to cast here to pass + // the lib: es2016 check + isSymbol(v) ? `Symbol(${(v as any).description ?? i})` : v diff --git a/packages/template-explorer/package.json b/packages/template-explorer/package.json index fd4e70f1f..3c4264d78 100644 --- a/packages/template-explorer/package.json +++ b/packages/template-explorer/package.json @@ -12,7 +12,7 @@ }, "dependencies": { "@vue/compiler-vapor": "workspace:^", - "monaco-editor": "^0.46.0", - "source-map-js": "^1.0.2" + "monaco-editor": "^0.47.0", + "source-map-js": "^1.2.0" } } diff --git a/packages/vue-compat/__tests__/instance.spec.ts b/packages/vue-compat/__tests__/instance.spec.ts index 63ce55812..1feccabd8 100644 --- a/packages/vue-compat/__tests__/instance.spec.ts +++ b/packages/vue-compat/__tests__/instance.spec.ts @@ -14,6 +14,7 @@ beforeEach(() => { Vue.configureCompat({ MODE: 2, GLOBAL_MOUNT: 'suppress-warning', + PRIVATE_APIS: 'suppress-warning', }) }) @@ -331,3 +332,43 @@ test('INSTANCE_ATTR_CLASS_STYLE', () => { )('Anonymous'), ).toHaveBeenWarned() }) + +test('$options mutation', () => { + const Comp = { + props: ['id'], + template: '
', + data() { + return { + foo: '', + } + }, + created(this: any) { + expect(this.$options.parent).toBeDefined() + expect(this.$options.test).toBeUndefined() + this.$options.test = this.id + expect(this.$options.test).toBe(this.id) + }, + } + + new Vue({ + template: `
`, + components: { Comp }, + }).$mount() +}) + +test('other private APIs', () => { + new Vue({ + created() { + expect(this.$createElement).toBeTruthy() + }, + }) + + new Vue({ + compatConfig: { + PRIVATE_APIS: false, + }, + created() { + expect(this.$createElement).toBeUndefined() + }, + }) +}) diff --git a/packages/vue-compat/package.json b/packages/vue-compat/package.json index 1dbe63a8c..4c64ffa5d 100644 --- a/packages/vue-compat/package.json +++ b/packages/vue-compat/package.json @@ -1,6 +1,6 @@ { "name": "@vue/compat", - "version": "3.4.21", + "version": "3.4.22", "description": "Vue 3 compatibility build for Vue 2", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", @@ -52,9 +52,9 @@ }, "homepage": "https://github.com/vuejs/core-vapor/tree/main/packages/vue-compat#readme", "dependencies": { - "@babel/parser": "^7.24.0", + "@babel/parser": "^7.24.1", "estree-walker": "^2.0.2", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "peerDependencies": { "vue": "workspace:*" diff --git a/packages/vue/__tests__/e2e/TransitionGroup.spec.ts b/packages/vue/__tests__/e2e/TransitionGroup.spec.ts index febc9d3c2..da3f4a42d 100644 --- a/packages/vue/__tests__/e2e/TransitionGroup.spec.ts +++ b/packages/vue/__tests__/e2e/TransitionGroup.spec.ts @@ -508,4 +508,126 @@ describe('e2e: TransitionGroup', () => { expect(` children must be keyed`).toHaveBeenWarned() }) + + // #5168, #7898, #9067 + test( + 'avoid set transition hooks for comment node', + async () => { + await page().evaluate(duration => { + const { createApp, ref, h, createCommentVNode } = (window as any).Vue + + const show = ref(false) + createApp({ + template: ` +
+ +
{{item}}
+ +
+
+ + `, + components: { + Child: { + setup() { + return () => + show.value + ? h('div', { class: 'test' }, 'child') + : createCommentVNode('v-if', true) + }, + }, + }, + setup: () => { + const items = ref([]) + const click = () => { + items.value = ['a', 'b', 'c'] + setTimeout(() => { + show.value = true + }, duration) + } + return { click, items } + }, + }).mount('#app') + }, duration) + + expect(await html('#container')).toBe(``) + + expect(await htmlWhenTransitionStart()).toBe( + `
a
` + + `
b
` + + `
c
` + + ``, + ) + + await transitionFinish(duration) + await nextFrame() + expect(await html('#container')).toBe( + `
a
` + + `
b
` + + `
c
` + + `
child
`, + ) + + await transitionFinish(duration) + expect(await html('#container')).toBe( + `
a
` + + `
b
` + + `
c
` + + `
child
`, + ) + }, + E2E_TIMEOUT, + ) + + // #4621, #4622, #5153 + test( + 'avoid set transition hooks for text node', + async () => { + await page().evaluate(() => { + const { createApp, ref } = (window as any).Vue + const app = createApp({ + template: ` +
+ +
foo
+
bar
+
+
+ + `, + setup: () => { + const show = ref(false) + const click = () => { + show.value = true + } + return { show, click } + }, + }) + + app.config.compilerOptions.whitespace = 'preserve' + app.mount('#app') + }) + + expect(await html('#container')).toBe(`
foo
` + ` `) + + expect(await htmlWhenTransitionStart()).toBe( + `
foo
` + + ` ` + + `
bar
`, + ) + + await nextFrame() + expect(await html('#container')).toBe( + `
foo
` + + ` ` + + `
bar
`, + ) + + await transitionFinish(duration) + expect(await html('#container')).toBe( + `
foo
` + ` ` + `
bar
`, + ) + }, + E2E_TIMEOUT, + ) }) diff --git a/packages/vue/package.json b/packages/vue/package.json index 2ecae6cfe..45c47bd1b 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "vue", - "version": "3.4.21", + "version": "3.4.22", "description": "The progressive JavaScript framework for building modern web UI.", "main": "index.js", "module": "dist/vue.runtime.esm-bundler.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index edbdfa2b7..fd830115a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,32 +9,32 @@ importers: .: devDependencies: '@babel/parser': - specifier: ^7.24.0 - version: 7.24.0 + specifier: ^7.24.1 + version: 7.24.4 '@babel/types': specifier: ^7.24.0 version: 7.24.0 '@codspeed/vitest-plugin': - specifier: ^2.3.1 - version: 2.3.1(vite@5.1.6)(vitest@1.3.1) + specifier: ^3.1.0 + version: 3.1.0(vite@5.2.9)(vitest@1.5.0) '@rollup/plugin-alias': specifier: ^5.1.0 - version: 5.1.0(rollup@4.13.0) + version: 5.1.0(rollup@4.14.3) '@rollup/plugin-commonjs': specifier: ^25.0.7 - version: 25.0.7(rollup@4.13.0) + version: 25.0.7(rollup@4.14.3) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.13.0) + version: 6.1.0(rollup@4.14.3) '@rollup/plugin-node-resolve': specifier: ^15.2.3 - version: 15.2.3(rollup@4.13.0) + version: 15.2.3(rollup@4.14.3) '@rollup/plugin-replace': specifier: 5.0.4 - version: 5.0.4(rollup@4.13.0) + version: 5.0.4(rollup@4.14.3) '@rollup/plugin-terser': specifier: ^0.4.4 - version: 0.4.4(rollup@4.13.0) + version: 0.4.4(rollup@4.14.3) '@types/hash-sum': specifier: ^1.0.2 version: 1.0.2 @@ -42,23 +42,23 @@ importers: specifier: ^1.2.5 version: 1.2.5 '@types/node': - specifier: ^20.11.25 - version: 20.11.27 + specifier: ^20.12.5 + version: 20.12.7 '@types/semver': specifier: ^7.5.8 version: 7.5.8 '@typescript-eslint/eslint-plugin': - specifier: ^7.1.1 - version: 7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.2.2) + specifier: ^7.4.0 + version: 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': - specifier: ^7.1.1 - version: 7.2.0(eslint@8.57.0)(typescript@5.2.2) + specifier: ^7.4.0 + version: 7.7.0(eslint@8.57.0)(typescript@5.4.5) '@vitest/coverage-istanbul': - specifier: ^1.3.1 - version: 1.3.1(vitest@1.3.1) + specifier: ^1.4.0 + version: 1.5.0(vitest@1.5.0) '@vitest/ui': - specifier: ^1.2.2 - version: 1.2.2(vitest@1.3.1) + specifier: ^1.4.0 + version: 1.5.0(vitest@1.5.0) '@vue/consolidate': specifier: 1.0.0 version: 1.0.0 @@ -69,11 +69,11 @@ importers: specifier: ^2.4.1 version: 2.4.1 esbuild: - specifier: ^0.20.1 - version: 0.20.1 + specifier: ^0.20.2 + version: 0.20.2 esbuild-plugin-polyfill-node: specifier: ^0.3.0 - version: 0.3.0(esbuild@0.20.1) + version: 0.3.0(esbuild@0.20.2) eslint: specifier: ^8.57.0 version: 8.57.0 @@ -82,10 +82,10 @@ importers: version: 2.1.0 eslint-plugin-import: specifier: npm:eslint-plugin-i@^2.29.1 - version: /eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.2.0)(eslint@8.57.0) + version: /eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.7.0)(eslint@8.57.0) eslint-plugin-jest: specifier: ^27.9.0 - version: 27.9.0(@typescript-eslint/eslint-plugin@7.2.0)(eslint@8.57.0)(typescript@5.2.2) + version: 27.9.0(@typescript-eslint/eslint-plugin@7.7.0)(eslint@8.57.0)(typescript@5.4.5) estree-walker: specifier: ^2.0.2 version: 2.0.2 @@ -129,23 +129,23 @@ importers: specifier: ^3.0.2 version: 3.0.2 puppeteer: - specifier: ~22.4.1 - version: 22.4.1(typescript@5.2.2) + specifier: ~22.6.3 + version: 22.6.5(typescript@5.4.5) rimraf: specifier: ^5.0.5 version: 5.0.5 rollup: - specifier: ^4.12.1 - version: 4.13.0 + specifier: ^4.13.2 + version: 4.14.3 rollup-plugin-dts: specifier: ^6.1.0 - version: 6.1.0(rollup@4.13.0)(typescript@5.2.2) + version: 6.1.0(rollup@4.14.3)(typescript@5.4.5) rollup-plugin-esbuild: specifier: ^6.1.1 - version: 6.1.1(esbuild@0.20.1)(rollup@4.13.0) + version: 6.1.1(esbuild@0.20.2)(rollup@4.14.3) rollup-plugin-polyfill-node: specifier: ^0.13.0 - version: 0.13.0(rollup@4.13.0) + version: 0.13.0(rollup@4.14.3) semver: specifier: ^7.6.0 version: 7.6.0 @@ -153,11 +153,11 @@ importers: specifier: ^14.2.1 version: 14.2.1 simple-git-hooks: - specifier: ^2.10.0 - version: 2.10.0 + specifier: ^2.11.1 + version: 2.11.1 terser: - specifier: ^5.29.1 - version: 5.29.1 + specifier: ^5.30.1 + version: 5.30.3 todomvc-app-css: specifier: ^2.4.3 version: 2.4.3 @@ -165,23 +165,23 @@ importers: specifier: ^2.6.2 version: 2.6.2 tsx: - specifier: ^4.7.1 - version: 4.7.1 + specifier: ^4.7.2 + version: 4.7.2 typescript: - specifier: ^5.2.2 - version: 5.2.2 + specifier: ~5.4.5 + version: 5.4.5 vite: - specifier: ^5.1.5 - version: 5.1.6(@types/node@20.11.27)(terser@5.29.1) + specifier: ^5.2.7 + version: 5.2.9(@types/node@20.12.7)(terser@5.30.3) vitest: - specifier: ^1.3.1 - version: 1.3.1(@types/node@20.11.27)(@vitest/ui@1.2.2)(jsdom@24.0.0)(terser@5.29.1) + specifier: ^1.4.0 + version: 1.5.0(@types/node@20.12.7)(@vitest/ui@1.5.0)(jsdom@24.0.0)(terser@5.30.3) packages/compiler-core: dependencies: '@babel/parser': - specifier: ^7.24.0 - version: 7.24.0 + specifier: ^7.24.1 + version: 7.24.4 '@vue/shared': specifier: workspace:* version: link:../shared @@ -192,8 +192,8 @@ importers: specifier: ^2.0.2 version: 2.0.2 source-map-js: - specifier: ^1.0.2 - version: 1.0.2 + specifier: ^1.2.0 + version: 1.2.0 devDependencies: '@babel/types': specifier: ^7.24.0 @@ -211,8 +211,8 @@ importers: packages/compiler-sfc: dependencies: '@babel/parser': - specifier: ^7.24.0 - version: 7.24.0 + specifier: ^7.24.1 + version: 7.24.4 '@vue/compiler-core': specifier: workspace:* version: link:../compiler-core @@ -235,11 +235,11 @@ importers: specifier: ^0.30.8 version: 0.30.8 postcss: - specifier: ^8.4.35 - version: 8.4.35 + specifier: ^8.4.38 + version: 8.4.38 source-map-js: - specifier: ^1.0.2 - version: 1.0.2 + specifier: ^1.2.0 + version: 1.2.0 devDependencies: '@babel/types': specifier: ^7.24.0 @@ -257,20 +257,20 @@ importers: specifier: ^1.1.0 version: 1.1.0 minimatch: - specifier: ^9.0.3 - version: 9.0.3 + specifier: ^9.0.4 + version: 9.0.4 postcss-modules: specifier: ^6.0.0 - version: 6.0.0(postcss@8.4.35) + version: 6.0.0(postcss@8.4.38) postcss-selector-parser: - specifier: ^6.0.15 - version: 6.0.15 + specifier: ^6.0.16 + version: 6.0.16 pug: specifier: ^3.0.2 version: 3.0.2 sass: - specifier: ^1.71.1 - version: 1.71.1 + specifier: ^1.74.1 + version: 1.75.0 packages/compiler-ssr: dependencies: @@ -391,10 +391,10 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.0.4(vite@5.1.6)(vue@packages+vue) + version: 5.0.4(vite@5.2.9)(vue@packages+vue) vite: - specifier: ^5.1.5 - version: 5.1.6(@types/node@20.11.27)(terser@5.29.1) + specifier: ^5.2.7 + version: 5.2.9(@types/node@20.12.7)(terser@5.30.3) packages/shared: {} @@ -404,11 +404,11 @@ importers: specifier: workspace:^ version: link:../compiler-vapor monaco-editor: - specifier: ^0.46.0 - version: 0.46.0 + specifier: ^0.47.0 + version: 0.47.0 source-map-js: - specifier: ^1.0.2 - version: 1.0.2 + specifier: ^1.2.0 + version: 1.2.0 packages/vue: dependencies: @@ -437,14 +437,14 @@ importers: packages/vue-compat: dependencies: '@babel/parser': - specifier: ^7.24.0 - version: 7.24.0 + specifier: ^7.24.1 + version: 7.24.4 estree-walker: specifier: ^2.0.2 version: 2.0.2 source-map-js: - specifier: ^1.0.2 - version: 1.0.2 + specifier: ^1.2.0 + version: 1.2.0 vue: specifier: workspace:* version: link:../vue @@ -472,13 +472,13 @@ importers: version: /@vue-vapor/vite-plugin-vue@0.0.0-alpha.4(vite@5.0.12)(vue@packages+vue) vite: specifier: ^5.0.12 - version: 5.0.12(@types/node@20.11.27)(terser@5.29.1) + version: 5.0.12(@types/node@20.12.7)(terser@5.30.3) vite-hyper-config: specifier: ^0.2.1 - version: 0.2.1(@types/node@20.11.27)(terser@5.29.1)(vite@5.0.12) + version: 0.2.1(@types/node@20.12.7)(terser@5.30.3)(vite@5.0.12) vite-plugin-inspect: specifier: ^0.7.42 - version: 0.7.42(rollup@4.13.0)(vite@5.0.12) + version: 0.7.42(rollup@4.14.3)(vite@5.0.12) packages: @@ -523,7 +523,7 @@ packages: '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.3) '@babel/helpers': 7.23.2 - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.4 '@babel/template': 7.22.15 '@babel/traverse': 7.23.3 '@babel/types': 7.24.0 @@ -647,8 +647,8 @@ packages: js-tokens: 4.0.0 dev: true - /@babel/parser@7.24.0: - resolution: {integrity: sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==} + /@babel/parser@7.24.4: + resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: @@ -659,7 +659,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 dev: true @@ -673,7 +673,7 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 debug: 4.3.4 globals: 11.12.0 @@ -689,22 +689,28 @@ packages: '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 - /@codspeed/core@2.3.1: - resolution: {integrity: sha512-7KRwBX4iXK33gEQwh8jPWBF9srGIjewm3oc+A/66caiG/aOyHmxJCapjAZxT2f2vIVYqR7CghzqlxY2ik0DNBg==} + /@codspeed/core@3.1.0: + resolution: {integrity: sha512-oYd7X46QhnRkgRbZkqAoX9i3Fwm17FpunK4Ee5RdrvRYR0Xr93ewH8/O5g6uyTPDOOqDEv1v2KRYtWhVgN+2VQ==} dependencies: + axios: 1.6.8 find-up: 6.3.0 + form-data: 4.0.0 node-gyp-build: 4.7.1 + transitivePeerDependencies: + - debug dev: true - /@codspeed/vitest-plugin@2.3.1(vite@5.1.6)(vitest@1.3.1): - resolution: {integrity: sha512-/e4G2B/onX/hG/EjUU/NpDxnIryeTDamVRTBeWfgQDoex3g7GDzTwoQktaU5l/Asw3ZjEErQg+oQVToQ6jYZlA==} + /@codspeed/vitest-plugin@3.1.0(vite@5.2.9)(vitest@1.5.0): + resolution: {integrity: sha512-ms11tUytiQTgB+idxZRUuCUQfgz4LaKTDJCLYm5VTSpOCUU7D5+QWvJnA8X8B9glPfR5siIK8RxrnZP4yuysKQ==} peerDependencies: vite: ^4.2.0 || ^5.0.0 - vitest: '>=1.0.0-beta.4 || >=1' + vitest: '>=1.2.2' dependencies: - '@codspeed/core': 2.3.1 - vite: 5.1.6(@types/node@20.11.27)(terser@5.29.1) - vitest: 1.3.1(@types/node@20.11.27)(@vitest/ui@1.2.2)(jsdom@24.0.0)(terser@5.29.1) + '@codspeed/core': 3.1.0 + vite: 5.2.9(@types/node@20.12.7)(terser@5.30.3) + vitest: 1.5.0(@types/node@20.12.7)(@vitest/ui@1.5.0)(jsdom@24.0.0)(terser@5.30.3) + transitivePeerDependencies: + - debug dev: true /@esbuild/aix-ppc64@0.19.10: @@ -716,8 +722,8 @@ packages: dev: true optional: true - /@esbuild/aix-ppc64@0.20.1: - resolution: {integrity: sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==} + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} engines: {node: '>=12'} cpu: [ppc64] os: [aix] @@ -734,8 +740,8 @@ packages: dev: true optional: true - /@esbuild/android-arm64@0.20.1: - resolution: {integrity: sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==} + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} engines: {node: '>=12'} cpu: [arm64] os: [android] @@ -752,8 +758,8 @@ packages: dev: true optional: true - /@esbuild/android-arm@0.20.1: - resolution: {integrity: sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==} + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} engines: {node: '>=12'} cpu: [arm] os: [android] @@ -770,8 +776,8 @@ packages: dev: true optional: true - /@esbuild/android-x64@0.20.1: - resolution: {integrity: sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==} + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} engines: {node: '>=12'} cpu: [x64] os: [android] @@ -788,8 +794,8 @@ packages: dev: true optional: true - /@esbuild/darwin-arm64@0.20.1: - resolution: {integrity: sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==} + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} engines: {node: '>=12'} cpu: [arm64] os: [darwin] @@ -806,8 +812,8 @@ packages: dev: true optional: true - /@esbuild/darwin-x64@0.20.1: - resolution: {integrity: sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==} + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} engines: {node: '>=12'} cpu: [x64] os: [darwin] @@ -824,8 +830,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-arm64@0.20.1: - resolution: {integrity: sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==} + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} engines: {node: '>=12'} cpu: [arm64] os: [freebsd] @@ -842,8 +848,8 @@ packages: dev: true optional: true - /@esbuild/freebsd-x64@0.20.1: - resolution: {integrity: sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==} + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} engines: {node: '>=12'} cpu: [x64] os: [freebsd] @@ -860,8 +866,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm64@0.20.1: - resolution: {integrity: sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==} + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} engines: {node: '>=12'} cpu: [arm64] os: [linux] @@ -878,8 +884,8 @@ packages: dev: true optional: true - /@esbuild/linux-arm@0.20.1: - resolution: {integrity: sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==} + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} engines: {node: '>=12'} cpu: [arm] os: [linux] @@ -896,8 +902,8 @@ packages: dev: true optional: true - /@esbuild/linux-ia32@0.20.1: - resolution: {integrity: sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==} + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} engines: {node: '>=12'} cpu: [ia32] os: [linux] @@ -914,8 +920,8 @@ packages: dev: true optional: true - /@esbuild/linux-loong64@0.20.1: - resolution: {integrity: sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==} + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} engines: {node: '>=12'} cpu: [loong64] os: [linux] @@ -932,8 +938,8 @@ packages: dev: true optional: true - /@esbuild/linux-mips64el@0.20.1: - resolution: {integrity: sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==} + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} engines: {node: '>=12'} cpu: [mips64el] os: [linux] @@ -950,8 +956,8 @@ packages: dev: true optional: true - /@esbuild/linux-ppc64@0.20.1: - resolution: {integrity: sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==} + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} engines: {node: '>=12'} cpu: [ppc64] os: [linux] @@ -968,8 +974,8 @@ packages: dev: true optional: true - /@esbuild/linux-riscv64@0.20.1: - resolution: {integrity: sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==} + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} engines: {node: '>=12'} cpu: [riscv64] os: [linux] @@ -986,8 +992,8 @@ packages: dev: true optional: true - /@esbuild/linux-s390x@0.20.1: - resolution: {integrity: sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==} + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} engines: {node: '>=12'} cpu: [s390x] os: [linux] @@ -1004,8 +1010,8 @@ packages: dev: true optional: true - /@esbuild/linux-x64@0.20.1: - resolution: {integrity: sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==} + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} engines: {node: '>=12'} cpu: [x64] os: [linux] @@ -1022,8 +1028,8 @@ packages: dev: true optional: true - /@esbuild/netbsd-x64@0.20.1: - resolution: {integrity: sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==} + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] @@ -1040,8 +1046,8 @@ packages: dev: true optional: true - /@esbuild/openbsd-x64@0.20.1: - resolution: {integrity: sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==} + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] @@ -1058,8 +1064,8 @@ packages: dev: true optional: true - /@esbuild/sunos-x64@0.20.1: - resolution: {integrity: sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==} + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} engines: {node: '>=12'} cpu: [x64] os: [sunos] @@ -1076,8 +1082,8 @@ packages: dev: true optional: true - /@esbuild/win32-arm64@0.20.1: - resolution: {integrity: sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==} + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} engines: {node: '>=12'} cpu: [arm64] os: [win32] @@ -1094,8 +1100,8 @@ packages: dev: true optional: true - /@esbuild/win32-ia32@0.20.1: - resolution: {integrity: sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==} + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} engines: {node: '>=12'} cpu: [ia32] os: [win32] @@ -1112,8 +1118,8 @@ packages: dev: true optional: true - /@esbuild/win32-x64@0.20.1: - resolution: {integrity: sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==} + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} engines: {node: '>=12'} cpu: [x64] os: [win32] @@ -1131,6 +1137,11 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + /@eslint-community/regexpp@4.9.1: resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -1243,6 +1254,13 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /@jspm/core@2.0.1: resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} dev: true @@ -1283,8 +1301,8 @@ packages: resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} dev: true - /@puppeteer/browsers@2.1.0: - resolution: {integrity: sha512-xloWvocjvryHdUjDam/ZuGMh7zn4Sn3ZAaV4Ah2e2EwEt90N3XphZlSsU3n0VDc1F7kggCjMuH0UuxfPQ5mD9w==} + /@puppeteer/browsers@2.2.2: + resolution: {integrity: sha512-hZ/JhxPIceWaGSEzUZp83/8M49CoxlkuThfTR7t4AoCu5+ZvJ3vktLm60Otww2TXeROB5igiZ8D9oPQh6ckBVg==} engines: {node: '>=18'} hasBin: true dependencies: @@ -1300,7 +1318,7 @@ packages: - supports-color dev: true - /@rollup/plugin-alias@5.1.0(rollup@4.13.0): + /@rollup/plugin-alias@5.1.0(rollup@4.14.3): resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1309,11 +1327,11 @@ packages: rollup: optional: true dependencies: - rollup: 4.13.0 + rollup: 4.14.3 slash: 4.0.0 dev: true - /@rollup/plugin-commonjs@25.0.7(rollup@4.13.0): + /@rollup/plugin-commonjs@25.0.7(rollup@4.14.3): resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1322,16 +1340,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.13.0) + '@rollup/pluginutils': 5.0.5(rollup@4.14.3) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.30.8 - rollup: 4.13.0 + rollup: 4.14.3 dev: true - /@rollup/plugin-inject@5.0.5(rollup@4.13.0): + /@rollup/plugin-inject@5.0.5(rollup@4.14.3): resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1340,13 +1358,13 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.13.0) + '@rollup/pluginutils': 5.0.5(rollup@4.14.3) estree-walker: 2.0.2 magic-string: 0.30.8 - rollup: 4.13.0 + rollup: 4.14.3 dev: true - /@rollup/plugin-json@6.1.0(rollup@4.13.0): + /@rollup/plugin-json@6.1.0(rollup@4.14.3): resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1355,11 +1373,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.13.0) - rollup: 4.13.0 + '@rollup/pluginutils': 5.1.0(rollup@4.14.3) + rollup: 4.14.3 dev: true - /@rollup/plugin-node-resolve@15.2.3(rollup@4.13.0): + /@rollup/plugin-node-resolve@15.2.3(rollup@4.14.3): resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1368,16 +1386,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.13.0) + '@rollup/pluginutils': 5.0.5(rollup@4.14.3) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.8 - rollup: 4.13.0 + rollup: 4.14.3 dev: true - /@rollup/plugin-replace@5.0.4(rollup@4.13.0): + /@rollup/plugin-replace@5.0.4(rollup@4.14.3): resolution: {integrity: sha512-E2hmRnlh09K8HGT0rOnnri9OTh+BILGr7NVJGB30S4E3cLRn3J0xjdiyOZ74adPs4NiAMgrjUMGAZNJDBgsdmQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1386,12 +1404,12 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.13.0) + '@rollup/pluginutils': 5.0.5(rollup@4.14.3) magic-string: 0.30.8 - rollup: 4.13.0 + rollup: 4.14.3 dev: true - /@rollup/plugin-terser@0.4.4(rollup@4.13.0): + /@rollup/plugin-terser@0.4.4(rollup@4.14.3): resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1400,13 +1418,13 @@ packages: rollup: optional: true dependencies: - rollup: 4.13.0 + rollup: 4.14.3 serialize-javascript: 6.0.1 smob: 1.4.1 - terser: 5.29.1 + terser: 5.30.3 dev: true - /@rollup/pluginutils@5.0.5(rollup@4.13.0): + /@rollup/pluginutils@5.0.5(rollup@4.14.3): resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1418,10 +1436,10 @@ packages: '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.13.0 + rollup: 4.14.3 dev: true - /@rollup/pluginutils@5.1.0(rollup@4.13.0): + /@rollup/pluginutils@5.1.0(rollup@4.14.3): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1433,107 +1451,131 @@ packages: '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.13.0 + rollup: 4.14.3 dev: true - /@rollup/rollup-android-arm-eabi@4.13.0: - resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + /@rollup/rollup-android-arm-eabi@4.14.3: + resolution: {integrity: sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.13.0: - resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + /@rollup/rollup-android-arm64@4.14.3: + resolution: {integrity: sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.13.0: - resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + /@rollup/rollup-darwin-arm64@4.14.3: + resolution: {integrity: sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.13.0: - resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + /@rollup/rollup-darwin-x64@4.14.3: + resolution: {integrity: sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.13.0: - resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.14.3: + resolution: {integrity: sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.13.0: - resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + /@rollup/rollup-linux-arm-musleabihf@4.14.3: + resolution: {integrity: sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.14.3: + resolution: {integrity: sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.13.0: - resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + /@rollup/rollup-linux-arm64-musl@4.14.3: + resolution: {integrity: sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.13.0: - resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + /@rollup/rollup-linux-powerpc64le-gnu@4.14.3: + resolution: {integrity: sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.14.3: + resolution: {integrity: sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.13.0: - resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + /@rollup/rollup-linux-s390x-gnu@4.14.3: + resolution: {integrity: sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.14.3: + resolution: {integrity: sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.13.0: - resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + /@rollup/rollup-linux-x64-musl@4.14.3: + resolution: {integrity: sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.13.0: - resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + /@rollup/rollup-win32-arm64-msvc@4.14.3: + resolution: {integrity: sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.13.0: - resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + /@rollup/rollup-win32-ia32-msvc@4.14.3: + resolution: {integrity: sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.13.0: - resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + /@rollup/rollup-win32-x64-msvc@4.14.3: + resolution: {integrity: sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==} cpu: [x64] os: [win32] requiresBuild: true @@ -1564,12 +1606,16 @@ packages: resolution: {integrity: sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==} dev: true + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + /@types/minimist@1.2.5: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true - /@types/node@20.11.27: - resolution: {integrity: sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg==} + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} dependencies: undici-types: 5.26.5 dev: true @@ -1594,13 +1640,13 @@ packages: resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==} requiresBuild: true dependencies: - '@types/node': 20.11.27 + '@types/node': 20.12.7 dev: true optional: true - /@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.2.2): - resolution: {integrity: sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/eslint-plugin@7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 eslint: ^8.56.0 @@ -1609,27 +1655,27 @@ packages: typescript: optional: true dependencies: - '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/type-utils': 7.2.0(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 7.2.0 + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/type-utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 eslint: 8.57.0 graphemer: 1.4.0 - ignore: 5.2.4 + ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.2.0(eslint@8.57.0)(typescript@5.2.2): - resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/parser@7.7.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -1637,13 +1683,13 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 eslint: 8.57.0 - typescript: 5.2.2 + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -1656,17 +1702,17 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/scope-manager@7.2.0: - resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/scope-manager@7.7.0: + resolution: {integrity: sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 dev: true - /@typescript-eslint/type-utils@7.2.0(eslint@8.57.0)(typescript@5.2.2): - resolution: {integrity: sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/type-utils@7.7.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -1674,12 +1720,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.2.2) - '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.7.0(eslint@8.57.0)(typescript@5.4.5) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -1689,12 +1735,12 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types@7.2.0: - resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/types@7.7.0: + resolution: {integrity: sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==} + engines: {node: ^18.18.0 || >=20.0.0} dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.2.2): + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1709,35 +1755,35 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.0 - tsutils: 3.21.0(typescript@5.2.2) - typescript: 5.2.2 + tsutils: 3.21.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.2.0(typescript@5.2.2): - resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/typescript-estree@7.7.0(typescript@5.4.5): + resolution: {integrity: sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/visitor-keys': 7.7.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.3 + minimatch: 9.0.4 semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.2.2): + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -1748,7 +1794,7 @@ packages: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) eslint: 8.57.0 eslint-scope: 5.1.1 semver: 7.6.0 @@ -1757,18 +1803,18 @@ packages: - typescript dev: true - /@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.2.2): - resolution: {integrity: sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/utils@7.7.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) - '@types/json-schema': 7.0.14 + '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.2.2) + '@typescript-eslint/scope-manager': 7.7.0 + '@typescript-eslint/types': 7.7.0 + '@typescript-eslint/typescript-estree': 7.7.0(typescript@5.4.5) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -1784,11 +1830,11 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.2.0: - resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/visitor-keys@7.7.0: + resolution: {integrity: sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/types': 7.7.0 eslint-visitor-keys: 3.4.3 dev: true @@ -1796,92 +1842,83 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitejs/plugin-vue@5.0.4(vite@5.1.6)(vue@packages+vue): + /@vitejs/plugin-vue@5.0.4(vite@5.2.9)(vue@packages+vue): resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 vue: ^3.2.25 dependencies: - vite: 5.1.6(@types/node@20.11.27)(terser@5.29.1) + vite: 5.2.9(@types/node@20.12.7)(terser@5.30.3) vue: link:packages/vue dev: true - /@vitest/coverage-istanbul@1.3.1(vitest@1.3.1): - resolution: {integrity: sha512-aBVgQ2eY9gzrxBJjGKbWgatTU2w1CacEx0n8OMctPzl9836KqoM5X/WigJpjM7wZEtX2N0ZTE5KDGPmVM+o2Wg==} + /@vitest/coverage-istanbul@1.5.0(vitest@1.5.0): + resolution: {integrity: sha512-mEbVTIAPKhMkszO0lwOwWiG8Cvkj7rdMgdmCNUDnmcSZYUWGIqM8+4O1bcQ1WMHkejpcwvED5oU6ZFm3syVb6A==} peerDependencies: - vitest: 1.3.1 + vitest: 1.5.0 dependencies: debug: 4.3.4 istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.1 istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 + istanbul-lib-source-maps: 5.0.4 istanbul-reports: 3.1.6 magicast: 0.3.3 picocolors: 1.0.0 test-exclude: 6.0.0 - vitest: 1.3.1(@types/node@20.11.27)(@vitest/ui@1.2.2)(jsdom@24.0.0)(terser@5.29.1) + vitest: 1.5.0(@types/node@20.12.7)(@vitest/ui@1.5.0)(jsdom@24.0.0)(terser@5.30.3) transitivePeerDependencies: - supports-color dev: true - /@vitest/expect@1.3.1: - resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} + /@vitest/expect@1.5.0: + resolution: {integrity: sha512-0pzuCI6KYi2SIC3LQezmxujU9RK/vwC1U9R0rLuGlNGcOuDWxqWKu6nUdFsX9tH1WU0SXtAxToOsEjeUn1s3hA==} dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 + '@vitest/spy': 1.5.0 + '@vitest/utils': 1.5.0 chai: 4.3.10 dev: true - /@vitest/runner@1.3.1: - resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} + /@vitest/runner@1.5.0: + resolution: {integrity: sha512-7HWwdxXP5yDoe7DTpbif9l6ZmDwCzcSIK38kTSIt6CFEpMjX4EpCgT6wUmS0xTXqMI6E/ONmfgRKmaujpabjZQ==} dependencies: - '@vitest/utils': 1.3.1 + '@vitest/utils': 1.5.0 p-limit: 5.0.0 pathe: 1.1.1 dev: true - /@vitest/snapshot@1.3.1: - resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} + /@vitest/snapshot@1.5.0: + resolution: {integrity: sha512-qpv3fSEuNrhAO3FpH6YYRdaECnnRjg9VxbhdtPwPRnzSfHVXnNzzrpX4cJxqiwgRMo7uRMWDFBlsBq4Cr+rO3A==} dependencies: magic-string: 0.30.8 pathe: 1.1.1 pretty-format: 29.7.0 dev: true - /@vitest/spy@1.3.1: - resolution: {integrity: sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==} + /@vitest/spy@1.5.0: + resolution: {integrity: sha512-vu6vi6ew5N5MMHJjD5PoakMRKYdmIrNJmyfkhRpQt5d9Ewhw9nZ5Aqynbi3N61bvk9UvZ5UysMT6ayIrZ8GA9w==} dependencies: tinyspy: 2.2.0 dev: true - /@vitest/ui@1.2.2(vitest@1.3.1): - resolution: {integrity: sha512-CG+5fa8lyoBr+9i+UZGS31Qw81v33QlD10uecHxN2CLJVN+jLnqx4pGzGvFFeJ7jSnUCT0AlbmVWY6fU6NJZmw==} + /@vitest/ui@1.5.0(vitest@1.5.0): + resolution: {integrity: sha512-ETcToK2TzICf/Oartvt19IH7yR4oCs8GrQk5hRhZ5oZFaSdDHTh6o3EdzyxOaY24NZ20cXYYNGjj1se/5vHfFg==} peerDependencies: - vitest: ^1.0.0 + vitest: 1.5.0 dependencies: - '@vitest/utils': 1.2.2 + '@vitest/utils': 1.5.0 fast-glob: 3.3.2 fflate: 0.8.1 flatted: 3.2.9 pathe: 1.1.1 picocolors: 1.0.0 sirv: 2.0.4 - vitest: 1.3.1(@types/node@20.11.27)(@vitest/ui@1.2.2)(jsdom@24.0.0)(terser@5.29.1) + vitest: 1.5.0(@types/node@20.12.7)(@vitest/ui@1.5.0)(jsdom@24.0.0)(terser@5.30.3) dev: true - /@vitest/utils@1.2.2: - resolution: {integrity: sha512-WKITBHLsBHlpjnDQahr+XK6RE7MiAsgrIkr0pGhQ9ygoxBfUeG0lUG5iLlzqjmKSlBv3+j5EGsriBzh+C3Tq9g==} - dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 2.3.7 - pretty-format: 29.7.0 - dev: true - - /@vitest/utils@1.3.1: - resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} + /@vitest/utils@1.5.0: + resolution: {integrity: sha512-BDU0GNL8MWkRkSRdNFvCUCAVOeHaUlVJ9Tx0TYBZyXaaOTmGtUFObzchCivIBrIwKzvZA7A9sCejVhXM2aY98A==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -1896,7 +1933,7 @@ packages: vite: ^5.0.0 vue: '*' dependencies: - vite: 5.0.12(@types/node@20.11.27)(terser@5.29.1) + vite: 5.0.12(@types/node@20.12.7)(terser@5.30.3) vue: link:packages/vue dev: true @@ -2115,6 +2152,16 @@ packages: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} dev: true + /axios@1.6.8: + resolution: {integrity: sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==} + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: true + /b4a@1.6.4: resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} dev: true @@ -2366,14 +2413,15 @@ packages: fsevents: 2.3.3 dev: true - /chromium-bidi@0.5.12(devtools-protocol@0.0.1249869): - resolution: {integrity: sha512-sZMgEBWKbupD0Q7lyFu8AWkrE+rs5ycE12jFkGwIgD/VS8lDPtelPlXM7LYaq4zrkZ/O2L3f4afHUHL0ICdKog==} + /chromium-bidi@0.5.17(devtools-protocol@0.0.1262051): + resolution: {integrity: sha512-BqOuIWUgTPj8ayuBFJUYCCuwIcwjBsb3/614P7tt1bEPJ4i1M0kCdIl0Wi9xhtswBXnfO2bTpTMkHD71H8rJMg==} peerDependencies: devtools-protocol: '*' dependencies: - devtools-protocol: 0.0.1249869 + devtools-protocol: 0.0.1262051 mitt: 3.0.1 urlpattern-polyfill: 10.0.0 + zod: 3.22.4 dev: true /cli-boxes@3.0.0: @@ -2497,7 +2545,7 @@ packages: /constantinople@4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 dev: true @@ -2643,7 +2691,7 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: false - /cosmiconfig@9.0.0(typescript@5.2.2): + /cosmiconfig@9.0.0(typescript@5.4.5): resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} engines: {node: '>=14'} peerDependencies: @@ -2656,15 +2704,7 @@ packages: import-fresh: 3.3.0 js-yaml: 4.1.0 parse-json: 5.2.0 - typescript: 5.2.2 - dev: true - - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding + typescript: 5.4.5 dev: true /cross-spawn@7.0.3: @@ -2816,8 +2856,8 @@ packages: engines: {node: '>=0.4.0'} dev: true - /devtools-protocol@0.0.1249869: - resolution: {integrity: sha512-Ctp4hInA0BEavlUoRy9mhGq0i+JSo/AwVyX2EFgZmV1kYB+Zq+EMBAn52QWu6FbRr10hRb6pBl420upbp4++vg==} + /devtools-protocol@0.0.1262051: + resolution: {integrity: sha512-YJe4CT5SA8on3Spa+UDtNhEqtuV6Epwz3OZ4HQVLhlRccpZ9/PAYk0/cy/oKxFKRrZPBUPyxympQci4yWNWZ9g==} dev: true /diff-sequences@29.6.3: @@ -2907,13 +2947,13 @@ packages: resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} dev: true - /esbuild-plugin-polyfill-node@0.3.0(esbuild@0.20.1): + /esbuild-plugin-polyfill-node@0.3.0(esbuild@0.20.2): resolution: {integrity: sha512-SHG6CKUfWfYyYXGpW143NEZtcVVn8S/WHcEOxk62LuDXnY4Zpmc+WmxJKN6GMTgTClXJXhEM5KQlxKY6YjbucQ==} peerDependencies: esbuild: '*' dependencies: '@jspm/core': 2.0.1 - esbuild: 0.20.1 + esbuild: 0.20.2 import-meta-resolve: 3.0.0 dev: true @@ -2948,35 +2988,35 @@ packages: '@esbuild/win32-x64': 0.19.10 dev: true - /esbuild@0.20.1: - resolution: {integrity: sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==} + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} engines: {node: '>=12'} hasBin: true requiresBuild: true optionalDependencies: - '@esbuild/aix-ppc64': 0.20.1 - '@esbuild/android-arm': 0.20.1 - '@esbuild/android-arm64': 0.20.1 - '@esbuild/android-x64': 0.20.1 - '@esbuild/darwin-arm64': 0.20.1 - '@esbuild/darwin-x64': 0.20.1 - '@esbuild/freebsd-arm64': 0.20.1 - '@esbuild/freebsd-x64': 0.20.1 - '@esbuild/linux-arm': 0.20.1 - '@esbuild/linux-arm64': 0.20.1 - '@esbuild/linux-ia32': 0.20.1 - '@esbuild/linux-loong64': 0.20.1 - '@esbuild/linux-mips64el': 0.20.1 - '@esbuild/linux-ppc64': 0.20.1 - '@esbuild/linux-riscv64': 0.20.1 - '@esbuild/linux-s390x': 0.20.1 - '@esbuild/linux-x64': 0.20.1 - '@esbuild/netbsd-x64': 0.20.1 - '@esbuild/openbsd-x64': 0.20.1 - '@esbuild/sunos-x64': 0.20.1 - '@esbuild/win32-arm64': 0.20.1 - '@esbuild/win32-ia32': 0.20.1 - '@esbuild/win32-x64': 0.20.1 + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 dev: true /escalade@3.1.1: @@ -3022,7 +3062,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -3043,7 +3083,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/parser': 7.7.0(eslint@8.57.0)(typescript@5.4.5) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -3051,7 +3091,7 @@ packages: - supports-color dev: true - /eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.2.0)(eslint@8.57.0): + /eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.7.0)(eslint@8.57.0): resolution: {integrity: sha512-ORizX37MelIWLbMyqI7hi8VJMf7A0CskMmYkB+lkCX3aF4pkGV7kwx5bSEb4qx7Yce2rAf9s34HqDRPjGRZPNQ==} engines: {node: '>=12'} peerDependencies: @@ -3061,7 +3101,7 @@ packages: doctrine: 3.0.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.7.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) get-tsconfig: 4.7.2 is-glob: 4.0.3 minimatch: 3.1.2 @@ -3073,7 +3113,7 @@ packages: - supports-color dev: true - /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.2.0)(eslint@8.57.0)(typescript@5.2.2): + /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.7.0)(eslint@8.57.0)(typescript@5.4.5): resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -3086,8 +3126,8 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0)(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/eslint-plugin': 7.7.0(@typescript-eslint/parser@7.7.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.5) eslint: 8.57.0 transitivePeerDependencies: - supports-color @@ -3374,6 +3414,16 @@ packages: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} dev: true + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: true + /foreground-child@3.1.1: resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} engines: {node: '>=14'} @@ -3534,7 +3584,7 @@ packages: dependencies: foreground-child: 3.1.1 jackspeak: 2.3.6 - minimatch: 9.0.3 + minimatch: 9.0.4 minipass: 7.0.4 path-scurry: 1.10.1 dev: true @@ -3742,13 +3792,13 @@ packages: safer-buffer: 2.1.2 dev: true - /icss-utils@5.1.0(postcss@8.4.35): + /icss-utils@5.1.0(postcss@8.4.38): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true /ieee754@1.2.1: @@ -3760,6 +3810,11 @@ packages: engines: {node: '>= 4'} dev: true + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + /immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} dev: false @@ -3981,7 +4036,7 @@ packages: engines: {node: '>=10'} dependencies: '@babel/core': 7.23.3 - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.0 @@ -3998,13 +4053,13 @@ packages: supports-color: 7.2.0 dev: true - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + /istanbul-lib-source-maps@5.0.4: + resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} engines: {node: '>=10'} dependencies: + '@jridgewell/trace-mapping': 0.3.25 debug: 4.3.4 istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 transitivePeerDependencies: - supports-color dev: true @@ -4315,9 +4370,9 @@ packages: /magicast@0.3.3: resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true /make-dir@4.0.0: @@ -4424,6 +4479,13 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true @@ -4446,8 +4508,8 @@ packages: ufo: 1.3.1 dev: true - /monaco-editor@0.46.0: - resolution: {integrity: sha512-ADwtLIIww+9FKybWscd7OCfm9odsFYHImBRI1v9AviGce55QY8raT+9ihH8jX/E/e6QVSGM+pKj4jSUSRmALNQ==} + /monaco-editor@0.47.0: + resolution: {integrity: sha512-VabVvHvQ9QmMwXu4du008ZDuyLnHs9j7ThVFsiJoXSOQk18+LF89N4ADzPbFenm0W4V2bGHnFBztIRQTgBfxzw==} dev: false /mrmime@1.0.1: @@ -4491,18 +4553,6 @@ packages: engines: {node: '>= 0.4.0'} dev: true - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - dev: true - /node-gyp-build@4.7.1: resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==} hasBin: true @@ -4798,65 +4848,65 @@ packages: pathe: 1.1.1 dev: true - /postcss-modules-extract-imports@3.0.0(postcss@8.4.35): + /postcss-modules-extract-imports@3.0.0(postcss@8.4.38): resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 + postcss: 8.4.38 dev: true - /postcss-modules-local-by-default@4.0.3(postcss@8.4.35): + /postcss-modules-local-by-default@4.0.3(postcss@8.4.38): resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 postcss-value-parser: 4.2.0 dev: true - /postcss-modules-scope@3.0.0(postcss@8.4.35): + /postcss-modules-scope@3.0.0(postcss@8.4.38): resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.35 - postcss-selector-parser: 6.0.15 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 dev: true - /postcss-modules-values@4.0.0(postcss@8.4.35): + /postcss-modules-values@4.0.0(postcss@8.4.38): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 dependencies: - icss-utils: 5.1.0(postcss@8.4.35) - postcss: 8.4.35 + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 dev: true - /postcss-modules@6.0.0(postcss@8.4.35): + /postcss-modules@6.0.0(postcss@8.4.38): resolution: {integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==} peerDependencies: postcss: ^8.0.0 dependencies: generic-names: 4.0.0 - icss-utils: 5.1.0(postcss@8.4.35) + icss-utils: 5.1.0(postcss@8.4.38) lodash.camelcase: 4.3.0 - postcss: 8.4.35 - postcss-modules-extract-imports: 3.0.0(postcss@8.4.35) - postcss-modules-local-by-default: 4.0.3(postcss@8.4.35) - postcss-modules-scope: 3.0.0(postcss@8.4.35) - postcss-modules-values: 4.0.0(postcss@8.4.35) + postcss: 8.4.38 + postcss-modules-extract-imports: 3.0.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.3(postcss@8.4.38) + postcss-modules-scope: 3.0.0(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) string-hash: 1.1.3 dev: true - /postcss-selector-parser@6.0.15: - resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} + /postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} engines: {node: '>=4'} dependencies: cssesc: 3.0.0 @@ -4867,13 +4917,13 @@ packages: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} dev: true - /postcss@8.4.35: - resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 picocolors: 1.0.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -5046,35 +5096,33 @@ packages: engines: {node: '>=6'} dev: true - /puppeteer-core@22.4.1: - resolution: {integrity: sha512-l9nf8NcirYOHdID12CIMWyy7dqcJCVtgVS+YAiJuUJHg8+9yjgPiG2PcNhojIEEpCkvw3FxvnyITVfKVmkWpjA==} + /puppeteer-core@22.6.5: + resolution: {integrity: sha512-s0/5XkAWe0/dWISiljdrybjwDCHhgN31Nu/wznOZPKeikgcJtZtbvPKBz0t802XWqfSQnQDt3L6xiAE5JLlfuw==} engines: {node: '>=18'} dependencies: - '@puppeteer/browsers': 2.1.0 - chromium-bidi: 0.5.12(devtools-protocol@0.0.1249869) - cross-fetch: 4.0.0 + '@puppeteer/browsers': 2.2.2 + chromium-bidi: 0.5.17(devtools-protocol@0.0.1262051) debug: 4.3.4 - devtools-protocol: 0.0.1249869 + devtools-protocol: 0.0.1262051 ws: 8.16.0 transitivePeerDependencies: - bufferutil - - encoding - supports-color - utf-8-validate dev: true - /puppeteer@22.4.1(typescript@5.2.2): - resolution: {integrity: sha512-Mag1wRLanzwS4yEUyrDRBUgsKlH3dpL6oAfVwNHG09oxd0+ySsatMvYj7HwjynWy/S+Hg+XHLgjyC/F6CsL/lg==} + /puppeteer@22.6.5(typescript@5.4.5): + resolution: {integrity: sha512-YuoRKGj3MxHhUwrey7vmNvU4odGdUdNsj1ee8pfcqQlLWIXfMOXZCAXh8xdzpZESHH3tCGWp2xmPZE8E6iUEWg==} engines: {node: '>=18'} hasBin: true requiresBuild: true dependencies: - '@puppeteer/browsers': 2.1.0 - cosmiconfig: 9.0.0(typescript@5.2.2) - puppeteer-core: 22.4.1 + '@puppeteer/browsers': 2.2.2 + cosmiconfig: 9.0.0(typescript@5.4.5) + devtools-protocol: 0.0.1262051 + puppeteer-core: 22.6.5 transitivePeerDependencies: - bufferutil - - encoding - supports-color - typescript - utf-8-validate @@ -5242,7 +5290,7 @@ packages: glob: 10.3.10 dev: true - /rollup-plugin-dts@6.1.0(rollup@4.13.0)(typescript@5.2.2): + /rollup-plugin-dts@6.1.0(rollup@4.14.3)(typescript@5.4.5): resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==} engines: {node: '>=16'} peerDependencies: @@ -5250,58 +5298,61 @@ packages: typescript: ^4.5 || ^5.0 dependencies: magic-string: 0.30.8 - rollup: 4.13.0 - typescript: 5.2.2 + rollup: 4.14.3 + typescript: 5.4.5 optionalDependencies: '@babel/code-frame': 7.23.5 dev: true - /rollup-plugin-esbuild@6.1.1(esbuild@0.20.1)(rollup@4.13.0): + /rollup-plugin-esbuild@6.1.1(esbuild@0.20.2)(rollup@4.14.3): resolution: {integrity: sha512-CehMY9FAqJD5OUaE/Mi1r5z0kNeYxItmRO2zG4Qnv2qWKF09J2lTy5GUzjJR354ZPrLkCj4fiBN41lo8PzBUhw==} engines: {node: '>=14.18.0'} peerDependencies: esbuild: '>=0.18.0' rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.13.0) + '@rollup/pluginutils': 5.0.5(rollup@4.14.3) debug: 4.3.4 es-module-lexer: 1.3.1 - esbuild: 0.20.1 + esbuild: 0.20.2 get-tsconfig: 4.7.2 - rollup: 4.13.0 + rollup: 4.14.3 transitivePeerDependencies: - supports-color dev: true - /rollup-plugin-polyfill-node@0.13.0(rollup@4.13.0): + /rollup-plugin-polyfill-node@0.13.0(rollup@4.14.3): resolution: {integrity: sha512-FYEvpCaD5jGtyBuBFcQImEGmTxDTPbiHjJdrYIp+mFIwgXiXabxvKUK7ZT9P31ozu2Tqm9llYQMRWsfvTMTAOw==} peerDependencies: rollup: ^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 dependencies: - '@rollup/plugin-inject': 5.0.5(rollup@4.13.0) - rollup: 4.13.0 + '@rollup/plugin-inject': 5.0.5(rollup@4.14.3) + rollup: 4.14.3 dev: true - /rollup@4.13.0: - resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + /rollup@4.14.3: + resolution: {integrity: sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.13.0 - '@rollup/rollup-android-arm64': 4.13.0 - '@rollup/rollup-darwin-arm64': 4.13.0 - '@rollup/rollup-darwin-x64': 4.13.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 - '@rollup/rollup-linux-arm64-gnu': 4.13.0 - '@rollup/rollup-linux-arm64-musl': 4.13.0 - '@rollup/rollup-linux-riscv64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-gnu': 4.13.0 - '@rollup/rollup-linux-x64-musl': 4.13.0 - '@rollup/rollup-win32-arm64-msvc': 4.13.0 - '@rollup/rollup-win32-ia32-msvc': 4.13.0 - '@rollup/rollup-win32-x64-msvc': 4.13.0 + '@rollup/rollup-android-arm-eabi': 4.14.3 + '@rollup/rollup-android-arm64': 4.14.3 + '@rollup/rollup-darwin-arm64': 4.14.3 + '@rollup/rollup-darwin-x64': 4.14.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.14.3 + '@rollup/rollup-linux-arm-musleabihf': 4.14.3 + '@rollup/rollup-linux-arm64-gnu': 4.14.3 + '@rollup/rollup-linux-arm64-musl': 4.14.3 + '@rollup/rollup-linux-powerpc64le-gnu': 4.14.3 + '@rollup/rollup-linux-riscv64-gnu': 4.14.3 + '@rollup/rollup-linux-s390x-gnu': 4.14.3 + '@rollup/rollup-linux-x64-gnu': 4.14.3 + '@rollup/rollup-linux-x64-musl': 4.14.3 + '@rollup/rollup-win32-arm64-msvc': 4.14.3 + '@rollup/rollup-win32-ia32-msvc': 4.14.3 + '@rollup/rollup-win32-x64-msvc': 4.14.3 fsevents: 2.3.3 dev: true @@ -5333,14 +5384,14 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /sass@1.71.1: - resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==} + /sass@1.75.0: + resolution: {integrity: sha512-ShMYi3WkrDWxExyxSZPst4/okE9ts46xZmJDSawJQrnte7M1V9fScVB+uNXOVKRBt0PggHOwoZcn8mYX4trnBw==} engines: {node: '>=14.0.0'} hasBin: true dependencies: chokidar: 3.5.3 immutable: 4.3.4 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true /saxes@6.0.0: @@ -5445,8 +5496,8 @@ packages: engines: {node: '>=14'} dev: true - /simple-git-hooks@2.10.0: - resolution: {integrity: sha512-TtCytVYfV77pILCkzVxpOSgYKHQyaO7fBI/iwG5bLGb0dIo/v/K1Y1IZ5DN40RQu6WNNJiN0gkuRvSYjxOhFog==} + /simple-git-hooks@2.11.1: + resolution: {integrity: sha512-tgqwPUMDcNDhuf1Xf6KTUsyeqGdgKMhzaH4PAZZuzguOgTl5uuyeYe/8mWgAr6IBxB5V06uqEf6Dy37gIWDtDg==} hasBin: true requiresBuild: true dev: true @@ -5526,6 +5577,11 @@ packages: /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} + dev: false + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} /source-map-support@0.5.21: resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} @@ -5717,8 +5773,8 @@ packages: temp-dir: 3.0.0 dev: true - /terser@5.29.1: - resolution: {integrity: sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==} + /terser@5.30.3: + resolution: {integrity: sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -5754,8 +5810,8 @@ packages: resolution: {integrity: sha512-65NKvSuAVDP/n4CqH+a9w2kTlLReS9vhsAP06MWx+/89nMinJyB2icyl58RIcqCmIggpojIGeuJGhjU1aGMBSg==} dev: true - /tinypool@0.8.2: - resolution: {integrity: sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==} + /tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} engines: {node: '>=14.0.0'} dev: true @@ -5804,10 +5860,6 @@ packages: url-parse: 1.5.10 dev: true - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - dev: true - /tr46@5.0.0: resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} engines: {node: '>=18'} @@ -5815,13 +5867,13 @@ packages: punycode: 2.3.1 dev: true - /ts-api-utils@1.0.3(typescript@5.2.2): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} + /ts-api-utils@1.3.0(typescript@5.4.5): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.2.2 + typescript: 5.4.5 dev: true /tslib@1.14.1: @@ -5832,18 +5884,18 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /tsutils@3.21.0(typescript@5.2.2): + /tsutils@3.21.0(typescript@5.4.5): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.2.2 + typescript: 5.4.5 dev: true - /tsx@4.7.1: - resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} + /tsx@4.7.2: + resolution: {integrity: sha512-BCNd4kz6fz12fyrgCTEdZHGJ9fWTGeUzXmQysh0RVocDY3h4frk05ZNCXSy4kIenF7y/QnrdiVpTsyNRn6vlAw==} engines: {node: '>=18.0.0'} hasBin: true dependencies: @@ -5889,6 +5941,13 @@ packages: resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} engines: {node: '>=14.17'} hasBin: true + dev: false + + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: true /ufo@1.3.1: resolution: {integrity: sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==} @@ -5987,7 +6046,7 @@ packages: engines: {node: '>= 0.8'} dev: true - /vite-hyper-config@0.2.1(@types/node@20.11.27)(terser@5.29.1)(vite@5.0.12): + /vite-hyper-config@0.2.1(@types/node@20.12.7)(terser@5.30.3)(vite@5.0.12): resolution: {integrity: sha512-ItRIpzWp0XMh/Sn1H0GCWnQIUcBjnSaZy/EbOpJcRr9H/KTBHUSTCEOigE9K0KTN01Z0GDi/8WgVT9+RPL932A==} engines: {node: '>=18.0.0'} peerDependencies: @@ -5995,8 +6054,8 @@ packages: dependencies: cac: 6.7.14 picocolors: 1.0.0 - vite: 5.0.12(@types/node@20.11.27)(terser@5.29.1) - vite-node: 1.1.1(@types/node@20.11.27)(terser@5.29.1) + vite: 5.0.12(@types/node@20.12.7)(terser@5.30.3) + vite-node: 1.1.1(@types/node@20.12.7)(terser@5.30.3) transitivePeerDependencies: - '@types/node' - less @@ -6008,7 +6067,7 @@ packages: - terser dev: true - /vite-node@1.1.1(@types/node@20.11.27)(terser@5.29.1): + /vite-node@1.1.1(@types/node@20.12.7)(terser@5.30.3): resolution: {integrity: sha512-2bGE5w4jvym5v8llF6Gu1oBrmImoNSs4WmRVcavnG2me6+8UQntTqLiAMFyiAobp+ZXhj5ZFhI7SmLiFr/jrow==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -6017,7 +6076,7 @@ packages: debug: 4.3.4 pathe: 1.1.1 picocolors: 1.0.0 - vite: 5.1.6(@types/node@20.11.27)(terser@5.29.1) + vite: 5.2.9(@types/node@20.12.7)(terser@5.30.3) transitivePeerDependencies: - '@types/node' - less @@ -6029,8 +6088,8 @@ packages: - terser dev: true - /vite-node@1.3.1(@types/node@20.11.27)(terser@5.29.1): - resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} + /vite-node@1.5.0(@types/node@20.12.7)(terser@5.30.3): + resolution: {integrity: sha512-tV8h6gMj6vPzVCa7l+VGq9lwoJjW8Y79vst8QZZGiuRAfijU+EEWuc0kFpmndQrWhMMhet1jdSF+40KSZUqIIw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: @@ -6038,7 +6097,7 @@ packages: debug: 4.3.4 pathe: 1.1.1 picocolors: 1.0.0 - vite: 5.1.6(@types/node@20.11.27)(terser@5.29.1) + vite: 5.2.9(@types/node@20.12.7)(terser@5.30.3) transitivePeerDependencies: - '@types/node' - less @@ -6050,7 +6109,7 @@ packages: - terser dev: true - /vite-plugin-inspect@0.7.42(rollup@4.13.0)(vite@5.0.12): + /vite-plugin-inspect@0.7.42(rollup@4.14.3)(vite@5.0.12): resolution: {integrity: sha512-JCyX86wr3siQc+p9Kd0t8VkFHAJag0RaQVIpdFGSv5FEaePEVB6+V/RGtz2dQkkGSXQzRWrPs4cU3dRKg32bXw==} engines: {node: '>=14'} peerDependencies: @@ -6061,20 +6120,20 @@ packages: optional: true dependencies: '@antfu/utils': 0.7.6 - '@rollup/pluginutils': 5.0.5(rollup@4.13.0) + '@rollup/pluginutils': 5.0.5(rollup@4.14.3) debug: 4.3.4 error-stack-parser-es: 0.1.1 fs-extra: 11.1.1 open: 9.1.0 picocolors: 1.0.0 sirv: 2.0.3 - vite: 5.0.12(@types/node@20.11.27)(terser@5.29.1) + vite: 5.0.12(@types/node@20.12.7)(terser@5.30.3) transitivePeerDependencies: - rollup - supports-color dev: true - /vite@5.0.12(@types/node@20.11.27)(terser@5.29.1): + /vite@5.0.12(@types/node@20.12.7)(terser@5.30.3): resolution: {integrity: sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -6102,17 +6161,17 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.27 + '@types/node': 20.12.7 esbuild: 0.19.10 - postcss: 8.4.35 - rollup: 4.13.0 - terser: 5.29.1 + postcss: 8.4.38 + rollup: 4.14.3 + terser: 5.30.3 optionalDependencies: fsevents: 2.3.3 dev: true - /vite@5.1.6(@types/node@20.11.27)(terser@5.29.1): - resolution: {integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==} + /vite@5.2.9(@types/node@20.12.7)(terser@5.30.3): + resolution: {integrity: sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -6139,24 +6198,24 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.27 - esbuild: 0.19.10 - postcss: 8.4.35 - rollup: 4.13.0 - terser: 5.29.1 + '@types/node': 20.12.7 + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.14.3 + terser: 5.30.3 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest@1.3.1(@types/node@20.11.27)(@vitest/ui@1.2.2)(jsdom@24.0.0)(terser@5.29.1): - resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} + /vitest@1.5.0(@types/node@20.12.7)(@vitest/ui@1.5.0)(jsdom@24.0.0)(terser@5.30.3): + resolution: {integrity: sha512-d8UKgR0m2kjdxDWX6911uwxout6GHS0XaGH1cksSIVVG8kRlE7G7aBw7myKQCvDI5dT4j7ZMa+l706BIORMDLw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 1.3.1 - '@vitest/ui': 1.3.1 + '@vitest/browser': 1.5.0 + '@vitest/ui': 1.5.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -6173,13 +6232,13 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.11.27 - '@vitest/expect': 1.3.1 - '@vitest/runner': 1.3.1 - '@vitest/snapshot': 1.3.1 - '@vitest/spy': 1.3.1 - '@vitest/ui': 1.2.2(vitest@1.3.1) - '@vitest/utils': 1.3.1 + '@types/node': 20.12.7 + '@vitest/expect': 1.5.0 + '@vitest/runner': 1.5.0 + '@vitest/snapshot': 1.5.0 + '@vitest/spy': 1.5.0 + '@vitest/ui': 1.5.0(vitest@1.5.0) + '@vitest/utils': 1.5.0 acorn-walk: 8.3.2 chai: 4.3.10 debug: 4.3.4 @@ -6192,9 +6251,9 @@ packages: std-env: 3.6.0 strip-literal: 2.0.0 tinybench: 2.5.1 - tinypool: 0.8.2 - vite: 5.1.6(@types/node@20.11.27)(terser@5.29.1) - vite-node: 1.3.1(@types/node@20.11.27)(terser@5.29.1) + tinypool: 0.8.4 + vite: 5.2.9(@types/node@20.12.7)(terser@5.30.3) + vite-node: 1.5.0(@types/node@20.12.7)(terser@5.30.3) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -6233,10 +6292,6 @@ packages: xml-name-validator: 5.0.0 dev: true - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - dev: true - /webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} @@ -6262,13 +6317,6 @@ packages: webidl-conversions: 7.0.0 dev: true - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - dev: true - /which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -6297,7 +6345,7 @@ packages: resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.4 '@babel/types': 7.24.0 assert-never: 1.2.1 babel-walk: 3.0.0-canary-5 @@ -6412,3 +6460,7 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} dev: true + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: true diff --git a/rollup.config.js b/rollup.config.js index b3f54c826..34a2710c4 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -180,7 +180,7 @@ function createConfig(format, output, plugins = []) { tsconfig: path.resolve(__dirname, 'tsconfig.json'), sourceMap: output.sourcemap, minify: false, - target: isServerRenderer || isCJSBuild ? 'es2019' : 'es2015', + target: isServerRenderer || isCJSBuild ? 'es2019' : 'es2016', define: resolveDefine(), }), ...resolveNodePlugins(), @@ -369,7 +369,7 @@ function createMinifiedConfig(/** @type {PackageFormat} */ format) { terser({ module: /^esm/.test(format), compress: { - ecma: 2015, + ecma: 2016, pure_getters: true, }, safari10: true, diff --git a/tsconfig.build-browser.json b/tsconfig.build-browser.json new file mode 100644 index 000000000..707c99e58 --- /dev/null +++ b/tsconfig.build-browser.json @@ -0,0 +1,20 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": [], + "declaration": true, + "emitDeclarationOnly": true, + "stripInternal": true + }, + "include": [ + "packages/global.d.ts", + "packages/vue/src", + "packages/vue-compat/src", + "packages/compiler-core/src", + "packages/compiler-dom/src", + "packages/runtime-core/src", + "packages/runtime-dom/src", + "packages/reactivity/src", + "packages/shared/src" + ] +} diff --git a/tsconfig.build-node.json b/tsconfig.build-node.json new file mode 100644 index 000000000..fac1412fa --- /dev/null +++ b/tsconfig.build-node.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "types": ["node"], + "declaration": true, + "emitDeclarationOnly": true, + "stripInternal": true + }, + "include": [ + "packages/global.d.ts", + "packages/compiler-sfc/src", + "packages/compiler-ssr/src", + "packages/server-renderer/src" + ] +} diff --git a/tsconfig.build.json b/tsconfig.build.json deleted file mode 100644 index c3be79156..000000000 --- a/tsconfig.build.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "declaration": true, - "emitDeclarationOnly": true, - "stripInternal": true - }, - "exclude": [ - "packages/*/__tests__", - "packages/runtime-test", - "packages/template-explorer", - "packages/sfc-playground", - "packages/dts-test", - "playground" - ] -}