- name: Run ssr unit tests
run: pnpm run test-unit server-renderer
+ benchmarks:
+ runs-on: ubuntu-latest
+ if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
+ env:
+ PUPPETEER_SKIP_DOWNLOAD: 'true'
+ steps:
+ - uses: actions/checkout@v4
+
+ - name: Install pnpm
+ uses: pnpm/action-setup@v2
+
+ - name: Install Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version-file: '.node-version'
+ cache: 'pnpm'
+
+ - run: pnpm install
+
+ - name: Run benchmarks
+ uses: CodSpeedHQ/action@v1
+ with:
+ run: pnpm vitest bench --run
+ token: ${{ secrets.CODSPEED_TOKEN }}
+
e2e-test:
runs-on: ubuntu-latest
if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository
"test-dts": "run-s build-dts test-dts-only",
"test-dts-only": "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",
"changelog": "conventional-changelog -p angular -i CHANGELOG.md -s",
"dev-esm": "node scripts/dev.js -if esm-bundler-runtime",
"devDependencies": {
"@babel/parser": "^7.23.5",
"@babel/types": "^7.23.5",
+ "@codspeed/vitest-plugin": "^2.3.1",
"@rollup/plugin-alias": "^5.0.1",
"@rollup/plugin-commonjs": "^25.0.7",
"@rollup/plugin-json": "^6.0.1",
"@types/hash-sum": "^1.0.2",
"@types/node": "^20.10.3",
"@typescript-eslint/parser": "^6.13.0",
- "@vitest/coverage-istanbul": "^0.34.6",
+ "@vitest/coverage-istanbul": "^1.0.2",
"@vue/consolidate": "0.17.3",
"conventional-changelog-cli": "^4.1.0",
"enquirer": "^2.4.1",
--- /dev/null
+import { describe, bench } from 'vitest'
+import { ComputedRef, Ref, computed, ref } from '../src/index'
+
+describe('computed', () => {
+ bench('create computed', () => {
+ computed(() => 100)
+ })
+
+ {
+ let i = 0
+ const o = ref(100)
+ bench('write independent ref dep', () => {
+ o.value = i++
+ })
+ }
+
+ {
+ const v = ref(100)
+ computed(() => v.value * 2)
+ let i = 0
+ bench("write ref, don't read computed (never invoked)", () => {
+ v.value = i++
+ })
+ }
+
+ {
+ const v = ref(100)
+ computed(() => {
+ return v.value * 2
+ })
+ let i = 0
+ bench("write ref, don't read computed (never invoked)", () => {
+ v.value = i++
+ })
+ }
+
+ {
+ const v = ref(100)
+ const c = computed(() => {
+ return v.value * 2
+ })
+ c.value
+ let i = 0
+ bench("write ref, don't read computed (invoked)", () => {
+ v.value = i++
+ })
+ }
+
+ {
+ const v = ref(100)
+ const c = computed(() => {
+ return v.value * 2
+ })
+ let i = 0
+ bench('write ref, read computed', () => {
+ v.value = i++
+ c.value
+ })
+ }
+
+ {
+ const v = ref(100)
+ const computeds = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ const c = computed(() => {
+ return v.value * 2
+ })
+ computeds.push(c)
+ }
+ let i = 0
+ bench("write ref, don't read 1000 computeds (never invoked)", () => {
+ v.value = i++
+ })
+ }
+
+ {
+ const v = ref(100)
+ const computeds = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ const c = computed(() => {
+ return v.value * 2
+ })
+ c.value
+ computeds.push(c)
+ }
+ let i = 0
+ bench("write ref, don't read 1000 computeds (invoked)", () => {
+ v.value = i++
+ })
+ }
+
+ {
+ const v = ref(100)
+ const computeds: ComputedRef<number>[] = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ const c = computed(() => {
+ return v.value * 2
+ })
+ c.value
+ computeds.push(c)
+ }
+ let i = 0
+ bench('write ref, read 1000 computeds', () => {
+ v.value = i++
+ computeds.forEach(c => c.value)
+ })
+ }
+
+ {
+ const refs: Ref<number>[] = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ refs.push(ref(i))
+ }
+ const c = computed(() => {
+ let total = 0
+ refs.forEach(ref => (total += ref.value))
+ return total
+ })
+ let i = 0
+ const n = refs.length
+ bench('1000 refs, 1 computed', () => {
+ refs[i++ % n].value++
+ c.value
+ })
+ }
+})
--- /dev/null
+import { bench } from 'vitest'
+import { computed, reactive, readonly, shallowRef, triggerRef } from '../src'
+
+for (let amount = 1e1; amount < 1e4; amount *= 10) {
+ {
+ const rawArray = []
+ for (let i = 0, n = amount; i < n; i++) {
+ rawArray.push(i)
+ }
+ const r = reactive(rawArray)
+ const c = computed(() => {
+ return r.reduce((v, a) => a + v, 0)
+ })
+
+ bench(`reduce *reactive* array, ${amount} elements`, () => {
+ for (let i = 0, n = r.length; i < n; i++) {
+ r[i]++
+ }
+ c.value
+ })
+ }
+
+ {
+ const rawArray = []
+ for (let i = 0, n = amount; i < n; i++) {
+ rawArray.push(i)
+ }
+ const r = reactive(rawArray)
+ const c = computed(() => {
+ return r.reduce((v, a) => a + v, 0)
+ })
+
+ bench(
+ `reduce *reactive* array, ${amount} elements, only change first value`,
+ () => {
+ r[0]++
+ c.value
+ }
+ )
+ }
+
+ {
+ const rawArray = []
+ for (let i = 0, n = amount; i < n; i++) {
+ rawArray.push(i)
+ }
+ const r = reactive({ arr: readonly(rawArray) })
+ const c = computed(() => {
+ return r.arr.reduce((v, a) => a + v, 0)
+ })
+
+ bench(`reduce *readonly* array, ${amount} elements`, () => {
+ r.arr = r.arr.map(v => v + 1)
+ c.value
+ })
+ }
+
+ {
+ const rawArray = []
+ for (let i = 0, n = amount; i < n; i++) {
+ rawArray.push(i)
+ }
+ const r = shallowRef(rawArray)
+ const c = computed(() => {
+ return r.value.reduce((v, a) => a + v, 0)
+ })
+
+ bench(`reduce *raw* array, copied, ${amount} elements`, () => {
+ r.value = r.value.map(v => v + 1)
+ c.value
+ })
+ }
+
+ {
+ const rawArray: number[] = []
+ for (let i = 0, n = amount; i < n; i++) {
+ rawArray.push(i)
+ }
+ const r = shallowRef(rawArray)
+ const c = computed(() => {
+ return r.value.reduce((v, a) => a + v, 0)
+ })
+
+ bench(`reduce *raw* array, manually triggered, ${amount} elements`, () => {
+ for (let i = 0, n = rawArray.length; i < n; i++) {
+ rawArray[i]++
+ }
+ triggerRef(r)
+ c.value
+ })
+ }
+}
--- /dev/null
+import { bench } from 'vitest'
+import { reactive, computed, ComputedRef } from '../src'
+
+function createMap(obj: Record<string, any>) {
+ const map = new Map()
+ for (const key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ map.set(key, obj[key])
+ }
+ }
+ return map
+}
+
+bench('create reactive map', () => {
+ reactive(createMap({ a: 1 }))
+})
+
+{
+ let i = 0
+ const r = reactive(createMap({ a: 1 }))
+ bench('write reactive map property', () => {
+ r.set('a', i++)
+ })
+}
+
+{
+ const r = reactive(createMap({ a: 1 }))
+ computed(() => {
+ return r.get('a') * 2
+ })
+ let i = 0
+ bench("write reactive map, don't read computed (never invoked)", () => {
+ r.set('a', i++)
+ })
+}
+
+{
+ const r = reactive(createMap({ a: 1 }))
+ const c = computed(() => {
+ return r.get('a') * 2
+ })
+ c.value
+ let i = 0
+ bench("write reactive map, don't read computed (invoked)", () => {
+ r.set('a', i++)
+ })
+}
+
+{
+ const r = reactive(createMap({ a: 1 }))
+ const c = computed(() => {
+ return r.get('a') * 2
+ })
+ let i = 0
+ bench('write reactive map, read computed', () => {
+ r.set('a', i++)
+ c.value
+ })
+}
+
+{
+ const _m = new Map()
+ for (let i = 0; i < 10000; i++) {
+ _m.set(i, i)
+ }
+ const r = reactive(_m)
+ const c = computed(() => {
+ let total = 0
+ r.forEach((value, key) => {
+ total += value
+ })
+ return total
+ })
+ bench("write reactive map (10'000 items), read computed", () => {
+ r.set(5000, r.get(5000) + 1)
+ c.value
+ })
+}
+
+{
+ const r = reactive(createMap({ a: 1 }))
+ const computeds = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ const c = computed(() => {
+ return r.get('a') * 2
+ })
+ computeds.push(c)
+ }
+ let i = 0
+ bench("write reactive map, don't read 1000 computeds (never invoked)", () => {
+ r.set('a', i++)
+ })
+}
+
+{
+ const r = reactive(createMap({ a: 1 }))
+ const computeds = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ const c = computed(() => {
+ return r.get('a') * 2
+ })
+ c.value
+ computeds.push(c)
+ }
+ let i = 0
+ bench("write reactive map, don't read 1000 computeds (invoked)", () => {
+ r.set('a', i++)
+ })
+}
+
+{
+ const r = reactive(createMap({ a: 1 }))
+ const computeds: ComputedRef<number>[] = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ const c = computed(() => {
+ return r.get('a') * 2
+ })
+ computeds.push(c)
+ }
+ let i = 0
+ bench('write reactive map, read 1000 computeds', () => {
+ r.set('a', i++)
+ computeds.forEach(c => c.value)
+ })
+}
+
+{
+ const reactives: Map<any, any>[] = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ reactives.push(reactive(createMap({ a: i })))
+ }
+ const c = computed(() => {
+ let total = 0
+ reactives.forEach(r => (total += r.get('a')))
+ return total
+ })
+ let i = 0
+ const n = reactives.length
+ bench('1000 reactive maps, 1 computed', () => {
+ reactives[i++ % n].set('a', reactives[i++ % n].get('a') + 1)
+ c.value
+ })
+}
--- /dev/null
+import { bench } from 'vitest'
+import { ComputedRef, computed, reactive } from '../src'
+
+bench('create reactive obj', () => {
+ reactive({ a: 1 })
+})
+
+{
+ let i = 0
+ const r = reactive({ a: 1 })
+ bench('write reactive obj property', () => {
+ r.a = i++
+ })
+}
+
+{
+ const r = reactive({ a: 1 })
+ computed(() => {
+ return r.a * 2
+ })
+ let i = 0
+ bench("write reactive obj, don't read computed (never invoked)", () => {
+ r.a = i++
+ })
+}
+
+{
+ const r = reactive({ a: 1 })
+ const c = computed(() => {
+ return r.a * 2
+ })
+ c.value
+ let i = 0
+ bench("write reactive obj, don't read computed (invoked)", () => {
+ r.a = i++
+ })
+}
+
+{
+ const r = reactive({ a: 1 })
+ const c = computed(() => {
+ return r.a * 2
+ })
+ let i = 0
+ bench('write reactive obj, read computed', () => {
+ r.a = i++
+ c.value
+ })
+}
+
+{
+ const r = reactive({ a: 1 })
+ const computeds = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ const c = computed(() => {
+ return r.a * 2
+ })
+ computeds.push(c)
+ }
+ let i = 0
+ bench("write reactive obj, don't read 1000 computeds (never invoked)", () => {
+ r.a = i++
+ })
+}
+
+{
+ const r = reactive({ a: 1 })
+ const computeds = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ const c = computed(() => {
+ return r.a * 2
+ })
+ c.value
+ computeds.push(c)
+ }
+ let i = 0
+ bench("write reactive obj, don't read 1000 computeds (invoked)", () => {
+ r.a = i++
+ })
+}
+
+{
+ const r = reactive({ a: 1 })
+ const computeds: ComputedRef<number>[] = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ const c = computed(() => {
+ return r.a * 2
+ })
+ computeds.push(c)
+ }
+ let i = 0
+ bench('write reactive obj, read 1000 computeds', () => {
+ r.a = i++
+ computeds.forEach(c => c.value)
+ })
+}
+
+{
+ const reactives: Record<string, number>[] = []
+ for (let i = 0, n = 1000; i < n; i++) {
+ reactives.push(reactive({ a: i }))
+ }
+ const c = computed(() => {
+ let total = 0
+ reactives.forEach(r => (total += r.a))
+ return total
+ })
+ let i = 0
+ const n = reactives.length
+ bench('1000 reactive objs, 1 computed', () => {
+ reactives[i++ % n].a++
+ c.value
+ })
+}
--- /dev/null
+import { describe, bench } from 'vitest'
+import { ref } from '../src/index'
+
+describe('ref', () => {
+ bench('create ref', () => {
+ ref(100)
+ })
+
+ {
+ let i = 0
+ const v = ref(100)
+ bench('write ref', () => {
+ v.value = i++
+ })
+ }
+
+ {
+ const v = ref(100)
+ bench('read ref', () => {
+ v.value
+ })
+ }
+
+ {
+ let i = 0
+ const v = ref(100)
+ bench('write/read ref', () => {
+ v.value = i++
+
+ v.value
+ })
+ }
+})
--- /dev/null
+import { nextTick, ref, watch, watchEffect } from '../src'
+import { bench } from 'vitest'
+
+bench('create watcher', () => {
+ const v = ref(100)
+ watch(v, v => {})
+})
+
+{
+ const v = ref(100)
+ watch(v, v => {})
+ let i = 0
+ bench('update ref to trigger watcher (scheduled but not executed)', () => {
+ v.value = i++
+ })
+}
+
+{
+ const v = ref(100)
+ watch(v, v => {})
+ let i = 0
+ bench('update ref to trigger watcher (executed)', async () => {
+ v.value = i++
+ return nextTick()
+ })
+}
+
+{
+ bench('create watchEffect', () => {
+ watchEffect(() => {})
+ })
+}
+
+{
+ const v = ref(100)
+ watchEffect(() => {
+ v.value
+ })
+ let i = 0
+ bench(
+ 'update ref to trigger watchEffect (scheduled but not executed)',
+ () => {
+ v.value = i++
+ }
+ )
+}
+
+{
+ const v = ref(100)
+ watchEffect(() => {
+ v.value
+ })
+ let i = 0
+ bench('update ref to trigger watchEffect (executed)', async () => {
+ v.value = i++
+ await nextTick()
+ })
+}
'@babel/types':
specifier: ^7.23.5
version: 7.23.5
+ '@codspeed/vitest-plugin':
+ specifier: ^2.3.1
+ version: 2.3.1(vite@5.0.6)(vitest@1.0.1)
'@rollup/plugin-alias':
specifier: ^5.0.1
version: 5.0.1(rollup@4.1.4)
specifier: ^6.13.0
version: 6.13.0(eslint@8.54.0)(typescript@5.2.2)
'@vitest/coverage-istanbul':
- specifier: ^0.34.6
- version: 0.34.6(vitest@1.0.1)
+ specifier: ^1.0.2
+ version: 1.0.2(vitest@1.0.1)
'@vue/consolidate':
specifier: 0.17.3
version: 0.17.3
version: 5.2.2
vite:
specifier: ^5.0.5
- version: 5.0.5(@types/node@20.10.3)(terser@5.22.0)
+ version: 5.0.6(@types/node@20.10.3)(terser@5.22.0)
vitest:
specifier: ^1.0.0
version: 1.0.1(@types/node@20.10.3)(jsdom@22.1.0)(terser@5.22.0)
devDependencies:
'@vitejs/plugin-vue':
specifier: ^4.4.0
- version: 4.4.0(vite@5.0.5)(vue@packages+vue)
+ version: 4.4.0(vite@5.0.6)(vue@packages+vue)
vite:
specifier: ^5.0.5
- version: 5.0.5(@types/node@20.10.3)(terser@5.22.0)
+ version: 5.0.6(@types/node@20.10.3)(terser@5.22.0)
packages/shared: {}
'@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==}
+ dependencies:
+ find-up: 6.3.0
+ node-gyp-build: 4.7.1
+ dev: true
+
+ /@codspeed/vitest-plugin@2.3.1(vite@5.0.6)(vitest@1.0.1):
+ resolution: {integrity: sha512-/e4G2B/onX/hG/EjUU/NpDxnIryeTDamVRTBeWfgQDoex3g7GDzTwoQktaU5l/Asw3ZjEErQg+oQVToQ6jYZlA==}
+ peerDependencies:
+ vite: ^4.2.0 || ^5.0.0
+ vitest: '>=1.0.0-beta.4 || >=1'
+ dependencies:
+ '@codspeed/core': 2.3.1
+ vite: 5.0.6(@types/node@20.10.3)(terser@5.22.0)
+ vitest: 1.0.1(@types/node@20.10.3)(jsdom@22.1.0)(terser@5.22.0)
+ dev: true
+
/@esbuild/android-arm64@0.18.20:
resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==}
engines: {node: '>=12'}
resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==}
dev: true
- /@types/semver@7.5.4:
- resolution: {integrity: sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==}
+ /@types/semver@7.5.5:
+ resolution: {integrity: sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg==}
dev: true
/@types/yauzl@2.10.2:
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@8.54.0)
'@types/json-schema': 7.0.14
- '@types/semver': 7.5.4
+ '@types/semver': 7.5.5
'@typescript-eslint/scope-manager': 5.62.0
'@typescript-eslint/types': 5.62.0
'@typescript-eslint/typescript-estree': 5.62.0(typescript@5.2.2)
resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
dev: true
- /@vitejs/plugin-vue@4.4.0(vite@5.0.5)(vue@packages+vue):
+ /@vitejs/plugin-vue@4.4.0(vite@5.0.6)(vue@packages+vue):
resolution: {integrity: sha512-xdguqb+VUwiRpSg+nsc2HtbAUSGak25DXYvpQQi4RVU1Xq1uworyoH/md9Rfd8zMmPR/pSghr309QNcftUVseg==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
vite: ^4.0.0
vue: ^3.2.25
dependencies:
- vite: 5.0.5(@types/node@20.10.3)(terser@5.22.0)
+ vite: 5.0.6(@types/node@20.10.3)(terser@5.22.0)
vue: link:packages/vue
dev: true
- /@vitest/coverage-istanbul@0.34.6(vitest@1.0.1):
- resolution: {integrity: sha512-5KaBNZPDSk2ybavC3rZ1pWGniw7sJ5usuwVGRUYzJwiBfWvnLpuUer7bjw7qUCRGdKJXrBgb/Dsgif9rkwMX/A==}
+ /@vitest/coverage-istanbul@1.0.2(vitest@1.0.1):
+ resolution: {integrity: sha512-HZk0VYYvLrUX/TExxxVT7DwowqjJXmm4LbKGYBLN9HwYZe50nGYU3K/KisnOY7lgt0+Po4MLVa2fXe2ediyr9g==}
peerDependencies:
- vitest: '>=0.32.0 <1'
+ vitest: ^1.0.0
dependencies:
- istanbul-lib-coverage: 3.2.0
+ 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-reports: 3.1.6
+ magicast: 0.3.2
picocolors: 1.0.0
test-exclude: 6.0.0
vitest: 1.0.1(@types/node@20.10.3)(jsdom@22.1.0)(terser@5.22.0)
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
dev: true
- /istanbul-lib-coverage@3.2.0:
- resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
+ /istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
engines: {node: '>=8'}
dev: true
'@babel/core': 7.23.5
'@babel/parser': 7.23.5
'@istanbuljs/schema': 0.1.3
- istanbul-lib-coverage: 3.2.0
+ istanbul-lib-coverage: 3.2.2
semver: 7.5.4
transitivePeerDependencies:
- supports-color
resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
engines: {node: '>=10'}
dependencies:
- istanbul-lib-coverage: 3.2.0
+ istanbul-lib-coverage: 3.2.2
make-dir: 4.0.0
supports-color: 7.2.0
dev: true
engines: {node: '>=10'}
dependencies:
debug: 4.3.4
- istanbul-lib-coverage: 3.2.0
+ istanbul-lib-coverage: 3.2.2
source-map: 0.6.1
transitivePeerDependencies:
- supports-color
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
+ /magicast@0.3.2:
+ resolution: {integrity: sha512-Fjwkl6a0syt9TFN0JSYpOybxiMCkYNEeOTnOTNRbjphirLakznZXAqrXgj/7GG3D1dvETONNwrBfinvAbpunDg==}
+ dependencies:
+ '@babel/parser': 7.23.5
+ '@babel/types': 7.23.5
+ source-map-js: 1.0.2
+ dev: true
+
/make-dir@4.0.0:
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
engines: {node: '>=10'}
whatwg-url: 5.0.0
dev: true
+ /node-gyp-build@4.7.1:
+ resolution: {integrity: sha512-wTSrZ+8lsRRa3I3H8Xr65dLWSgCvY2l4AOnaeKdPA9TB/WYMPaTcrzf3rXvFoVvjKNVnu0CcWSx54qq9GKRUYg==}
+ hasBin: true
+ dev: true
+
/node-releases@2.0.13:
resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==}
dev: true
debug: 4.3.4
pathe: 1.1.1
picocolors: 1.0.0
- vite: 5.0.5(@types/node@20.10.3)(terser@5.22.0)
+ vite: 5.0.6(@types/node@20.10.3)(terser@5.22.0)
transitivePeerDependencies:
- '@types/node'
- less
- terser
dev: true
- /vite@5.0.5(@types/node@20.10.3)(terser@5.22.0):
- resolution: {integrity: sha512-OekeWqR9Ls56f3zd4CaxzbbS11gqYkEiBtnWFFgYR2WV8oPJRRKq0mpskYy/XaoCL3L7VINDhqqOMNDiYdGvGg==}
+ /vite@5.0.6(@types/node@20.10.3)(terser@5.22.0):
+ resolution: {integrity: sha512-MD3joyAEBtV7QZPl2JVVUai6zHms3YOmLR+BpMzLlX2Yzjfcc4gTgNi09d/Rua3F4EtC8zdwPU8eQYyib4vVMQ==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
peerDependencies:
strip-literal: 1.3.0
tinybench: 2.5.1
tinypool: 0.8.1
- vite: 5.0.5(@types/node@20.10.3)(terser@5.22.0)
+ vite: 5.0.6(@types/node@20.10.3)(terser@5.22.0)
vite-node: 1.0.1(@types/node@20.10.3)(terser@5.22.0)
why-is-node-running: 2.2.2
transitivePeerDependencies:
-import { configDefaults, defineConfig, UserConfig } from 'vitest/config'
+import { configDefaults, defineConfig } from 'vitest/config'
import { entries } from './scripts/aliases.js'
+import codspeedPlugin from '@codspeed/vitest-plugin'
export default defineConfig({
define: {
resolve: {
alias: entries
},
+ plugins: [codspeedPlugin()],
test: {
globals: true,
// disable threads on GH actions to speed it up
- threads: !process.env.GITHUB_ACTIONS,
setupFiles: 'scripts/setupVitest.ts',
environmentMatchGlobs: [
['packages/{vue,vue-compat,runtime-dom}/**', 'jsdom']
]
}
}
-}) as UserConfig
+})