From e0f1717258cdfec7df53e178ff532f1dba2ad86c Mon Sep 17 00:00:00 2001 From: teleskop150750 Date: Thu, 3 Apr 2025 08:56:31 +0300 Subject: [PATCH] feat: drop vue 2 support --- packages/vue-store/package.json | 22 ++------ packages/vue-store/src/index.ts | 37 +++++-------- packages/vue-store/tests/index.test.tsx | 2 +- packages/vue-store/tests/test.test-d.ts | 2 +- pnpm-lock.yaml | 72 ------------------------- 5 files changed, 20 insertions(+), 115 deletions(-) diff --git a/packages/vue-store/package.json b/packages/vue-store/package.json index 340d763..8ccf996 100644 --- a/packages/vue-store/package.json +++ b/packages/vue-store/package.json @@ -28,11 +28,7 @@ "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js", "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js", "test:types:ts54": "tsc", - "test:lib": "pnpm run test:lib:3", - "test:lib:2": "vue-demi-switch 2 vue2 && vitest", - "test:lib:2.7": "vue-demi-switch 2.7 vue2.7 && vitest", - "test:lib:3": "vue-demi-switch 3 && vitest", - "test:lib:fixme": "pnpm run test:lib:2 && pnpm run test:lib:2.7 && pnpm run test:lib:3", + "test:lib": "vitest", "test:lib:dev": "pnpm run test:lib --watch", "test:build": "publint --strict", "build": "vite build" @@ -60,24 +56,14 @@ "src" ], "dependencies": { - "@tanstack/store": "workspace:*", - "vue-demi": "^0.14.10" + "@tanstack/store": "workspace:*" }, "devDependencies": { "@testing-library/vue": "^8.1.0", "@vitejs/plugin-vue": "^5.2.3", - "@vue/composition-api": "^1.7.2", - "vue": "^3.5.13", - "vue2": "npm:vue@2.6", - "vue2.7": "npm:vue@2.7" + "vue": "^3.5.13" }, "peerDependencies": { - "@vue/composition-api": "^1.2.1", - "vue": "^2.5.0 || ^3.0.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } + "vue": "^3.0.0" } } diff --git a/packages/vue-store/src/index.ts b/packages/vue-store/src/index.ts index 0d3dfaa..500bea5 100644 --- a/packages/vue-store/src/index.ts +++ b/packages/vue-store/src/index.ts @@ -1,6 +1,6 @@ -import { readonly, ref, toRaw, watch } from 'vue-demi' +import { onScopeDispose, shallowRef } from 'vue' import type { Derived, Store } from '@tanstack/store' -import type { Ref } from 'vue-demi' +import type { Ref } from 'vue' export * from '@tanstack/store' @@ -21,27 +21,18 @@ export function useStore>( store: Store | Derived, selector: (state: NoInfer) => TSelected = (d) => d as any, ): Readonly> { - const slice = ref(selector(store.state)) as Ref + const slice = shallowRef(selector(store.state)) as Ref - watch( - () => store, - (value, _oldValue, onCleanup) => { - const unsub = value.subscribe(() => { - const data = selector(value.state) - if (shallow(toRaw(slice.value), data)) { - return - } - slice.value = data - }) + const unsub = store.subscribe(() => { + const newValue = selector(store.state) + if (shallow(slice.value, newValue)) return - onCleanup(() => { - unsub() - }) - }, - { immediate: true }, - ) + slice.value = newValue + }) - return readonly(slice) as never + onScopeDispose(unsub) + + return slice } export function shallow(objA: T, objB: T) { @@ -79,10 +70,10 @@ export function shallow(objA: T, objB: T) { return false } - for (let i = 0; i < keysA.length; i++) { + for (const keyA of keysA) { if ( - !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) || - !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof T]) + !Object.prototype.hasOwnProperty.call(objB, keyA) || + !Object.is(objA[keyA as keyof T], objB[keyA as keyof T]) ) { return false } diff --git a/packages/vue-store/tests/index.test.tsx b/packages/vue-store/tests/index.test.tsx index cca51b6..9db947e 100644 --- a/packages/vue-store/tests/index.test.tsx +++ b/packages/vue-store/tests/index.test.tsx @@ -1,6 +1,6 @@ import { describe, expect, it, test, vi } from 'vitest' // @ts-expect-error We need to import `h` as it's part of Vue's JSX transform -import { defineComponent, h } from 'vue-demi' +import { defineComponent, h } from 'vue' import { render, waitFor } from '@testing-library/vue' import { Store } from '@tanstack/store' import { userEvent } from '@testing-library/user-event' diff --git a/packages/vue-store/tests/test.test-d.ts b/packages/vue-store/tests/test.test-d.ts index 6c53f9c..a8cb7c6 100644 --- a/packages/vue-store/tests/test.test-d.ts +++ b/packages/vue-store/tests/test.test-d.ts @@ -1,6 +1,6 @@ import { expectTypeOf, test } from 'vitest' import { Derived, Store, useStore } from '../src' -import type { Ref } from 'vue-demi' +import type { Ref } from 'vue' test('useStore works with derived state', () => { const store = new Store(12) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1b4b8f..5ff3588 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -356,9 +356,6 @@ importers: '@tanstack/store': specifier: workspace:* version: link:../store - vue-demi: - specifier: ^0.14.10 - version: 0.14.10(@vue/composition-api@1.7.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3)) devDependencies: '@testing-library/vue': specifier: ^8.1.0 @@ -366,18 +363,9 @@ importers: '@vitejs/plugin-vue': specifier: ^5.2.3 version: 5.2.3(vite@6.2.4(@types/node@22.13.14)(jiti@2.4.2)(less@4.2.2)(sass@1.86.1)(terser@5.39.0)(tsx@4.19.3)(yaml@2.7.1))(vue@3.5.13(typescript@5.6.3)) - '@vue/composition-api': - specifier: ^1.7.2 - version: 1.7.2(vue@3.5.13(typescript@5.6.3)) vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.6.3) - vue2: - specifier: npm:vue@2.6 - version: vue@2.6.14 - vue2.7: - specifier: npm:vue@2.7 - version: vue@2.7.16 packages: @@ -3066,9 +3054,6 @@ packages: '@vue/compiler-dom@3.5.13': resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} - '@vue/compiler-sfc@2.7.16': - resolution: {integrity: sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==} - '@vue/compiler-sfc@3.5.13': resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} @@ -3078,11 +3063,6 @@ packages: '@vue/compiler-vue2@2.7.16': resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} - '@vue/composition-api@1.7.2': - resolution: {integrity: sha512-M8jm9J/laYrYT02665HkZ5l2fWTK4dcVg3BsDHm/pfz+MjDYwX+9FUaZyGwEyXEDonQYRCo0H7aLgdklcIELjw==} - peerDependencies: - vue: '>= 2.5 < 2.7' - '@vue/language-core@2.1.6': resolution: {integrity: sha512-MW569cSky9R/ooKMh6xa2g1D0AtRKbL56k83dzus/bx//RDJk24RHWkMzbAlXjMdDNyxAaagKPRquBIxkxlCkg==} peerDependencies: @@ -5790,11 +5770,6 @@ packages: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - prettier@3.5.3: resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} @@ -6970,17 +6945,6 @@ packages: vue-component-type-helpers@2.2.8: resolution: {integrity: sha512-4bjIsC284coDO9om4HPA62M7wfsTvcmZyzdfR0aUlFXqq4tXxM1APyXpNVxPC8QazKw9OhmZNHBVDA6ODaZsrA==} - vue-demi@0.14.10: - resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} - engines: {node: '>=12'} - hasBin: true - peerDependencies: - '@vue/composition-api': ^1.0.0-rc.1 - vue: ^3.0.0-0 || ^2.6.0 - peerDependenciesMeta: - '@vue/composition-api': - optional: true - vue-eslint-parser@9.4.3: resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==} engines: {node: ^14.17.0 || >=16.0.0} @@ -6993,14 +6957,6 @@ packages: peerDependencies: typescript: '>=5.0.0' - vue@2.6.14: - resolution: {integrity: sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==} - deprecated: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details. - - vue@2.7.16: - resolution: {integrity: sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==} - deprecated: Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details. - vue@3.5.13: resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} peerDependencies: @@ -10175,14 +10131,6 @@ snapshots: '@vue/compiler-core': 3.5.13 '@vue/shared': 3.5.13 - '@vue/compiler-sfc@2.7.16': - dependencies: - '@babel/parser': 7.27.0 - postcss: 8.5.3 - source-map: 0.6.1 - optionalDependencies: - prettier: 2.8.8 - '@vue/compiler-sfc@3.5.13': dependencies: '@babel/parser': 7.27.0 @@ -10205,10 +10153,6 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/composition-api@1.7.2(vue@3.5.13(typescript@5.6.3))': - dependencies: - vue: 3.5.13(typescript@5.6.3) - '@vue/language-core@2.1.6(typescript@5.6.3)': dependencies: '@volar/language-core': 2.4.12 @@ -13256,9 +13200,6 @@ snapshots: prettier: 3.5.3 svelte: 5.25.5 - prettier@2.8.8: - optional: true - prettier@3.5.3: {} pretty-format@27.5.1: @@ -14486,12 +14427,6 @@ snapshots: vue-component-type-helpers@2.2.8: {} - vue-demi@0.14.10(@vue/composition-api@1.7.2(vue@3.5.13(typescript@5.6.3)))(vue@3.5.13(typescript@5.6.3)): - dependencies: - vue: 3.5.13(typescript@5.6.3) - optionalDependencies: - '@vue/composition-api': 1.7.2(vue@3.5.13(typescript@5.6.3)) - vue-eslint-parser@9.4.3(eslint@9.23.0(jiti@2.4.2)): dependencies: debug: 4.4.0 @@ -14511,13 +14446,6 @@ snapshots: '@vue/language-core': 2.2.8(typescript@5.6.3) typescript: 5.6.3 - vue@2.6.14: {} - - vue@2.7.16: - dependencies: - '@vue/compiler-sfc': 2.7.16 - csstype: 3.1.3 - vue@3.5.13(typescript@5.6.3): dependencies: '@vue/compiler-dom': 3.5.13