diff --git a/package.json b/package.json index cd9c8501..e332046c 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "type-fest": "5.2.0", "typescript": "5.9.3", "typescript-eslint": "8.46.3", - "vitest": "3.2.4" + "vitest": "4.0.8" }, "dependencies": { "next": "15.5.6" diff --git a/packages/lib/src/utils/picker.test.tsx b/packages/lib/src/utils/picker.test.tsx index cdfd55fc..af1a890b 100644 --- a/packages/lib/src/utils/picker.test.tsx +++ b/packages/lib/src/utils/picker.test.tsx @@ -55,11 +55,14 @@ const mockPicker = () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any .spyOn(pc as any, 'Picker') // eslint-disable-next-line @typescript-eslint/no-explicit-any - .mockImplementation((): any => ({ - prepare: prepareSpy, - getSelectionAsync: getSelectionSpy, - resize: resizeSpy, - })); + .mockImplementation(function MockPicker(this: unknown, ...args: unknown[]): any { + void args; + return { + prepare: prepareSpy, + getSelectionAsync: getSelectionSpy, + resize: resizeSpy, + }; + }); return { prepareSpy, getSelectionSpy, resizeSpy, pickerCtorSpy }; }; @@ -124,11 +127,13 @@ describe('usePicker', () => { // Capture ResizeObserver callbacks const observedCallbacks: Array<() => void> = []; - const RO = vi.fn().mockImplementation((cb: () => void) => ({ - observe: vi.fn(() => observedCallbacks.push(cb)), - unobserve: vi.fn(), - disconnect: vi.fn(), - })); + const RO = vi.fn(function MockResizeObserver(this: unknown, cb: () => void) { + return { + observe: vi.fn(() => observedCallbacks.push(cb)), + unobserve: vi.fn(), + disconnect: vi.fn(), + }; + }); (globalThis as unknown as { ResizeObserver: unknown }).ResizeObserver = RO as unknown; const canvas = createTestCanvas(); diff --git a/packages/lib/test/setup.ts b/packages/lib/test/setup.ts index d71c13f0..0d66bcf2 100644 --- a/packages/lib/test/setup.ts +++ b/packages/lib/test/setup.ts @@ -69,7 +69,8 @@ const createTestApp = (actual: typeof playcanvas) => { vi.mock('playcanvas', async () => { const actual = await vi.importActual('playcanvas'); - const MockApplication = vi.fn().mockImplementation(() => { + const MockApplication = vi.fn(function MockApplication(this: unknown, ...args: unknown[]) { + void args; return createTestApp(actual); }); @@ -80,8 +81,11 @@ vi.mock('playcanvas', async () => { }); // Mock ResizeObserver -global.ResizeObserver = vi.fn().mockImplementation(() => ({ - observe: vi.fn(), - unobserve: vi.fn(), - disconnect: vi.fn(), -})); \ No newline at end of file +global.ResizeObserver = vi.fn(function MockResizeObserver(this: unknown, ...args: unknown[]) { + void args; + return { + observe: vi.fn(), + unobserve: vi.fn(), + disconnect: vi.fn(), + }; +}); \ No newline at end of file diff --git a/packages/lib/test/utils/mock.ts b/packages/lib/test/utils/mock.ts index 533efcb2..a1906adb 100644 --- a/packages/lib/test/utils/mock.ts +++ b/packages/lib/test/utils/mock.ts @@ -136,11 +136,16 @@ export const mockPlayCanvas = () => { FILLMODE_KEEP_ASPECT: 'KEEP_ASPECT', RESOLUTION_AUTO: 'AUTO', RESOLUTION_FIXED: 'FIXED', - Application: vi.fn().mockImplementation(() => mockApp), + Application: vi.fn(function MockApplication(this: unknown, ...args: unknown[]) { + void args; + return mockApp; + }), Mouse: vi.fn(), TouchDevice: vi.fn(), Entity: vi.fn(), - NullGraphicsDevice: vi.fn().mockImplementation((canvas) => new NullGraphicsDevice(canvas)) + NullGraphicsDevice: vi.fn(function MockNullGraphicsDevice(this: unknown, canvas: HTMLCanvasElement) { + return new NullGraphicsDevice(canvas); + }) }; }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b058d726..232696cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,8 +58,8 @@ importers: specifier: 8.46.3 version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) vitest: - specifier: 3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.19.0)(jiti@2.6.1)(jsdom@27.1.0(canvas@3.1.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.19.0)(typescript@5.9.3))(yaml@2.8.1) + specifier: 4.0.8 + version: 4.0.8(@types/debug@4.1.12)(@types/node@22.19.0)(jiti@2.6.1)(jsdom@27.1.0(canvas@3.1.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.19.0)(typescript@5.9.3))(yaml@2.8.1) packages/blocks: dependencies: @@ -1520,6 +1520,9 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -1682,6 +1685,9 @@ packages: '@vitest/expect@3.2.4': resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + '@vitest/expect@4.0.8': + resolution: {integrity: sha512-Rv0eabdP/xjAHQGr8cjBm+NnLHNoL268lMDK85w2aAGLFoVKLd8QGnVon5lLtkXQCoYaNL0wg04EGnyKkkKhPA==} + '@vitest/mocker@3.2.4': resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} peerDependencies: @@ -1693,21 +1699,47 @@ packages: vite: optional: true + '@vitest/mocker@4.0.8': + resolution: {integrity: sha512-9FRM3MZCedXH3+pIh+ME5Up2NBBHDq0wqwhOKkN4VnvCiKbVxddqH9mSGPZeawjd12pCOGnl+lo/ZGHt0/dQSg==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + '@vitest/pretty-format@3.2.4': resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + '@vitest/pretty-format@4.0.8': + resolution: {integrity: sha512-qRrjdRkINi9DaZHAimV+8ia9Gq6LeGz2CgIEmMLz3sBDYV53EsnLZbJMR1q84z1HZCMsf7s0orDgZn7ScXsZKg==} + '@vitest/runner@3.2.4': resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + '@vitest/runner@4.0.8': + resolution: {integrity: sha512-mdY8Sf1gsM8hKJUQfiPT3pn1n8RF4QBcJYFslgWh41JTfrK1cbqY8whpGCFzBl45LN028g0njLCYm0d7XxSaQQ==} + '@vitest/snapshot@3.2.4': resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + '@vitest/snapshot@4.0.8': + resolution: {integrity: sha512-Nar9OTU03KGiubrIOFhcfHg8FYaRaNT+bh5VUlNz8stFhCZPNrJvmZkhsr1jtaYvuefYFwK2Hwrq026u4uPWCw==} + '@vitest/spy@3.2.4': resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + '@vitest/spy@4.0.8': + resolution: {integrity: sha512-nvGVqUunyCgZH7kmo+Ord4WgZ7lN0sOULYXUOYuHr55dvg9YvMz3izfB189Pgp28w0vWFbEEfNc/c3VTrqrXeA==} + '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + '@vitest/utils@4.0.8': + resolution: {integrity: sha512-pdk2phO5NDvEFfUTxcTP8RFYjVj/kfLSPIN5ebP2Mu9kcIMeAQTbknqcFEyBcC4z2pJlJI9aS5UQjcYfhmKAow==} + '@webgpu/types@0.1.65': resolution: {integrity: sha512-cYrHab4d6wuVvDW5tdsfI6/o6vcLMDe6w2Citd1oS51Xxu2ycLCnVo4fqwujfKWijrZMInTJIKcXxteoy21nVA==} @@ -1903,6 +1935,10 @@ packages: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} engines: {node: '>=18'} + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + engines: {node: '>=18'} + chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -2866,6 +2902,9 @@ packages: magic-string@0.30.19: resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + magicast@0.3.5: resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} @@ -3430,6 +3469,9 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -3568,6 +3610,10 @@ packages: resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + tinyspy@4.0.4: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} @@ -3809,6 +3855,40 @@ packages: jsdom: optional: true + vitest@4.0.8: + resolution: {integrity: sha512-urzu3NCEV0Qa0Y2PwvBtRgmNtxhj5t5ULw7cuKhIHh3OrkKTLlut0lnBOv9qe5OvbkMH2g38G7KPDCTpIytBVg==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/debug': ^4.1.12 + '@types/node': ^20.0.0 || ^22.0.0 || >=24.0.0 + '@vitest/browser-playwright': 4.0.8 + '@vitest/browser-preview': 4.0.8 + '@vitest/browser-webdriverio': 4.0.8 + '@vitest/ui': 4.0.8 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/debug': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + w3c-xmlserializer@5.0.0: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} @@ -5255,6 +5335,8 @@ snapshots: '@rtsao/scc@1.1.0': {} + '@standard-schema/spec@1.0.0': {} + '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -5486,6 +5568,15 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 + '@vitest/expect@4.0.8': + dependencies: + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.2 + '@vitest/spy': 4.0.8 + '@vitest/utils': 4.0.8 + chai: 6.2.1 + tinyrainbow: 3.0.3 + '@vitest/mocker@3.2.4(msw@2.11.3(@types/node@22.19.0)(typescript@5.9.3))(vite@7.1.7(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 @@ -5495,32 +5586,63 @@ snapshots: msw: 2.11.3(@types/node@22.19.0)(typescript@5.9.3) vite: 7.1.7(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1) + '@vitest/mocker@4.0.8(msw@2.11.3(@types/node@22.19.0)(typescript@5.9.3))(vite@7.1.7(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 4.0.8 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + msw: 2.11.3(@types/node@22.19.0)(typescript@5.9.3) + vite: 7.1.7(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1) + '@vitest/pretty-format@3.2.4': dependencies: tinyrainbow: 2.0.0 + '@vitest/pretty-format@4.0.8': + dependencies: + tinyrainbow: 3.0.3 + '@vitest/runner@3.2.4': dependencies: '@vitest/utils': 3.2.4 pathe: 2.0.3 strip-literal: 3.0.0 + '@vitest/runner@4.0.8': + dependencies: + '@vitest/utils': 4.0.8 + pathe: 2.0.3 + '@vitest/snapshot@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 magic-string: 0.30.19 pathe: 2.0.3 + '@vitest/snapshot@4.0.8': + dependencies: + '@vitest/pretty-format': 4.0.8 + magic-string: 0.30.21 + pathe: 2.0.3 + '@vitest/spy@3.2.4': dependencies: tinyspy: 4.0.4 + '@vitest/spy@4.0.8': {} + '@vitest/utils@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 loupe: 3.2.1 tinyrainbow: 2.0.0 + '@vitest/utils@4.0.8': + dependencies: + '@vitest/pretty-format': 4.0.8 + tinyrainbow: 3.0.3 + '@webgpu/types@0.1.65': {} acorn-jsx@5.3.2(acorn@8.15.0): @@ -5748,6 +5870,8 @@ snapshots: loupe: 3.2.1 pathval: 2.0.1 + chai@6.2.1: {} + chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -6838,6 +6962,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + magicast@0.3.5: dependencies: '@babel/parser': 7.28.4 @@ -7504,6 +7632,8 @@ snapshots: statuses@2.0.2: optional: true + std-env@3.10.0: {} + std-env@3.9.0: {} stop-iteration-iterator@1.1.0: @@ -7659,6 +7789,8 @@ snapshots: tinyrainbow@2.0.0: {} + tinyrainbow@3.0.3: {} + tinyspy@4.0.4: {} tldts-core@7.0.15: {} @@ -7914,6 +8046,46 @@ snapshots: - tsx - yaml + vitest@4.0.8(@types/debug@4.1.12)(@types/node@22.19.0)(jiti@2.6.1)(jsdom@27.1.0(canvas@3.1.0)(postcss@8.5.6))(lightningcss@1.30.2)(msw@2.11.3(@types/node@22.19.0)(typescript@5.9.3))(yaml@2.8.1): + dependencies: + '@vitest/expect': 4.0.8 + '@vitest/mocker': 4.0.8(msw@2.11.3(@types/node@22.19.0)(typescript@5.9.3))(vite@7.1.7(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1)) + '@vitest/pretty-format': 4.0.8 + '@vitest/runner': 4.0.8 + '@vitest/snapshot': 4.0.8 + '@vitest/spy': 4.0.8 + '@vitest/utils': 4.0.8 + debug: 4.4.3 + es-module-lexer: 1.7.0 + expect-type: 1.2.2 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.1.7(@types/node@22.19.0)(jiti@2.6.1)(lightningcss@1.30.2)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 22.19.0 + jsdom: 27.1.0(canvas@3.1.0)(postcss@8.5.6) + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0