diff --git a/.github/workflows/test-ubuntu.yml b/.github/workflows/test-ubuntu.yml index b91d58acb..f1e529e0d 100644 --- a/.github/workflows/test-ubuntu.yml +++ b/.github/workflows/test-ubuntu.yml @@ -42,6 +42,8 @@ jobs: changed: - "!**/*.md" - "!**/*.mdx" + - "!**/_meta.json" + - "!**/dictionary.txt" - name: Setup Node.js ${{ matrix.node-version }} if: steps.changes.outputs.changed == 'true' @@ -83,6 +85,8 @@ jobs: changed: - "!**/*.md" - "!**/*.mdx" + - "!**/_meta.json" + - "!**/dictionary.txt" - name: Setup Node.js ${{ matrix.node-version }} if: steps.changes.outputs.changed == 'true' diff --git a/.github/workflows/test-windows.yml b/.github/workflows/test-windows.yml new file mode 100644 index 000000000..61b4b4bac --- /dev/null +++ b/.github/workflows/test-windows.yml @@ -0,0 +1,120 @@ +name: Test (Windows) + +# Controls when the action will run. +on: + # Triggers the workflow on pull request events but only for the main branch + pull_request: + branches: [main] + + push: + branches: [main] + + merge_group: + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + +# A workflow run is made up of one or more jobs that can run sequentially or in parallel +jobs: + # ======== ut ======== + ut-windows: + runs-on: windows-latest + strategy: + matrix: + node-version: [18.x] + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - name: Git config + shell: bash + run: | + git config --system core.longpaths true + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 10 + + - name: Install Pnpm + run: corepack enable + + - uses: dorny/paths-filter@v3 + id: changes + with: + predicate-quantifier: 'every' + filters: | + changed: + - "!**/*.md" + - "!**/*.mdx" + - "!**/_meta.json" + - "!**/dictionary.txt" + + - name: Setup Node.js ${{ matrix.node-version }} + if: steps.changes.outputs.changed == 'true' + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'pnpm' + + - name: Install Dependencies + if: steps.changes.outputs.changed == 'true' + run: pnpm install + + - name: Unit Test + if: steps.changes.outputs.changed == 'true' + run: pnpm run test:unit + + # # ======== e2e ======== + e2e-windows: + runs-on: windows-latest + strategy: + matrix: + node-version: [18.x] + + # Steps represent a sequence of tasks that will be executed as part of the job + steps: + - name: Git config + shell: bash + run: | + git config --system core.longpaths true + + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 10 + + - name: Install Pnpm + run: corepack enable + + - uses: dorny/paths-filter@v3 + id: changes + with: + predicate-quantifier: 'every' + filters: | + changed: + - "!**/*.md" + - "!**/*.mdx" + - "!**/_meta.json" + - "!**/dictionary.txt" + + - name: Setup Node.js ${{ matrix.node-version }} + if: steps.changes.outputs.changed == 'true' + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: 'pnpm' + + - name: Install Dependencies + if: steps.changes.outputs.changed == 'true' + run: pnpm install && cd ./e2e && npx playwright install + + - name: E2E Test + if: steps.changes.outputs.changed == 'true' + run: | + pnpm run test:artifact + pnpm run test:e2e + + - name: Examples Test + if: steps.changes.outputs.changed == 'true' + run: | + pnpm run build:examples diff --git a/e2e/cases/alias/__snapshots__/index.test.ts.snap b/e2e/cases/alias/__snapshots__/index.test.ts.snap index ec282d3e4..fbe091e53 100644 --- a/e2e/cases/alias/__snapshots__/index.test.ts.snap +++ b/e2e/cases/alias/__snapshots__/index.test.ts.snap @@ -13,7 +13,7 @@ console.info(a); `; exports[`source.alias 2`] = ` -""use strict"; +"\\"use strict\\"; var __webpack_exports__ = {}; ;// CONCATENATED MODULE: ./src/a.ts diff --git a/e2e/cases/syntax/__snapshots__/index.test.ts.snap b/e2e/cases/syntax/__snapshots__/index.test.ts.snap index 7931dc64c..496fc9deb 100644 --- a/e2e/cases/syntax/__snapshots__/index.test.ts.snap +++ b/e2e/cases/syntax/__snapshots__/index.test.ts.snap @@ -20,23 +20,23 @@ export { Foo }; exports[`should downgrade class private method with output.syntax config 1`] = ` " -;// CONCATENATED MODULE: ../../../../node_modules/.pnpm/@swc+helpers@0.5.11/node_modules/@swc/helpers/esm/_class_private_method_get.js +;// CONCATENATED MODULE: ../../../../node_modules//@swc/helpers/esm/_class_private_method_get.js function _class_private_method_get(receiver, privateSet, fn) { - if (!privateSet.has(receiver)) throw new TypeError("attempted to get private field on non-instance"); + if (!privateSet.has(receiver)) throw new TypeError(\\"attempted to get private field on non-instance\\"); return fn; } -;// CONCATENATED MODULE: ../../../../node_modules/.pnpm/@swc+helpers@0.5.11/node_modules/@swc/helpers/esm/_check_private_redeclaration.js +;// CONCATENATED MODULE: ../../../../node_modules//@swc/helpers/esm/_check_private_redeclaration.js function _check_private_redeclaration(obj, privateCollection) { if (privateCollection.has(obj)) { - throw new TypeError("Cannot initialize the same private elements twice on an object"); + throw new TypeError(\\"Cannot initialize the same private elements twice on an object\\"); } } -;// CONCATENATED MODULE: ../../../../node_modules/.pnpm/@swc+helpers@0.5.11/node_modules/@swc/helpers/esm/_class_private_method_init.js +;// CONCATENATED MODULE: ../../../../node_modules//@swc/helpers/esm/_class_private_method_init.js function _class_private_method_init(obj, privateSet) { diff --git a/e2e/package.json b/e2e/package.json index 090b6587d..8c8414dce 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -18,6 +18,7 @@ "@types/node": "~18.19.39", "@types/react": "^18.3.3", "fast-glob": "^3.3.2", - "fs-extra": "^11.2.0" + "fs-extra": "^11.2.0", + "path-serializer": "0.0.6" } } diff --git a/e2e/setupVitestTests.ts b/e2e/setupVitestTests.ts index c86233e3f..39e8d0824 100644 --- a/e2e/setupVitestTests.ts +++ b/e2e/setupVitestTests.ts @@ -1,8 +1,16 @@ +import path from 'node:path'; import process from 'node:process'; -import { beforeEach } from 'vitest'; +import { createSnapshotSerializer } from 'path-serializer'; +import { beforeEach, expect } from 'vitest'; beforeEach(() => { // since our NODE_ENV injection logic is via cli, we need to // delete "test" NODE_ENV to avoid affecting the default build config delete process.env.NODE_ENV; }); + +expect.addSnapshotSerializer( + createSnapshotSerializer({ + workspace: path.join(__dirname, '..'), + }), +); diff --git a/packages/core/tests/lcp.test.ts b/packages/core/tests/lcp.test.ts index 97bdcc635..065a0f793 100644 --- a/packages/core/tests/lcp.test.ts +++ b/packages/core/tests/lcp.test.ts @@ -1,3 +1,4 @@ +import os from 'node:os'; import { vol } from 'memfs'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { calcLongestCommonPath } from '../src/utils/helper'; @@ -19,35 +20,57 @@ describe('LCP calculate correctly', () => { it('correct 1', async () => { vol.fromJSON({ '/Users/Someone/project-a/src': null }); - const result = await calcLongestCommonPath([ - '/Users/Someone/project-a/src/helpers', - '/Users/Someone/project-a/src', - '/Users/Someone/project-a/src/utils', - ]); - expect(result).toBe('/Users/Someone/project-a/src'); + if (os.platform() !== 'win32') { + const result = await calcLongestCommonPath([ + '/Users/Someone/project-a/src/helpers', + '/Users/Someone/project-a/src', + '/Users/Someone/project-a/src/utils', + ]); + expect(result).toEqual('/Users/Someone/project-a/src'); + } else { + const result = await calcLongestCommonPath([ + 'D:\\Users\\Someone\\project-a\\src\\helpers', + 'D:\\Users\\Someone\\project-a\\src', + 'D:\\Users\\Someone\\project-a\\src\\utils', + ]); + expect(result).toEqual('D:\\Users\\Someone\\project-a\\src'); + } }); it('correct 2', async () => { vol.fromJSON({ '/Users/Someone/project-monorepo': null }); - const result = await calcLongestCommonPath([ - '/Users/Someone/project-monorepo/packages-a/src/index.ts', - '/Users/Someone/project-monorepo/packages-util/src/index.js', - '/Users/Someone/project-monorepo/script.js', - ]); - - expect(result).toBe('/Users/Someone/project-monorepo'); + if (os.platform() !== 'win32') { + const result = await calcLongestCommonPath([ + '/Users/Someone/project-monorepo/packages-a/src/index.ts', + '/Users/Someone/project-monorepo/packages-util/src/index.js', + '/Users/Someone/project-monorepo/script.js', + ]); + expect(result).toEqual('/Users/Someone/project-monorepo'); + } else { + const result = await calcLongestCommonPath([ + 'D:\\Users\\Someone\\project-monorepo\\packages-a\\src\\index.ts', + 'D:\\Users\\Someone\\project-monorepo\\packages-util\\src\\index.js', + 'D:\\Users\\Someone\\project-monorepo\\script.js', + ]); + expect(result).toEqual('D:\\Users\\Someone\\project-monorepo'); + } }); it('correct 3', async () => { vol.fromJSON({ '/Users/Someone/project/src/index.js': '', }); - - const result = await calcLongestCommonPath([ - '/Users/Someone/project/src/index.js', - ]); - - expect(result).toBe('/Users/Someone/project/src'); + if (os.platform() !== 'win32') { + const result = await calcLongestCommonPath([ + '/Users/Someone/project/src/index.js', + ]); + expect(result).toEqual('/Users/Someone/project/src'); + } else { + const result = await calcLongestCommonPath([ + 'D:\\Users\\Someone\\project\\src\\index.js', + ]); + expect(result).toEqual('D:\\Users\\Someone\\project\\src'); + } }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 432e421c9..6aa301ba6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,6 +93,9 @@ importers: fs-extra: specifier: ^11.2.0 version: 11.2.0 + path-serializer: + specifier: 0.0.6 + version: 0.0.6 e2e/cases/auto-extension/type-commonjs/default: {} @@ -2549,6 +2552,9 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-serializer@0.0.6: + resolution: {integrity: sha512-kBhnac4AnaKORPpadUFKsxdTOMDF+vNuYyZcmbmeWnjogEUIjdOgOMpKxdb8acv6i8ldVthtDV35EOXIt1DbJw==} + path-to-regexp@0.1.7: resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} @@ -5549,6 +5555,8 @@ snapshots: path-parse@1.0.7: {} + path-serializer@0.0.6: {} + path-to-regexp@0.1.7: {} path-type@4.0.0: {}