diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 65653f40da2..0a44fb79aa9 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/.github/workflows/ci.yml b/.github/workflows/ci.yml index 555e0eeaf84..39dd67c2390 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,7 @@ on: pull_request: branches: - main + - minor permissions: contents: read # to fetch code (actions/checkout) diff --git a/.github/workflows/size-data.yml b/.github/workflows/size-data.yml index f447831a32e..be57d223550 100644 --- a/.github/workflows/size-data.yml +++ b/.github/workflows/size-data.yml @@ -7,6 +7,7 @@ on: pull_request: branches: - main + - minor permissions: contents: read diff --git a/.gitignore b/.gitignore index 810f8852690..9dd21f59bf6 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 b616400b48e..9fc03aa9bc4 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/FUNDING.json b/FUNDING.json new file mode 100644 index 00000000000..552dc453c21 --- /dev/null +++ b/FUNDING.json @@ -0,0 +1,7 @@ +{ + "drips": { + "ethereum": { + "ownedBy": "0x5393BdeA2a020769256d9f337B0fc81a2F64850A" + } + } +} diff --git a/README.md b/README.md index cbc05311ae7..afe5711e8bc 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# vuejs/core [![npm](https://img.shields.io/npm/v/vue.svg)](https://www.npmjs.com/package/vue) [![build status](https://github.com/vuejs/core/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/vuejs/core/actions/workflows/ci.yml) +# vuejs/core [![npm](https://img.shields.io/npm/v/vue.svg)](https://www.npmjs.com/package/vue) [![build status](https://github.com/vuejs/core/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/vuejs/core/actions/workflows/ci.yml) [![Download](https://img.shields.io/npm/dm/vue)](https://www.npmjs.com/package/vue) ## Getting Started diff --git a/package.json b/package.json index e94766a31c5..2c8ba0b817c 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "private": true, "version": "3.4.21", - "packageManager": "pnpm@8.15.4", + "packageManager": "pnpm@8.15.6", "type": "module", "scripts": { "dev": "node scripts/dev.js", "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 runtime-dom -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,15 +70,15 @@ "@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", + "@typescript-eslint/eslint-plugin": "^7.4.0", + "@typescript-eslint/parser": "^7.4.0", + "@vitest/coverage-istanbul": "^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", @@ -98,21 +98,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 d5bdb4bc5fd..429a7968616 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 5d3f92ced18..c30840a21a6 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 b62800c0b9c..6ffa0aa2197 100644 --- a/packages/compiler-core/package.json +++ b/packages/compiler-core/package.json @@ -46,11 +46,11 @@ }, "homepage": "https://github.com/vuejs/core/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 4447e67aafa..987293d5124 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]}` @@ -85,7 +124,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 @@ -218,14 +257,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 ef4e54cf2d7..47628b66979 100644 --- a/packages/compiler-core/src/index.ts +++ b/packages/compiler-core/src/index.ts @@ -21,7 +21,13 @@ export { type StructuralDirectiveTransform, type DirectiveTransform, } from './transform' -export { generate, type CodegenContext, type CodegenResult } from './codegen' +export { + generate, + type CodegenContext, + type CodegenResult, + type CodegenSourceMapGenerator, + type RawSourceMap, +} from './codegen' export { ErrorCodes, errorMessages, diff --git a/packages/compiler-core/src/options.ts b/packages/compiler-core/src/options.ts index 8a989a8c659..5a8cd0079b9 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 202fba81b18..da8861b9237 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 c50f7f5e969..ca6e59df32b 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-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap b/packages/compiler-sfc/__tests__/compileScript/__snapshots__/defineModel.spec.ts.snap index b6a93541d36..6e9967fd011 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 764d120a744..722e3340a74 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 304258615a8..bd048a847e4 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 d9fd1dfe529..b842f7a466d 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 0c5c95cd17f..f3be58a301c 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 1f9ae67225b..71c0689a397 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 1de113053e0..d1c7b5419bb 100644 --- a/packages/compiler-sfc/package.json +++ b/packages/compiler-sfc/package.json @@ -42,15 +42,15 @@ }, "homepage": "https://github.com/vuejs/core/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:*", "@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", @@ -58,10 +58,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 4390014e89e..f27a6338e8e 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 2d5ffdad7d8..5ba8a5e4812 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 00c97867cd0..f0ec926d1b9 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' @@ -375,7 +377,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) => { @@ -390,7 +392,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 24fd0780eaa..e5e2ed0e53f 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 211efc49089..6b9fbc634cc 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 968c168ddb9..f6e291791a8 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 c5e01896130..3812e67092a 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 7915d1d1406..6a974368ecc 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 d2a576fd02a..905e6a4895d 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/src/ssrCodegenTransform.ts b/packages/compiler-ssr/src/ssrCodegenTransform.ts index 1755be3a3b0..53a7a060510 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 2d434010e2a..a2e284ae841 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 dca0f80fae8..dd81cab68d6 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 00000000000..99d9024dcbe --- /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 c749e80a5c7..883ebe6b254 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 f7e3241ccd6..e0aa06f3dbf 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() @@ -274,12 +275,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) @@ -287,10 +288,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 a36d6ed495f..c174fbc84e3 100644 --- a/packages/reactivity/__tests__/reactive.spec.ts +++ b/packages/reactivity/__tests__/reactive.spec.ts @@ -312,6 +312,35 @@ describe('reactivity/reactive', () => { 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) diff --git a/packages/reactivity/__tests__/reactiveArray.spec.ts b/packages/reactivity/__tests__/reactiveArray.spec.ts index 1c6fcefd592..e32b5deeb6d 100644 --- a/packages/reactivity/__tests__/reactiveArray.spec.ts +++ b/packages/reactivity/__tests__/reactiveArray.spec.ts @@ -99,6 +99,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/src/baseHandlers.ts b/packages/reactivity/src/baseHandlers.ts index 7cee7aa9bd5..943f329571c 100644 --- a/packages/reactivity/src/baseHandlers.ts +++ b/packages/reactivity/src/baseHandlers.ts @@ -80,10 +80,12 @@ function createArrayInstrumentations() { return instrumentations } -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/collectionHandlers.ts b/packages/reactivity/src/collectionHandlers.ts index 2b7785ae7eb..7c4b36fbe94 100644 --- a/packages/reactivity/src/collectionHandlers.ts +++ b/packages/reactivity/src/collectionHandlers.ts @@ -237,8 +237,10 @@ function createReadonlyMethod(type: TriggerOpTypes): Function { } } +type Instrumentations = Record + function createInstrumentations() { - const mutableInstrumentations: Record = { + const mutableInstrumentations: Instrumentations = { get(this: MapTypes, key: unknown) { return get(this, key) }, @@ -253,7 +255,7 @@ function createInstrumentations() { forEach: createForEach(false, false), } - const shallowInstrumentations: Record = { + const shallowInstrumentations: Instrumentations = { get(this: MapTypes, key: unknown) { return get(this, key, false, true) }, @@ -268,7 +270,7 @@ function createInstrumentations() { forEach: createForEach(false, true), } - const readonlyInstrumentations: Record = { + const readonlyInstrumentations: Instrumentations = { get(this: MapTypes, key: unknown) { return get(this, key, true) }, @@ -285,7 +287,7 @@ function createInstrumentations() { forEach: createForEach(true, false), } - const shallowReadonlyInstrumentations: Record = { + const shallowReadonlyInstrumentations: Instrumentations = { get(this: MapTypes, key: unknown) { return get(this, key, true, true) }, @@ -302,24 +304,18 @@ function createInstrumentations() { forEach: createForEach(true, true), } - const iteratorMethods = ['keys', 'values', 'entries', Symbol.iterator] + const iteratorMethods = [ + 'keys', + 'values', + 'entries', + Symbol.iterator, + ] as const + iteratorMethods.forEach(method => { - mutableInstrumentations[method as string] = createIterableMethod( - method, - false, - false, - ) - readonlyInstrumentations[method as string] = createIterableMethod( - method, - true, - false, - ) - shallowInstrumentations[method as string] = createIterableMethod( - method, - false, - true, - ) - shallowReadonlyInstrumentations[method as string] = createIterableMethod( + mutableInstrumentations[method] = createIterableMethod(method, false, false) + readonlyInstrumentations[method] = createIterableMethod(method, true, false) + shallowInstrumentations[method] = createIterableMethod(method, false, true) + shallowReadonlyInstrumentations[method] = createIterableMethod( method, true, true, diff --git a/packages/reactivity/src/reactive.ts b/packages/reactivity/src/reactive.ts index 996a6e8828d..f6fcbbdb98f 100644 --- a/packages/reactivity/src/reactive.ts +++ b/packages/reactivity/src/reactive.ts @@ -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 7c389fe1ede..3184c9c9c6a 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 d995c5fa057..085127677ba 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 6caa2442e18..e0277622c13 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/src/apiSetupHelpers.ts b/packages/runtime-core/src/apiSetupHelpers.ts index e5f79444da0..382bb30b365 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 5bf234fcf45..1c633ed52a3 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 5beaf5f5ebb..d310de49ae6 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, - - // 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, - - // 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) + const privateAPIs = { + // needed by many libs / render fns + $vnode: i => i.vnode, + + // 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 + + 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 2ad0a66f188..6f30053cfc2 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, @@ -524,6 +525,12 @@ export interface ComponentInternalInstance { * @internal */ getCssVars?: () => Record + + /** + * v2 compat only, for caching mutated $options + * @internal + */ + resolvedOptions?: MergedComponentOptions } const emptyAppContext = createAppContext() @@ -775,8 +782,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) } @@ -1005,36 +1011,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 @@ -1081,9 +1079,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) @@ -1095,9 +1097,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 2d91affe082..1c87304185c 100644 --- a/packages/runtime-core/src/componentProps.ts +++ b/packages/runtime-core/src/componentProps.ts @@ -12,7 +12,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 5b2b4f2303d..a1b45e4f9cc 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, @@ -307,6 +308,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 61e1ecc072c..e0f051b3984 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 db6088cf5c6..7697096bcd7 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/devtools.ts b/packages/runtime-core/src/devtools.ts index 870cb4748bd..5bff57a4165 100644 --- a/packages/runtime-core/src/devtools.ts +++ b/packages/runtime-core/src/devtools.ts @@ -123,6 +123,7 @@ export const devtoolsComponentRemoved = ( } } +/*! #__NO_SIDE_EFFECTS__ */ function createDevtoolsComponentHook(hook: DevtoolsHooks) { return (component: ComponentInternalInstance) => { emit( diff --git a/packages/runtime-core/src/errorHandling.ts b/packages/runtime-core/src/errorHandling.ts index 041eb123938..41c92cbd34a 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' // contexts where user provided function may be executed, in addition to @@ -78,7 +79,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)) { @@ -89,11 +90,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( @@ -127,12 +134,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 de02ae46d8a..a7832ac3d57 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 daa9413d2ee..28b60be78f2 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 bb08fb1557e..fb746f72c4a 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 6cc7b53e2c2..66b57b68964 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 e26b9dfb45e..9f860a5e3c3 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 1b08f85caa4..b7a5af0ed0e 100644 --- a/packages/runtime-dom/__tests__/patchEvents.spec.ts +++ b/packages/runtime-dom/__tests__/patchEvents.spec.ts @@ -192,4 +192,15 @@ 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( + '[Vue warn]: Wrong type passed to the event invoker, ' + + 'did you maybe forget @ or : in front of your prop?' + + '\nReceived onClick="test"', + ).toHaveBeenWarned() + }) }) diff --git a/packages/runtime-dom/src/apiCustomElement.ts b/packages/runtime-dom/src/apiCustomElement.ts index 337a3d90f9a..01ce2bad464 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 f98e82b2734..763b7a98b24 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 9e94810d8cd..b0ea41728bd 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 1666e3cb3dc..286a4176076 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 0335b6be0db..09e4a22a84c 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, isString } 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,18 @@ function createInvoker( return invoker } +function sanitizeEventValue(value: unknown, propName: string): EventValue { + if (isFunction(value) || isArray(value)) { + return value as EventValue + } + warn( + `Wrong type passed to the event invoker, did you maybe forget @ or : ` + + `in front of your prop?\nReceived ` + + `${propName}=${isString(value) ? JSON.stringify(value) : `[${typeof value}]`}`, + ) + return NOOP +} + function patchStopImmediatePropagation( e: Event, value: EventValue, @@ -126,7 +146,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/src/helpers/ssrRenderAttrs.ts b/packages/server-renderer/src/helpers/ssrRenderAttrs.ts index 5eb77116b19..5a7baaac3a2 100644 --- a/packages/server-renderer/src/helpers/ssrRenderAttrs.ts +++ b/packages/server-renderer/src/helpers/ssrRenderAttrs.ts @@ -17,7 +17,7 @@ import { } from '@vue/shared' // leading comma for empty string "" -const shouldIgnoreProp = makeMap( +const shouldIgnoreProp = /*#__PURE__*/ makeMap( `,key,ref,innerHTML,textContent,ref_key,ref_for`, ) diff --git a/packages/sfc-playground/package.json b/packages/sfc-playground/package.json index 6ccd3dd2364..22d6fd4bc67 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 d84b9893b36..d3429db9c05 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 c20c51579a4..3b2faf19533 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/src/general.ts b/packages/shared/src/general.ts index e04b961227a..47ab0229255 100644 --- a/packages/shared/src/general.ts +++ b/packages/shared/src/general.ts @@ -165,6 +165,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/makeMap.ts b/packages/shared/src/makeMap.ts index f11cc407c6f..3fa2b09c94a 100644 --- a/packages/shared/src/makeMap.ts +++ b/packages/shared/src/makeMap.ts @@ -5,6 +5,8 @@ * \/\*#\_\_PURE\_\_\*\/ * So that rollup can tree-shake them if necessary. */ + +/*! #__NO_SIDE_EFFECTS__ */ export function makeMap( str: string, expectsLowerCase?: boolean, diff --git a/packages/shared/src/toDisplayString.ts b/packages/shared/src/toDisplayString.ts index aff107cd97f..b63cb4112a5 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 7a1f87145f2..da0ffe58d97 100644 --- a/packages/template-explorer/package.json +++ b/packages/template-explorer/package.json @@ -11,7 +11,7 @@ "enableNonBrowserBranches": true }, "dependencies": { - "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 63ce5581230..1feccabd8f8 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 36bfd6f7e70..7091e9a5761 100644 --- a/packages/vue-compat/package.json +++ b/packages/vue-compat/package.json @@ -52,9 +52,9 @@ }, "homepage": "https://github.com/vuejs/core/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 febc9d3c20a..da3f4a42de9 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/pnpm-lock.yaml b/pnpm-lock.yaml index 4436f04b254..3a5bf1f2b10 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.1 '@babel/types': specifier: ^7.24.0 version: 7.24.0 '@codspeed/vitest-plugin': - specifier: ^2.3.1 - version: 2.3.1(vite@5.1.5)(vitest@1.3.1) + specifier: ^3.1.0 + version: 3.1.0(vite@5.2.7)(vitest@1.4.0) '@rollup/plugin-alias': specifier: ^5.1.0 - version: 5.1.0(rollup@4.12.1) + version: 5.1.0(rollup@4.13.2) '@rollup/plugin-commonjs': specifier: ^25.0.7 - version: 25.0.7(rollup@4.12.1) + version: 25.0.7(rollup@4.13.2) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.12.1) + version: 6.1.0(rollup@4.13.2) '@rollup/plugin-node-resolve': specifier: ^15.2.3 - version: 15.2.3(rollup@4.12.1) + version: 15.2.3(rollup@4.13.2) '@rollup/plugin-replace': specifier: 5.0.4 - version: 5.0.4(rollup@4.12.1) + version: 5.0.4(rollup@4.13.2) '@rollup/plugin-terser': specifier: ^0.4.4 - version: 0.4.4(rollup@4.12.1) + version: 0.4.4(rollup@4.13.2) '@types/hash-sum': specifier: ^1.0.2 version: 1.0.2 @@ -42,20 +42,20 @@ importers: specifier: ^1.2.5 version: 1.2.5 '@types/node': - specifier: ^20.11.25 - version: 20.11.25 + specifier: ^20.12.5 + version: 20.12.5 '@types/semver': specifier: ^7.5.8 version: 7.5.8 '@typescript-eslint/eslint-plugin': - specifier: ^7.1.1 - version: 7.1.1(@typescript-eslint/parser@7.1.1)(eslint@8.57.0)(typescript@5.2.2) + specifier: ^7.4.0 + version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5) '@typescript-eslint/parser': - specifier: ^7.1.1 - version: 7.1.1(eslint@8.57.0)(typescript@5.2.2) + specifier: ^7.4.0 + version: 7.4.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.4.0(vitest@1.4.0) '@vue/consolidate': specifier: 1.0.0 version: 1.0.0 @@ -66,11 +66,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 @@ -79,10 +79,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.1.1)(eslint@8.57.0) + version: /eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.4.0)(eslint@8.57.0) eslint-plugin-jest: specifier: ^27.9.0 - version: 27.9.0(@typescript-eslint/eslint-plugin@7.1.1)(eslint@8.57.0)(typescript@5.2.2) + version: 27.9.0(@typescript-eslint/eslint-plugin@7.4.0)(eslint@8.57.0)(typescript@5.4.5) estree-walker: specifier: ^2.0.2 version: 2.0.2 @@ -126,23 +126,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.3(typescript@5.4.5) rimraf: specifier: ^5.0.5 version: 5.0.5 rollup: - specifier: ^4.12.1 - version: 4.12.1 + specifier: ^4.13.2 + version: 4.13.2 rollup-plugin-dts: specifier: ^6.1.0 - version: 6.1.0(rollup@4.12.1)(typescript@5.2.2) + version: 6.1.0(rollup@4.13.2)(typescript@5.4.5) rollup-plugin-esbuild: specifier: ^6.1.1 - version: 6.1.1(esbuild@0.20.1)(rollup@4.12.1) + version: 6.1.1(esbuild@0.20.2)(rollup@4.13.2) rollup-plugin-polyfill-node: specifier: ^0.13.0 - version: 0.13.0(rollup@4.12.1) + version: 0.13.0(rollup@4.13.2) semver: specifier: ^7.6.0 version: 7.6.0 @@ -150,11 +150,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.1 todomvc-app-css: specifier: ^2.4.3 version: 2.4.3 @@ -162,23 +162,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.5(@types/node@20.11.25)(terser@5.29.1) + specifier: ^5.2.7 + version: 5.2.7(@types/node@20.12.5)(terser@5.30.1) vitest: - specifier: ^1.3.1 - version: 1.3.1(@types/node@20.11.25)(jsdom@24.0.0)(terser@5.29.1) + specifier: ^1.4.0 + version: 1.4.0(@types/node@20.12.5)(jsdom@24.0.0)(terser@5.30.1) packages/compiler-core: dependencies: '@babel/parser': - specifier: ^7.24.0 - version: 7.24.0 + specifier: ^7.24.1 + version: 7.24.1 '@vue/shared': specifier: workspace:* version: link:../shared @@ -189,8 +189,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 @@ -208,8 +208,8 @@ importers: packages/compiler-sfc: dependencies: '@babel/parser': - specifier: ^7.24.0 - version: 7.24.0 + specifier: ^7.24.1 + version: 7.24.1 '@vue/compiler-core': specifier: workspace:* version: link:../compiler-core @@ -229,11 +229,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 @@ -251,20 +251,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.74.1 packages/compiler-ssr: dependencies: @@ -361,21 +361,21 @@ importers: devDependencies: '@vitejs/plugin-vue': specifier: ^5.0.4 - version: 5.0.4(vite@5.1.5)(vue@packages+vue) + version: 5.0.4(vite@5.2.7)(vue@packages+vue) vite: - specifier: ^5.1.5 - version: 5.1.5(@types/node@20.11.25)(terser@5.29.1) + specifier: ^5.2.7 + version: 5.2.7(@types/node@20.12.5)(terser@5.30.1) packages/shared: {} packages/template-explorer: dependencies: 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: @@ -401,14 +401,14 @@ importers: packages/vue-compat: dependencies: '@babel/parser': - specifier: ^7.24.0 - version: 7.24.0 + specifier: ^7.24.1 + version: 7.24.1 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 @@ -451,7 +451,7 @@ packages: '@babel/helper-compilation-targets': 7.22.15 '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) '@babel/helpers': 7.23.5 - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.1 '@babel/template': 7.22.15 '@babel/traverse': 7.23.5 '@babel/types': 7.24.0 @@ -575,8 +575,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.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} engines: {node: '>=6.0.0'} hasBin: true dependencies: @@ -587,7 +587,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.23.5 - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.1 '@babel/types': 7.24.0 dev: true @@ -601,7 +601,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.1 '@babel/types': 7.24.0 debug: 4.3.4 globals: 11.12.0 @@ -617,22 +617,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.5)(vitest@1.3.1): - resolution: {integrity: sha512-/e4G2B/onX/hG/EjUU/NpDxnIryeTDamVRTBeWfgQDoex3g7GDzTwoQktaU5l/Asw3ZjEErQg+oQVToQ6jYZlA==} + /@codspeed/vitest-plugin@3.1.0(vite@5.2.7)(vitest@1.4.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.5(@types/node@20.11.25)(terser@5.29.1) - vitest: 1.3.1(@types/node@20.11.25)(jsdom@24.0.0)(terser@5.29.1) + '@codspeed/core': 3.1.0 + vite: 5.2.7(@types/node@20.12.5)(terser@5.30.1) + vitest: 1.4.0(@types/node@20.12.5)(jsdom@24.0.0)(terser@5.30.1) + transitivePeerDependencies: + - debug dev: true /@esbuild/aix-ppc64@0.19.10: @@ -644,8 +650,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] @@ -662,8 +668,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] @@ -680,8 +686,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] @@ -698,8 +704,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] @@ -716,8 +722,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] @@ -734,8 +740,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] @@ -752,8 +758,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] @@ -770,8 +776,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] @@ -788,8 +794,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] @@ -806,8 +812,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] @@ -824,8 +830,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] @@ -842,8 +848,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] @@ -860,8 +866,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] @@ -878,8 +884,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] @@ -896,8 +902,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] @@ -914,8 +920,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] @@ -932,8 +938,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] @@ -950,8 +956,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] @@ -968,8 +974,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] @@ -986,8 +992,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] @@ -1004,8 +1010,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] @@ -1022,8 +1028,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] @@ -1040,8 +1046,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] @@ -1158,7 +1164,7 @@ packages: resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.20 + '@jridgewell/trace-mapping': 0.3.25 dev: true /@jridgewell/sourcemap-codec@1.4.15: @@ -1171,6 +1177,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 @@ -1203,8 +1216,8 @@ packages: dev: true optional: true - /@puppeteer/browsers@2.1.0: - resolution: {integrity: sha512-xloWvocjvryHdUjDam/ZuGMh7zn4Sn3ZAaV4Ah2e2EwEt90N3XphZlSsU3n0VDc1F7kggCjMuH0UuxfPQ5mD9w==} + /@puppeteer/browsers@2.2.1: + resolution: {integrity: sha512-QSXujx4d4ogDamQA8ckkkRieFzDgZEuZuGiey9G7CuDcbnX4iINKWxTPC5Br2AEzY9ICAvcndqgAUFMMKnS/Tw==} engines: {node: '>=18'} hasBin: true dependencies: @@ -1220,7 +1233,7 @@ packages: - supports-color dev: true - /@rollup/plugin-alias@5.1.0(rollup@4.12.1): + /@rollup/plugin-alias@5.1.0(rollup@4.13.2): resolution: {integrity: sha512-lpA3RZ9PdIG7qqhEfv79tBffNaoDuukFDrmhLqg9ifv99u/ehn+lOg30x2zmhf8AQqQUZaMk/B9fZraQ6/acDQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1229,11 +1242,11 @@ packages: rollup: optional: true dependencies: - rollup: 4.12.1 + rollup: 4.13.2 slash: 4.0.0 dev: true - /@rollup/plugin-commonjs@25.0.7(rollup@4.12.1): + /@rollup/plugin-commonjs@25.0.7(rollup@4.13.2): resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1242,16 +1255,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.1) + '@rollup/pluginutils': 5.1.0(rollup@4.13.2) 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.12.1 + rollup: 4.13.2 dev: true - /@rollup/plugin-inject@5.0.5(rollup@4.12.1): + /@rollup/plugin-inject@5.0.5(rollup@4.13.2): resolution: {integrity: sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1260,13 +1273,13 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.1) + '@rollup/pluginutils': 5.1.0(rollup@4.13.2) estree-walker: 2.0.2 magic-string: 0.30.8 - rollup: 4.12.1 + rollup: 4.13.2 dev: true - /@rollup/plugin-json@6.1.0(rollup@4.12.1): + /@rollup/plugin-json@6.1.0(rollup@4.13.2): resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1275,11 +1288,11 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.1) - rollup: 4.12.1 + '@rollup/pluginutils': 5.1.0(rollup@4.13.2) + rollup: 4.13.2 dev: true - /@rollup/plugin-node-resolve@15.2.3(rollup@4.12.1): + /@rollup/plugin-node-resolve@15.2.3(rollup@4.13.2): resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1288,16 +1301,16 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.1) + '@rollup/pluginutils': 5.1.0(rollup@4.13.2) '@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.12.1 + rollup: 4.13.2 dev: true - /@rollup/plugin-replace@5.0.4(rollup@4.12.1): + /@rollup/plugin-replace@5.0.4(rollup@4.13.2): resolution: {integrity: sha512-E2hmRnlh09K8HGT0rOnnri9OTh+BILGr7NVJGB30S4E3cLRn3J0xjdiyOZ74adPs4NiAMgrjUMGAZNJDBgsdmQ==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1306,12 +1319,12 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.12.1) + '@rollup/pluginutils': 5.1.0(rollup@4.13.2) magic-string: 0.30.8 - rollup: 4.12.1 + rollup: 4.13.2 dev: true - /@rollup/plugin-terser@0.4.4(rollup@4.12.1): + /@rollup/plugin-terser@0.4.4(rollup@4.13.2): resolution: {integrity: sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1320,13 +1333,13 @@ packages: rollup: optional: true dependencies: - rollup: 4.12.1 + rollup: 4.13.2 serialize-javascript: 6.0.1 smob: 1.4.1 - terser: 5.29.1 + terser: 5.30.1 dev: true - /@rollup/pluginutils@5.1.0(rollup@4.12.1): + /@rollup/pluginutils@5.1.0(rollup@4.13.2): resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1335,110 +1348,126 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.3 + '@types/estree': 1.0.5 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 4.12.1 + rollup: 4.13.2 dev: true - /@rollup/rollup-android-arm-eabi@4.12.1: - resolution: {integrity: sha512-iU2Sya8hNn1LhsYyf0N+L4Gf9Qc+9eBTJJJsaOGUp+7x4n2M9dxTt8UvhJl3oeftSjblSlpCfvjA/IfP3g5VjQ==} + /@rollup/rollup-android-arm-eabi@4.13.2: + resolution: {integrity: sha512-3XFIDKWMFZrMnao1mJhnOT1h2g0169Os848NhhmGweEcfJ4rCi+3yMCOLG4zA61rbJdkcrM/DjVZm9Hg5p5w7g==} cpu: [arm] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-android-arm64@4.12.1: - resolution: {integrity: sha512-wlzcWiH2Ir7rdMELxFE5vuM7D6TsOcJ2Yw0c3vaBR3VOsJFVTx9xvwnAvhgU5Ii8Gd6+I11qNHwndDscIm0HXg==} + /@rollup/rollup-android-arm64@4.13.2: + resolution: {integrity: sha512-GdxxXbAuM7Y/YQM9/TwwP+L0omeE/lJAR1J+olu36c3LqqZEBdsIWeQ91KBe6nxwOnb06Xh7JS2U5ooWU5/LgQ==} cpu: [arm64] os: [android] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-arm64@4.12.1: - resolution: {integrity: sha512-YRXa1+aZIFN5BaImK+84B3uNK8C6+ynKLPgvn29X9s0LTVCByp54TB7tdSMHDR7GTV39bz1lOmlLDuedgTwwHg==} + /@rollup/rollup-darwin-arm64@4.13.2: + resolution: {integrity: sha512-mCMlpzlBgOTdaFs83I4XRr8wNPveJiJX1RLfv4hggyIVhfB5mJfN4P8Z6yKh+oE4Luz+qq1P3kVdWrCKcMYrrA==} cpu: [arm64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-darwin-x64@4.12.1: - resolution: {integrity: sha512-opjWJ4MevxeA8FhlngQWPBOvVWYNPFkq6/25rGgG+KOy0r8clYwL1CFd+PGwRqqMFVQ4/Qd3sQu5t7ucP7C/Uw==} + /@rollup/rollup-darwin-x64@4.13.2: + resolution: {integrity: sha512-yUoEvnH0FBef/NbB1u6d3HNGyruAKnN74LrPAfDQL3O32e3k3OSfLrPgSJmgb3PJrBZWfPyt6m4ZhAFa2nZp2A==} cpu: [x64] os: [darwin] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.12.1: - resolution: {integrity: sha512-uBkwaI+gBUlIe+EfbNnY5xNyXuhZbDSx2nzzW8tRMjUmpScd6lCQYKY2V9BATHtv5Ef2OBq6SChEP8h+/cxifQ==} + /@rollup/rollup-linux-arm-gnueabihf@4.13.2: + resolution: {integrity: sha512-GYbLs5ErswU/Xs7aGXqzc3RrdEjKdmoCrgzhJWyFL0r5fL3qd1NPcDKDowDnmcoSiGJeU68/Vy+OMUluRxPiLQ==} cpu: [arm] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.12.1: - resolution: {integrity: sha512-0bK9aG1kIg0Su7OcFTlexkVeNZ5IzEsnz1ept87a0TUgZ6HplSgkJAnFpEVRW7GRcikT4GlPV0pbtVedOaXHQQ==} + /@rollup/rollup-linux-arm64-gnu@4.13.2: + resolution: {integrity: sha512-L1+D8/wqGnKQIlh4Zre9i4R4b4noxzH5DDciyahX4oOz62CphY7WDWqJoQ66zNR4oScLNOqQJfNSIAe/6TPUmQ==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-arm64-musl@4.12.1: - resolution: {integrity: sha512-qB6AFRXuP8bdkBI4D7UPUbE7OQf7u5OL+R94JE42Z2Qjmyj74FtDdLGeriRyBDhm4rQSvqAGCGC01b8Fu2LthQ==} + /@rollup/rollup-linux-arm64-musl@4.13.2: + resolution: {integrity: sha512-tK5eoKFkXdz6vjfkSTCupUzCo40xueTOiOO6PeEIadlNBkadH1wNOH8ILCPIl8by/Gmb5AGAeQOFeLev7iZDOA==} cpu: [arm64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.12.1: - resolution: {integrity: sha512-sHig3LaGlpNgDj5o8uPEoGs98RII8HpNIqFtAI8/pYABO8i0nb1QzT0JDoXF/pxzqO+FkxvwkHZo9k0NJYDedg==} + /@rollup/rollup-linux-powerpc64le-gnu@4.13.2: + resolution: {integrity: sha512-zvXvAUGGEYi6tYhcDmb9wlOckVbuD+7z3mzInCSTACJ4DQrdSLPNUeDIcAQW39M3q6PDquqLWu7pnO39uSMRzQ==} + cpu: [ppc64le] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.13.2: + resolution: {integrity: sha512-C3GSKvMtdudHCN5HdmAMSRYR2kkhgdOfye4w0xzyii7lebVr4riCgmM6lRiSCnJn2w1Xz7ZZzHKuLrjx5620kw==} cpu: [riscv64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-gnu@4.12.1: - resolution: {integrity: sha512-nD3YcUv6jBJbBNFvSbp0IV66+ba/1teuBcu+fBBPZ33sidxitc6ErhON3JNavaH8HlswhWMC3s5rgZpM4MtPqQ==} + /@rollup/rollup-linux-s390x-gnu@4.13.2: + resolution: {integrity: sha512-l4U0KDFwzD36j7HdfJ5/TveEQ1fUTjFFQP5qIt9gBqBgu1G8/kCaq5Ok05kd5TG9F8Lltf3MoYsUMw3rNlJ0Yg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.13.2: + resolution: {integrity: sha512-xXMLUAMzrtsvh3cZ448vbXqlUa7ZL8z0MwHp63K2IIID2+DeP5iWIT6g1SN7hg1VxPzqx0xZdiDM9l4n9LRU1A==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-linux-x64-musl@4.12.1: - resolution: {integrity: sha512-7/XVZqgBby2qp/cO0TQ8uJK+9xnSdJ9ct6gSDdEr4MfABrjTyrW6Bau7HQ73a2a5tPB7hno49A0y1jhWGDN9OQ==} + /@rollup/rollup-linux-x64-musl@4.13.2: + resolution: {integrity: sha512-M/JYAWickafUijWPai4ehrjzVPKRCyDb1SLuO+ZyPfoXgeCEAlgPkNXewFZx0zcnoIe3ay4UjXIMdXQXOZXWqA==} cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.12.1: - resolution: {integrity: sha512-CYc64bnICG42UPL7TrhIwsJW4QcKkIt9gGlj21gq3VV0LL6XNb1yAdHVp1pIi9gkts9gGcT3OfUYHjGP7ETAiw==} + /@rollup/rollup-win32-arm64-msvc@4.13.2: + resolution: {integrity: sha512-2YWwoVg9KRkIKaXSh0mz3NmfurpmYoBBTAXA9qt7VXk0Xy12PoOP40EFuau+ajgALbbhi4uTj3tSG3tVseCjuA==} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.12.1: - resolution: {integrity: sha512-LN+vnlZ9g0qlHGlS920GR4zFCqAwbv2lULrR29yGaWP9u7wF5L7GqWu9Ah6/kFZPXPUkpdZwd//TNR+9XC9hvA==} + /@rollup/rollup-win32-ia32-msvc@4.13.2: + resolution: {integrity: sha512-2FSsE9aQ6OWD20E498NYKEQLneShWes0NGMPQwxWOdws35qQXH+FplabOSP5zEe1pVjurSDOGEVCE2agFwSEsw==} cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@rollup/rollup-win32-x64-msvc@4.12.1: - resolution: {integrity: sha512-n+vkrSyphvmU0qkQ6QBNXCGr2mKjhP08mPRM/Xp5Ck2FV4NrHU+y6axzDeixUrCBHVUS51TZhjqrKBBsHLKb2Q==} + /@rollup/rollup-win32-x64-msvc@4.13.2: + resolution: {integrity: sha512-7h7J2nokcdPePdKykd8wtc8QqqkqxIrUz7MHj6aNr8waBRU//NLDVnNjQnqQO6fqtjrtCdftpbTuOKAyrAQETQ==} cpu: [x64] os: [win32] requiresBuild: true @@ -1453,10 +1482,6 @@ packages: resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} dev: true - /@types/estree@1.0.3: - resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} - dev: true - /@types/estree@1.0.5: resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} dev: true @@ -1473,8 +1498,8 @@ packages: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: true - /@types/node@20.11.25: - resolution: {integrity: sha512-TBHyJxk2b7HceLVGFcpAUjsa5zIdsPWlR6XHfyGzd0SFu+/NFgQgMAl96MSDZgQDvJAvV6BKsFOrt6zIL09JDw==} + /@types/node@20.12.5: + resolution: {integrity: sha512-BD+BjQ9LS/D8ST9p5uqBxghlN+S42iuNxjsUGjeZobe/ciXzk2qb1B6IXc6AnRLS+yFJRpN2IPEHMzwspfDJNw==} dependencies: undici-types: 5.26.5 dev: true @@ -1495,13 +1520,13 @@ packages: resolution: {integrity: sha512-Km7XAtUIduROw7QPgvcft0lIupeG8a8rdKL8RiSyKvlE7dYY31fEn41HVuQsRFDuROA8tA4K2UVL+WdfFmErBA==} requiresBuild: true dependencies: - '@types/node': 20.11.25 + '@types/node': 20.12.5 dev: true optional: true - /@typescript-eslint/eslint-plugin@7.1.1(@typescript-eslint/parser@7.1.1)(eslint@8.57.0)(typescript@5.2.2): - resolution: {integrity: sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: '@typescript-eslint/parser': ^7.0.0 eslint: ^8.56.0 @@ -1511,26 +1536,26 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 7.1.1(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/scope-manager': 7.1.1 - '@typescript-eslint/type-utils': 7.1.1(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/utils': 7.1.1(eslint@8.57.0)(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 7.1.1 + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/type-utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 graphemer: 1.4.0 ignore: 5.2.4 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.0.3(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@7.1.1(eslint@8.57.0)(typescript@5.2.2): - resolution: {integrity: sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -1538,13 +1563,13 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 7.1.1 - '@typescript-eslint/types': 7.1.1 - '@typescript-eslint/typescript-estree': 7.1.1(typescript@5.2.2) - '@typescript-eslint/visitor-keys': 7.1.1 + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 eslint: 8.57.0 - typescript: 5.2.2 + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -1557,17 +1582,17 @@ packages: '@typescript-eslint/visitor-keys': 5.62.0 dev: true - /@typescript-eslint/scope-manager@7.1.1: - resolution: {integrity: sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/scope-manager@7.4.0: + resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.1.1 - '@typescript-eslint/visitor-keys': 7.1.1 + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/visitor-keys': 7.4.0 dev: true - /@typescript-eslint/type-utils@7.1.1(eslint@8.57.0)(typescript@5.2.2): - resolution: {integrity: sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: eslint: ^8.56.0 typescript: '*' @@ -1575,12 +1600,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 7.1.1(typescript@5.2.2) - '@typescript-eslint/utils': 7.1.1(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.4.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.0.3(typescript@5.4.5) + typescript: 5.4.5 transitivePeerDependencies: - supports-color dev: true @@ -1590,12 +1615,12 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@typescript-eslint/types@7.1.1: - resolution: {integrity: sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/types@7.4.0: + resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==} + 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: @@ -1610,35 +1635,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.1.1(typescript@5.2.2): - resolution: {integrity: sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.5): + resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==} + engines: {node: ^18.18.0 || >=20.0.0} peerDependencies: typescript: '*' peerDependenciesMeta: typescript: optional: true dependencies: - '@typescript-eslint/types': 7.1.1 - '@typescript-eslint/visitor-keys': 7.1.1 + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/visitor-keys': 7.4.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.0.3(typescript@5.2.2) - typescript: 5.2.2 + ts-api-utils: 1.0.3(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: @@ -1649,7 +1674,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 @@ -1658,18 +1683,18 @@ packages: - typescript dev: true - /@typescript-eslint/utils@7.1.1(eslint@8.57.0)(typescript@5.2.2): - resolution: {integrity: sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==} + 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/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.1.1 - '@typescript-eslint/types': 7.1.1 - '@typescript-eslint/typescript-estree': 7.1.1(typescript@5.2.2) + '@typescript-eslint/scope-manager': 7.4.0 + '@typescript-eslint/types': 7.4.0 + '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.5) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -1685,11 +1710,11 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@7.1.1: - resolution: {integrity: sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==} - engines: {node: ^16.0.0 || >=18.0.0} + /@typescript-eslint/visitor-keys@7.4.0: + resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==} + engines: {node: ^18.18.0 || >=20.0.0} dependencies: - '@typescript-eslint/types': 7.1.1 + '@typescript-eslint/types': 7.4.0 eslint-visitor-keys: 3.4.3 dev: true @@ -1697,68 +1722,68 @@ packages: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} dev: true - /@vitejs/plugin-vue@5.0.4(vite@5.1.5)(vue@packages+vue): + /@vitejs/plugin-vue@5.0.4(vite@5.2.7)(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.5(@types/node@20.11.25)(terser@5.29.1) + vite: 5.2.7(@types/node@20.12.5)(terser@5.30.1) 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.4.0(vitest@1.4.0): + resolution: {integrity: sha512-39TjURYyAY6CLDx8M1RNYGoAuWicPWoofk+demJbAZROLCwUgGPgMRSg51GN+snbmQRTpSizuS9XC3cMSdQH2Q==} peerDependencies: - vitest: 1.3.1 + vitest: 1.4.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.25)(jsdom@24.0.0)(terser@5.29.1) + vitest: 1.4.0(@types/node@20.12.5)(jsdom@24.0.0)(terser@5.30.1) transitivePeerDependencies: - supports-color dev: true - /@vitest/expect@1.3.1: - resolution: {integrity: sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==} + /@vitest/expect@1.4.0: + resolution: {integrity: sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==} dependencies: - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 chai: 4.3.10 dev: true - /@vitest/runner@1.3.1: - resolution: {integrity: sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==} + /@vitest/runner@1.4.0: + resolution: {integrity: sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==} dependencies: - '@vitest/utils': 1.3.1 + '@vitest/utils': 1.4.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.4.0: + resolution: {integrity: sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==} 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.4.0: + resolution: {integrity: sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==} dependencies: tinyspy: 2.2.0 dev: true - /@vitest/utils@1.3.1: - resolution: {integrity: sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==} + /@vitest/utils@1.4.0: + resolution: {integrity: sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==} dependencies: diff-sequences: 29.6.3 estree-walker: 3.0.3 @@ -1956,6 +1981,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 @@ -2188,14 +2223,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.16(devtools-protocol@0.0.1262051): + resolution: {integrity: sha512-IT5lnR44h/qZQ4GaCHvBxYIl4cQL2i9UvFyYeRyVdcpY04hx5H720HQfe/7Oz7ndxaYVLQFGpCO71J4X2Ye/Gw==} 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: @@ -2319,7 +2355,7 @@ packages: /constantinople@4.0.1: resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.1 '@babel/types': 7.24.0 dev: true @@ -2465,7 +2501,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: @@ -2478,15 +2514,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: @@ -2615,8 +2643,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: @@ -2702,13 +2730,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 @@ -2743,35 +2771,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: @@ -2817,7 +2845,7 @@ packages: - supports-color dev: true - /eslint-module-utils@2.8.0(@typescript-eslint/parser@7.1.1)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + /eslint-module-utils@2.8.0(@typescript-eslint/parser@7.4.0)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} engines: {node: '>=4'} peerDependencies: @@ -2838,7 +2866,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.1.1(eslint@8.57.0)(typescript@5.2.2) + '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.5) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -2846,7 +2874,7 @@ packages: - supports-color dev: true - /eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.1.1)(eslint@8.57.0): + /eslint-plugin-i@2.29.1(@typescript-eslint/parser@7.4.0)(eslint@8.57.0): resolution: {integrity: sha512-ORizX37MelIWLbMyqI7hi8VJMf7A0CskMmYkB+lkCX3aF4pkGV7kwx5bSEb4qx7Yce2rAf9s34HqDRPjGRZPNQ==} engines: {node: '>=12'} peerDependencies: @@ -2856,7 +2884,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.1.1)(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.4.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 @@ -2868,7 +2896,7 @@ packages: - supports-color dev: true - /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.1.1)(eslint@8.57.0)(typescript@5.2.2): + /eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.4.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: @@ -2881,8 +2909,8 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 7.1.1(@typescript-eslint/parser@7.1.1)(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.4.0(@typescript-eslint/parser@7.4.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 @@ -3150,6 +3178,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'} @@ -3301,7 +3339,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 @@ -3447,16 +3485,6 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true - /http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -3467,16 +3495,6 @@ packages: - supports-color dev: true - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /https-proxy-agent@7.0.4: resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} engines: {node: '>= 14'} @@ -3504,13 +3522,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: @@ -3670,7 +3688,7 @@ packages: /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: - '@types/estree': 1.0.3 + '@types/estree': 1.0.5 dev: true /is-regex@1.1.4: @@ -3723,7 +3741,7 @@ packages: engines: {node: '>=10'} dependencies: '@babel/core': 7.23.5 - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.1 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.0 @@ -3740,13 +3758,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 @@ -3802,8 +3820,8 @@ packages: decimal.js: 10.4.3 form-data: 4.0.0 html-encoding-sniffer: 4.0.0 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 is-potential-custom-element-name: 1.0.1 nwsapi: 2.2.7 parse5: 7.1.2 @@ -4049,9 +4067,9 @@ packages: /magicast@0.3.3: resolution: {integrity: sha512-ZbrP1Qxnpoes8sz47AM0z08U+jW6TyRgZzcWy3Ma3vDhJttwMwAFDMMQFobwdBxByBD46JYmxRzeF7w2+wJEuw==} dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.1 '@babel/types': 7.24.0 - source-map-js: 1.0.2 + source-map-js: 1.2.0 dev: true /make-dir@4.0.0: @@ -4158,6 +4176,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 @@ -4180,8 +4205,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 /ms@2.0.0: @@ -4215,18 +4240,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 @@ -4264,7 +4277,7 @@ packages: ansi-styles: 6.2.1 cross-spawn: 7.0.3 memorystream: 0.3.1 - minimatch: 9.0.3 + minimatch: 9.0.4 pidtree: 0.6.0 read-package-json-fast: 3.0.2 shell-quote: 1.8.1 @@ -4512,65 +4525,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 @@ -4581,13 +4594,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==} @@ -4760,35 +4773,33 @@ packages: engines: {node: '>=6'} dev: true - /puppeteer-core@22.4.1: - resolution: {integrity: sha512-l9nf8NcirYOHdID12CIMWyy7dqcJCVtgVS+YAiJuUJHg8+9yjgPiG2PcNhojIEEpCkvw3FxvnyITVfKVmkWpjA==} + /puppeteer-core@22.6.3: + resolution: {integrity: sha512-YrTAak5zCTWVTnVaCK1b7FD1qFCCT9bSvQhLzamnIsJ57/tfuXiT8ZvPJR2SBfahyFTYFCcaZAd/Npow3lmDGA==} 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.1 + chromium-bidi: 0.5.16(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.3(typescript@5.4.5): + resolution: {integrity: sha512-KZOnthMbvr4+7cPKFeeOCJPe8DzOKGC0GbMXmZKOP/YusXQ6sqxA0vt6frstZq3rUJ277qXHlZNFf01VVwdHKw==} 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.1 + cosmiconfig: 9.0.0(typescript@5.4.5) + devtools-protocol: 0.0.1262051 + puppeteer-core: 22.6.3 transitivePeerDependencies: - bufferutil - - encoding - supports-color - typescript - utf-8-validate @@ -4956,7 +4967,7 @@ packages: glob: 10.3.10 dev: true - /rollup-plugin-dts@6.1.0(rollup@4.12.1)(typescript@5.2.2): + /rollup-plugin-dts@6.1.0(rollup@4.13.2)(typescript@5.4.5): resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==} engines: {node: '>=16'} peerDependencies: @@ -4964,58 +4975,60 @@ packages: typescript: ^4.5 || ^5.0 dependencies: magic-string: 0.30.8 - rollup: 4.12.1 - typescript: 5.2.2 + rollup: 4.13.2 + 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.12.1): + /rollup-plugin-esbuild@6.1.1(esbuild@0.20.2)(rollup@4.13.2): 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.1.0(rollup@4.12.1) + '@rollup/pluginutils': 5.1.0(rollup@4.13.2) 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.12.1 + rollup: 4.13.2 transitivePeerDependencies: - supports-color dev: true - /rollup-plugin-polyfill-node@0.13.0(rollup@4.12.1): + /rollup-plugin-polyfill-node@0.13.0(rollup@4.13.2): 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.12.1) - rollup: 4.12.1 + '@rollup/plugin-inject': 5.0.5(rollup@4.13.2) + rollup: 4.13.2 dev: true - /rollup@4.12.1: - resolution: {integrity: sha512-ggqQKvx/PsB0FaWXhIvVkSWh7a/PCLQAsMjBc+nA2M8Rv2/HG0X6zvixAB7KyZBRtifBUhy5k8voQX/mRnABPg==} + /rollup@4.13.2: + resolution: {integrity: sha512-MIlLgsdMprDBXC+4hsPgzWUasLO9CE4zOkj/u6j+Z6j5A4zRY+CtiXAdJyPtgCsc42g658Aeh1DlrdVEJhsL2g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.1 - '@rollup/rollup-android-arm64': 4.12.1 - '@rollup/rollup-darwin-arm64': 4.12.1 - '@rollup/rollup-darwin-x64': 4.12.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.1 - '@rollup/rollup-linux-arm64-gnu': 4.12.1 - '@rollup/rollup-linux-arm64-musl': 4.12.1 - '@rollup/rollup-linux-riscv64-gnu': 4.12.1 - '@rollup/rollup-linux-x64-gnu': 4.12.1 - '@rollup/rollup-linux-x64-musl': 4.12.1 - '@rollup/rollup-win32-arm64-msvc': 4.12.1 - '@rollup/rollup-win32-ia32-msvc': 4.12.1 - '@rollup/rollup-win32-x64-msvc': 4.12.1 + '@rollup/rollup-android-arm-eabi': 4.13.2 + '@rollup/rollup-android-arm64': 4.13.2 + '@rollup/rollup-darwin-arm64': 4.13.2 + '@rollup/rollup-darwin-x64': 4.13.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.2 + '@rollup/rollup-linux-arm64-gnu': 4.13.2 + '@rollup/rollup-linux-arm64-musl': 4.13.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.13.2 + '@rollup/rollup-linux-riscv64-gnu': 4.13.2 + '@rollup/rollup-linux-s390x-gnu': 4.13.2 + '@rollup/rollup-linux-x64-gnu': 4.13.2 + '@rollup/rollup-linux-x64-musl': 4.13.2 + '@rollup/rollup-win32-arm64-msvc': 4.13.2 + '@rollup/rollup-win32-ia32-msvc': 4.13.2 + '@rollup/rollup-win32-x64-msvc': 4.13.2 fsevents: 2.3.3 dev: true @@ -5040,14 +5053,14 @@ packages: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} dev: true - /sass@1.71.1: - resolution: {integrity: sha512-wovtnV2PxzteLlfNzbgm1tFXPLoZILYAMJtvoXXkD7/+1uP41eKkIt1ypWq5/q2uT94qHjXehEYfmjKOvjL9sg==} + /sass@1.74.1: + resolution: {integrity: sha512-w0Z9p/rWZWelb88ISOLyvqTWGmtmu2QJICqDBGyNnfG4OUnPX9BBjjYIXUpXCMOOg5MQWNpqzt876la1fsTvUA==} 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: @@ -5152,8 +5165,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 @@ -5212,8 +5225,8 @@ packages: smart-buffer: 4.2.0 dev: true - /source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} engines: {node: '>=0.10.0'} /source-map-support@0.5.21: @@ -5406,8 +5419,8 @@ packages: temp-dir: 3.0.0 dev: true - /terser@5.29.1: - resolution: {integrity: sha512-lZQ/fyaIGxsbGxApKmoPTODIzELy3++mXhS5hOqaAWZjQtpq/hFHAc+rm29NND1rYRxRWKcjuARNwULNXa5RtQ==} + /terser@5.30.1: + resolution: {integrity: sha512-PJhOnRttZqqmIujxOQOMu4QuFGvh43lR7Youln3k6OJvmxwZ5FxK5rbCEh8XABRCpLf7ZnhrZuclCNCASsScnA==} engines: {node: '>=10'} hasBin: true dependencies: @@ -5483,10 +5496,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'} @@ -5494,13 +5503,13 @@ packages: punycode: 2.3.1 dev: true - /ts-api-utils@1.0.3(typescript@5.2.2): + /ts-api-utils@1.0.3(typescript@5.4.5): resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} engines: {node: '>=16.13.0'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.2.2 + typescript: 5.4.5 dev: true /tslib@1.14.1: @@ -5511,18 +5520,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: @@ -5568,6 +5577,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==} @@ -5652,8 +5668,8 @@ packages: engines: {node: '>= 0.8'} dev: true - /vite-node@1.3.1(@types/node@20.11.25)(terser@5.29.1): - resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} + /vite-node@1.4.0(@types/node@20.12.5)(terser@5.30.1): + resolution: {integrity: sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true dependencies: @@ -5661,7 +5677,7 @@ packages: debug: 4.3.4 pathe: 1.1.1 picocolors: 1.0.0 - vite: 5.1.5(@types/node@20.11.25)(terser@5.29.1) + vite: 5.2.7(@types/node@20.12.5)(terser@5.30.1) transitivePeerDependencies: - '@types/node' - less @@ -5673,8 +5689,8 @@ packages: - terser dev: true - /vite@5.1.5(@types/node@20.11.25)(terser@5.29.1): - resolution: {integrity: sha512-BdN1xh0Of/oQafhU+FvopafUp6WaYenLU/NFoL5WyJL++GxkNfieKzBhM24H3HVsPQrlAqB7iJYTHabzaRed5Q==} + /vite@5.2.7(@types/node@20.12.5)(terser@5.30.1): + resolution: {integrity: sha512-k14PWOKLI6pMaSzAuGtT+Cf0YmIx12z9YGon39onaJNy8DLBfBJrzg9FQEmkAM5lpHBZs9wksWAsyF/HkpEwJA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5701,24 +5717,24 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.25 - esbuild: 0.19.10 - postcss: 8.4.35 - rollup: 4.12.1 - terser: 5.29.1 + '@types/node': 20.12.5 + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.13.2 + terser: 5.30.1 optionalDependencies: fsevents: 2.3.3 dev: true - /vitest@1.3.1(@types/node@20.11.25)(jsdom@24.0.0)(terser@5.29.1): - resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} + /vitest@1.4.0(@types/node@20.12.5)(jsdom@24.0.0)(terser@5.30.1): + resolution: {integrity: sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==} 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.4.0 + '@vitest/ui': 1.4.0 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -5735,12 +5751,12 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.11.25 - '@vitest/expect': 1.3.1 - '@vitest/runner': 1.3.1 - '@vitest/snapshot': 1.3.1 - '@vitest/spy': 1.3.1 - '@vitest/utils': 1.3.1 + '@types/node': 20.12.5 + '@vitest/expect': 1.4.0 + '@vitest/runner': 1.4.0 + '@vitest/snapshot': 1.4.0 + '@vitest/spy': 1.4.0 + '@vitest/utils': 1.4.0 acorn-walk: 8.3.2 chai: 4.3.10 debug: 4.3.4 @@ -5754,8 +5770,8 @@ packages: strip-literal: 2.0.0 tinybench: 2.5.1 tinypool: 0.8.2 - vite: 5.1.5(@types/node@20.11.25)(terser@5.29.1) - vite-node: 1.3.1(@types/node@20.11.25)(terser@5.29.1) + vite: 5.2.7(@types/node@20.12.5)(terser@5.30.1) + vite-node: 1.4.0(@types/node@20.12.5)(terser@5.30.1) why-is-node-running: 2.2.2 transitivePeerDependencies: - less @@ -5779,10 +5795,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'} @@ -5808,13 +5820,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'} @@ -5843,7 +5848,7 @@ packages: resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} engines: {node: '>= 10.0.0'} dependencies: - '@babel/parser': 7.24.0 + '@babel/parser': 7.24.1 '@babel/types': 7.24.0 assert-never: 1.2.1 babel-walk: 3.0.0-canary-5 @@ -5958,3 +5963,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 6ab5ca4294a..e8d5984184d 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -331,7 +331,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(), @@ -367,7 +367,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 00000000000..707c99e58a9 --- /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 00000000000..fac1412fadf --- /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 954103c0f2f..00000000000 --- a/tsconfig.build.json +++ /dev/null @@ -1,15 +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" - ] -}