From e2807e42bc80537215527be7320322fb5c8ea70f Mon Sep 17 00:00:00 2001 From: huxiyang3 <1872591453@qq.com> Date: Mon, 11 Aug 2025 20:00:40 +0800 Subject: [PATCH 1/4] fix: sync relative CI --- .github/workflows/sync-h5.yml | 2 +- .github/workflows/sync-taro.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sync-h5.yml b/.github/workflows/sync-h5.yml index 193ebdd79..09f83e98e 100644 --- a/.github/workflows/sync-h5.yml +++ b/.github/workflows/sync-h5.yml @@ -38,6 +38,6 @@ jobs: branch: new-site # action 应该部署到的分支 。 folder: site_docs #操作应该部署的文件夹 。 clean: false - repository-name: jd-opensource/nutui-docs + repository-name: jdf2e/nutui-docs token: ${{ secrets.GIT_ACTION }} target-folder: src/docs_vue diff --git a/.github/workflows/sync-taro.yml b/.github/workflows/sync-taro.yml index 85812bf7b..7f461680c 100644 --- a/.github/workflows/sync-taro.yml +++ b/.github/workflows/sync-taro.yml @@ -38,6 +38,6 @@ jobs: branch: new-site # action 应该部署到的分支 。 folder: site_docs #操作应该部署的文件夹 。 clean: false - repository-name: jd-opensource/nutui-docs + repository-name: jdfe/nutui-docs token: ${{ secrets.GIT_ACTION }} target-folder: src/docs_vue_taro -- Gitee From fa4ccbee7b76bcc8b5fdff3713130fb0c5b4365e Mon Sep 17 00:00:00 2001 From: huxiyang3 <1872591453@qq.com> Date: Tue, 12 Aug 2025 09:38:11 +0800 Subject: [PATCH 2/4] fix: sync relative CI --- .github/workflows/sync-taro.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/sync-taro.yml b/.github/workflows/sync-taro.yml index 7f461680c..bf5dc949e 100644 --- a/.github/workflows/sync-taro.yml +++ b/.github/workflows/sync-taro.yml @@ -38,6 +38,6 @@ jobs: branch: new-site # action 应该部署到的分支 。 folder: site_docs #操作应该部署的文件夹 。 clean: false - repository-name: jdfe/nutui-docs + repository-name: jdf2e/nutui-docs token: ${{ secrets.GIT_ACTION }} target-folder: src/docs_vue_taro -- Gitee From a5f1a69eb94c1363926dbcf16b626d1ea8d5dde1 Mon Sep 17 00:00:00 2001 From: huxiyang3 <1872591453@qq.com> Date: Tue, 12 Aug 2025 09:47:28 +0800 Subject: [PATCH 3/4] fix: test env --- .../__tests__/avatarcropper.spec.ts | 1 - test-setup.ts | 111 ++++++++++++++++++ vite.config.ts | 3 +- 3 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 test-setup.ts diff --git a/src/packages/__VUE/avatarcropper/__tests__/avatarcropper.spec.ts b/src/packages/__VUE/avatarcropper/__tests__/avatarcropper.spec.ts index 7a8a412fc..46fd39b96 100644 --- a/src/packages/__VUE/avatarcropper/__tests__/avatarcropper.spec.ts +++ b/src/packages/__VUE/avatarcropper/__tests__/avatarcropper.spec.ts @@ -1,4 +1,3 @@ -import 'vitest-canvas-mock' import { mount } from '@vue/test-utils' import { AvatarCropper } from '@nutui/nutui' import { sleep, trigger, triggerDrag } from '@/packages/utils/unit' diff --git a/test-setup.ts b/test-setup.ts new file mode 100644 index 000000000..00b3de27e --- /dev/null +++ b/test-setup.ts @@ -0,0 +1,111 @@ +// Mock Canvas API for Vitest +import { vi } from 'vitest' + +// Mock HTMLCanvasElement.getContext +Object.defineProperty(HTMLCanvasElement.prototype, 'getContext', { + value: vi.fn(() => ({ + fillRect: vi.fn(), + clearRect: vi.fn(), + getImageData: vi.fn(() => ({ + data: new Array(4) + })), + putImageData: vi.fn(), + createImageData: vi.fn(() => []), + setTransform: vi.fn(), + drawImage: vi.fn(), + save: vi.fn(), + fillText: vi.fn(), + restore: vi.fn(), + beginPath: vi.fn(), + moveTo: vi.fn(), + lineTo: vi.fn(), + closePath: vi.fn(), + stroke: vi.fn(), + translate: vi.fn(), + scale: vi.fn(), + rotate: vi.fn(), + arc: vi.fn(), + fill: vi.fn(), + measureText: vi.fn(() => ({ width: 0 })), + transform: vi.fn(), + rect: vi.fn(), + clip: vi.fn() + })), + writable: true, + configurable: true +}) + +// Mock HTMLCanvasElement.toDataURL +Object.defineProperty(HTMLCanvasElement.prototype, 'toDataURL', { + value: vi.fn(() => 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=='), + writable: true, + configurable: true +}) + +// Mock HTMLCanvasElement.toBlob +Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', { + value: vi.fn((callback) => { + const blob = new Blob([''], { type: 'image/png' }) + callback(blob) + }), + writable: true, + configurable: true +}) + +// Mock window.devicePixelRatio +Object.defineProperty(window, 'devicePixelRatio', { + value: 1, + writable: true, + configurable: true +}) + +// Mock Image constructor +global.Image = class MockImage { + onload: (() => void) | null = null + onerror: (() => void) | null = null + src = '' + crossOrigin = '' + referrerPolicy = '' + width = 0 + height = 0 + + constructor() { + setTimeout(() => { + if (this.onload) { + this.onload() + } + }, 0) + } +} as any + +// Mock createImageBitmap +global.createImageBitmap = vi.fn(() => Promise.resolve({ + width: 100, + height: 100, + close: vi.fn() +})) + +// Mock OffscreenCanvas +global.OffscreenCanvas = class MockOffscreenCanvas { + width: number + height: number + + constructor(width: number, height: number) { + this.width = width + this.height = height + } + + getContext() { + return { + fillRect: vi.fn(), + clearRect: vi.fn(), + drawImage: vi.fn(), + getImageData: vi.fn(() => ({ data: new Array(4) })), + putImageData: vi.fn() + } + } + + convertToBlob() { + return Promise.resolve(new Blob([''], { type: 'image/png' })) + } +} as any diff --git a/vite.config.ts b/vite.config.ts index d3acd526f..a3beab314 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -71,6 +71,7 @@ export default defineConfig((env: ConfigEnv) => ({ provider: 'v8' }, include: ['src/packages/__VUE/**/*.(test|spec).(ts|tsx)'], - reporters: ['default', 'html'] + reporters: ['default', 'html'], + setupFiles: ['./test-setup.ts'] } }) as UserConfig) -- Gitee From 51cff58452cee4addb1823df793f9a9f8d1eccfe Mon Sep 17 00:00:00 2001 From: huxiyang3 <1872591453@qq.com> Date: Tue, 12 Aug 2025 09:52:00 +0800 Subject: [PATCH 4/4] fix: test env --- .../signature/__tests__/__snapshots__/signature.spec.tsx.snap | 2 +- src/packages/__VUE/signature/__tests__/signature.spec.tsx | 1 - src/packages/__VUE/watermark/__tests__/watermark.spec.tsx | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/packages/__VUE/signature/__tests__/__snapshots__/signature.spec.tsx.snap b/src/packages/__VUE/signature/__tests__/__snapshots__/signature.spec.tsx.snap index 86fc650ba..a7eb6ebb2 100644 --- a/src/packages/__VUE/signature/__tests__/__snapshots__/signature.spec.tsx.snap +++ b/src/packages/__VUE/signature/__tests__/__snapshots__/signature.spec.tsx.snap @@ -1,3 +1,3 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`props custom-class 1`] = `"data:image/png;base64,00"`; +exports[`props custom-class 1`] = `"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=="`; diff --git a/src/packages/__VUE/signature/__tests__/signature.spec.tsx b/src/packages/__VUE/signature/__tests__/signature.spec.tsx index e423913bc..98b3254e4 100644 --- a/src/packages/__VUE/signature/__tests__/signature.spec.tsx +++ b/src/packages/__VUE/signature/__tests__/signature.spec.tsx @@ -1,6 +1,5 @@ import { mount } from '@vue/test-utils' import { Signature } from '@nutui/nutui' -import 'vitest-canvas-mock' test('props custom-class', async () => { const wrapper = mount(() => { diff --git a/src/packages/__VUE/watermark/__tests__/watermark.spec.tsx b/src/packages/__VUE/watermark/__tests__/watermark.spec.tsx index dcd5a2174..76626d956 100644 --- a/src/packages/__VUE/watermark/__tests__/watermark.spec.tsx +++ b/src/packages/__VUE/watermark/__tests__/watermark.spec.tsx @@ -1,7 +1,6 @@ import { mount } from '@vue/test-utils' import { Watermark } from '@nutui/nutui' import { nextTick } from 'vue' -import 'vitest-canvas-mock' test('WaterMark: fullPage = true', async () => { const wrapper = mount(() => { -- Gitee