Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: migrate from jest to vitest #4396

Merged
merged 43 commits into from
Jul 29, 2024
Merged
Show file tree
Hide file tree
Changes from 39 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
bcf86b9
chore: test @lwc/shared with vitest
cardoso Jul 21, 2024
c678adf
chore: migrate @lwc/style-compiler to vitest
cardoso Jul 21, 2024
df4fb25
chore: migrate @lwc/errors to vitest
cardoso Jul 21, 2024
ba32129
chore: migrate @lwc/features to vitest
cardoso Jul 21, 2024
c547611
chore: migrate @lwc/signals to vitest
cardoso Jul 21, 2024
045acda
chore: migrate @lwc/rollup-plugin to vitest
cardoso Jul 21, 2024
32ce3fa
chore: migrate @lwc/engine-core to vitest
cardoso Jul 21, 2024
9407101
chore: migrate @lwc/engine-dom to vitest
cardoso Jul 21, 2024
a28c0a0
chore: migrate @lwc/compiler to vitest
cardoso Jul 21, 2024
cf3b131
chore: migrate @lwc/babel-plugin-component to vitest
cardoso Jul 21, 2024
dddc404
chore: add vitest coverage
cardoso Jul 22, 2024
4bcae68
Merge branch 'master' of https://github.com/salesforce/lwc into vitest
cardoso Jul 24, 2024
ebc40ec
chore: migrate @lwc/template-compiler to vitest
cardoso Jul 24, 2024
f6669f9
chore: use .ts for vitest workspace config
cardoso Jul 24, 2024
de4cb42
chore: change test scripts to vitest
cardoso Jul 24, 2024
4909030
chore: change vitest shared config to ts
cardoso Jul 24, 2024
1c3d5fc
chore: migrate @lwc/module-resolver to vitest
cardoso Jul 24, 2024
147904a
chore: remove rollup plugins from shared vitest config
cardoso Jul 25, 2024
78e5639
chore: migrate @lwc/engine-server to vitest
cardoso Jul 25, 2024
321c1d5
chore: set lwc engine-server hooks in mock
cardoso Jul 25, 2024
eb7319a
chore: migrate lwc package to vitest
cardoso Jul 25, 2024
b3df5b2
Merge remote-tracking branch 'origin/master' into vitest
nolanlawson Jul 25, 2024
a5e2e6d
fix: allow for testing @lwc/ssr-compiler with env var
nolanlawson Jul 25, 2024
a804c83
test: fix inline snapshot
nolanlawson Jul 25, 2024
00b229f
test: remove jest entirely
nolanlawson Jul 25, 2024
5d4aa0e
test: fix lwc package
nolanlawson Jul 25, 2024
00236a6
test: make yarn test run in interactive mode
nolanlawson Jul 25, 2024
2372384
test: make vitest globals work in the IDE
nolanlawson Jul 25, 2024
d4b1aed
test: rename from jest to test
nolanlawson Jul 25, 2024
6b20fd8
test: remove unnecessary config
nolanlawson Jul 25, 2024
0329a43
test: fix test:types
nolanlawson Jul 25, 2024
3f48a35
Merge remote-tracking branch 'origin/master' into vitest
nolanlawson Jul 26, 2024
ee4f3ab
fix: use .mjs to avoid warning and do not import all rollup plugins
nolanlawson Jul 26, 2024
98b6d78
fix: avoid rollup plugins entirely
nolanlawson Jul 26, 2024
5a6e294
fix: fix coverage tests
nolanlawson Jul 26, 2024
1f306bc
test: improve vitest configs
nolanlawson Jul 29, 2024
6550ff9
test: stricter coverage
nolanlawson Jul 29, 2024
ce2beae
test: consistent variable name
nolanlawson Jul 29, 2024
39def4e
test: remove unnecessary package
nolanlawson Jul 29, 2024
74351ce
Update packages/@lwc/babel-plugin-component/vitest.config.mjs
nolanlawson Jul 29, 2024
4fd44e7
chore: update all comments
nolanlawson Jul 29, 2024
3b2954e
test: move the dumb aliases hack to the root config
nolanlawson Jul 29, 2024
7457eb1
Merge remote-tracking branch 'origin/master' into vitest
nolanlawson Jul 29, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/unit.yml
Original file line number Diff line number Diff line change
Expand Up @@ -64,12 +64,12 @@ jobs:
run: yarn bundlesize
- name: Check types
run: yarn test:types
- name: Run Jest tests
- name: Run unit tests
run: yarn test:ci
- name: Upload Jest coverage report
- name: Upload unit test coverage report
uses: actions/upload-artifact@v3
with:
name: jest-coverage-report
name: test-coverage-report
path: coverage/
- name: Run benchmark smoke tests
run: CHROME_BINARY=${{ steps.setup-chrome.outputs.chrome-path }} BENCHMARK_SMOKE_TEST=1 yarn test:performance
Expand Down
19 changes: 9 additions & 10 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,10 @@
"build:performance:benchmarks": "nx build @lwc/perf-benchmarks",
"copy-fork": "./scripts/tasks/unsafe-external-contributor-ci-workaround.sh",
"dev": "nx run-many --target=dev --all --parallel=999 --exclude=@lwc/perf-benchmarks,@lwc/perf-benchmarks-components,@lwc/integration-tests,lwc",
"test": "jest --config ./scripts/jest/root.config.js",
"test": "vitest --workspace vitest.workspace.mjs",
"test:bespoke": "nx run-many --target=test",
"test:debug": "node --inspect node_modules/.bin/jest --config ./scripts/jest/root.config.js --runInBand --watch",
"test:ci": "yarn test --no-cache --coverage --runInBand",
"test:debug": "vitest --workspace vitest.workspace.mjs --inspect-brk --no-file-parallelism",
"test:ci": "vitest run --workspace vitest.workspace.mjs --coverage",
"test:karma": "nx test @lwc/integration-karma",
"test:integration": "nx sauce @lwc/integration-tests",
"test:performance": "nx test @lwc/perf-benchmarks",
Expand All @@ -34,21 +34,21 @@
"prettier": "v3 requires ESM, and we use prettier in our Jest tests. Jest does not support ESM yet."
},
"devDependencies": {
"@babel/plugin-transform-modules-commonjs": "^7.24.8",
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No longer needed, only needed for Jest

"@commitlint/cli": "^19.3.0",
"@eslint/compat": "^1.1.1",
"@eslint/js": "^9.7.0",
"@lwc/eslint-plugin-lwc-internal": "link:./scripts/eslint-plugin",
"@lwc/jest-utils-lwc-internals": "link:./scripts/jest/utils",
"@lwc/test-utils-lwc-internals": "link:./scripts/test-utils",
"@rollup/plugin-commonjs": "^26.0.1",
"@rollup/plugin-inject": "^5.0.5",
"@rollup/plugin-node-resolve": "^15.2.3",
"@rollup/plugin-replace": "^5.0.7",
"@rollup/plugin-typescript": "^11.1.6",
"@types/babel__core": "^7.20.5",
"@types/jest": "^29.5.12",
"@types/node": "^20.14.11",
"@types/prettier": "^2.7.3",
"@vitest/coverage-v8": "^2.0.3",
"@vitest/ui": "^2.0.3",
"bytes": "^3.1.2",
"es-module-lexer": "^1.5.4",
"eslint": "^9.7.0",
Expand All @@ -60,18 +60,17 @@
"globals": "^15.8.0",
"husky": "^9.1.1",
"isbinaryfile": "^5.0.2",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"jsdom": "^24.1.1",
"lint-staged": "^15.2.7",
"magic-string": "^0.30.10",
"nx": "19.5.1",
"prettier": "^2.8.8",
"rollup": "^4.19.0",
"terser": "^5.31.3",
"ts-jest": "^29.2.3",
"tslib": "^2.6.3",
"typescript": "5.5.3",
"typescript-eslint": "^7.16.1"
"typescript-eslint": "^7.16.1",
"vitest": "^2.0.3"
},
"lint-staged": {
"*.{js,mjs,ts}": "eslint",
Expand Down
12 changes: 0 additions & 12 deletions packages/@lwc/babel-plugin-component/jest.config.js

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import fs from 'node:fs';
import path from 'node:path';
import { transformSync } from '@babel/core';
import { LWC_VERSION, HIGHEST_API_VERSION } from '@lwc/shared';
import { testFixtureDir } from '@lwc/jest-utils-lwc-internals';
import { testFixtureDir } from '@lwc/test-utils-lwc-internals';
import plugin from '../index';

const BASE_OPTS = {
Expand Down
20 changes: 20 additions & 0 deletions packages/@lwc/babel-plugin-component/vitest.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { mergeConfig, defineProject } from 'vitest/config';
import sharedConfig from '../../../vitest.shared.mjs';
import pkg from './package.json';

export default mergeConfig(
sharedConfig,
defineProject({
test: {
name: 'babel-plugin-component',
// Workaround to fix `const enum`, which is required because we use e.g. `APIFeature` from `@lwc/shared`
nolanlawson marked this conversation as resolved.
Show resolved Hide resolved
// See https://github.com/vitest-dev/vitest/discussions/3964
// Using `src` also ensures that the test coverage is accurately reported
alias: Object.fromEntries(
Object.keys(pkg.dependencies ?? {})
.filter((dep) => dep.startsWith('@lwc/'))
.map((dep) => [dep, `${dep}/src`])
),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it matter if we define an alias for a package that's not actually used? Could we just move this to the root config and define aliases for all @lwc/ packages?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I tried doing this, but it messed with the lwc tests because it tries to import from dist.

I can give this another shot, though.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Got it! 3b2954e

},
})
);
12 changes: 0 additions & 12 deletions packages/@lwc/compiler/jest.config.js

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* SPDX-License-Identifier: MIT
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
*/
import { vi } from 'vitest';
import { APIVersion, noop } from '@lwc/shared';
import { TransformOptions } from '../../options';
import { transformSync } from '../transformer';
Expand Down Expand Up @@ -199,12 +200,12 @@ describe('transformSync', () => {
...TRANSFORMATION_OPTIONS,
})
).toThrowErrorMatchingInlineSnapshot(
'"LWC1128: Invalid lwc:dynamic usage. The LWC dynamic directive must be enabled in order to use this feature."'
`[Error: LWC1128: Invalid lwc:dynamic usage. The LWC dynamic directive must be enabled in order to use this feature.]`
);
});

it('gathers metrics around use of the deprecated dynamic components', () => {
const incrementCounter = jest.fn();
const incrementCounter = vi.fn();
const template = `
<template>
<x-dynamic lwc:dynamic={ctor}></x-dynamic>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
* SPDX-License-Identifier: MIT
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
*/
import { vi } from 'vitest';
import { noop } from '@lwc/shared';
import { TransformOptions } from '../../options';
import { transform, transformSync } from '../transformer';
Expand Down Expand Up @@ -121,7 +122,7 @@ it('should not apply babel plugins when Lightning Web Security is off', async ()

describe('instrumentation', () => {
it('should gather metrics for transforming dynamic imports', async () => {
const incrementCounter = jest.fn();
const incrementCounter = vi.fn();
const actual = `
export async function test() {
const x = await import("foo");
Expand Down
20 changes: 20 additions & 0 deletions packages/@lwc/compiler/vitest.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { defineProject, mergeConfig } from 'vitest/config';
import baseConfig from '../../../vitest.shared.mjs';
import pkg from './package.json';

export default mergeConfig(
baseConfig,
defineProject({
test: {
name: 'lwc-compiler',
// Workaround to fix `const enum`, which is required because we use e.g. `APIFeature` from `@lwc/shared`
// See https://github.com/vitest-dev/vitest/discussions/3964
// Using `src` also ensures that the test coverage is accurately reported
alias: Object.fromEntries(
Object.keys(pkg.dependencies ?? {})
.filter((dep) => dep.startsWith('@lwc/'))
.map((dep) => [dep, `${dep}/src`])
),
},
})
);
14 changes: 0 additions & 14 deletions packages/@lwc/engine-core/jest.config.js

This file was deleted.

20 changes: 20 additions & 0 deletions packages/@lwc/engine-core/vitest.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { defineProject, mergeConfig } from 'vitest/config';
import baseConfig from '../../../vitest.shared.mjs';
import pkg from './package.json';

export default mergeConfig(
baseConfig,
defineProject({
test: {
name: 'lwc-engine-core',
// Workaround to fix `const enum`, which is required because we use e.g. `APIFeature` from `@lwc/shared`
// See https://github.com/vitest-dev/vitest/discussions/3964
// Using `src` also ensures that the test coverage is accurately reported
alias: Object.fromEntries(
Object.keys(pkg.dependencies ?? {})
.filter((dep) => dep.startsWith('@lwc/'))
.map((dep) => [dep, `${dep}/src`])
),
},
})
);
14 changes: 0 additions & 14 deletions packages/@lwc/engine-dom/jest.config.js

This file was deleted.

21 changes: 21 additions & 0 deletions packages/@lwc/engine-dom/vitest.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { defineProject, mergeConfig } from 'vitest/config';
import baseConfig from '../../../vitest.shared.mjs';
import pkg from './package.json';

export default mergeConfig(
baseConfig,
defineProject({
test: {
name: 'lwc-engine-dom',
environment: 'jsdom',
// Workaround to fix `const enum`, which is required because we use e.g. `APIFeature` from `@lwc/shared`
// See https://github.com/vitest-dev/vitest/discussions/3964
// Using `src` also ensures that the test coverage is accurately reported
alias: Object.fromEntries(
Object.keys(pkg.dependencies ?? {})
.filter((dep) => dep.startsWith('@lwc/'))
.map((dep) => [dep, `${dep}/src`])
),
},
})
);
17 changes: 0 additions & 17 deletions packages/@lwc/engine-server/jest.config.js

This file was deleted.

31 changes: 16 additions & 15 deletions packages/@lwc/engine-server/src/__tests__/fixtures.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import path from 'path';

import { rollup } from 'rollup';
import lwcRollupPlugin from '@lwc/rollup-plugin';
import { testFixtureDir, formatHTML } from '@lwc/jest-utils-lwc-internals';
import { vi } from 'vitest';
import { testFixtureDir, formatHTML } from '@lwc/test-utils-lwc-internals';
import type * as lwc from '../index';

interface FixtureModule {
Expand All @@ -20,7 +21,17 @@ interface FixtureModule {
features?: any[];
}

jest.setTimeout(10_000 /* 10 seconds */);
vi.setConfig({ testTimeout: 10_000 /* 10 seconds */ });

vi.mock('lwc', async () => {
const lwcEngineServer = await import('../index');
lwcEngineServer!.setHooks({
sanitizeHtmlContent(content: unknown) {
return content as string;
},
});
return lwcEngineServer;
});

async function compileFixture({ input, dirname }: { input: string; dirname: string }) {
const modulesDir = path.resolve(dirname, './modules');
Expand Down Expand Up @@ -49,7 +60,7 @@ async function compileFixture({ input, dirname }: { input: string; dirname: stri

await bundle.write({
file: outputFile,
format: 'cjs',
format: 'esm',
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Jest doesn't like ES Modules and Vitest doesn't like CJS... Hopefully this is fine.

exports: 'named',
});

Expand Down Expand Up @@ -80,24 +91,14 @@ function testFixtures() {
// On top of this, the engine also checks if the component constructor is an instance of
// the LightningElement. Therefor the compiled module should also be evaluated in the
// same sandbox registry as the engine.
let lwcEngineServer: typeof lwc | undefined;
let module: FixtureModule | undefined;
jest.isolateModules(() => {
lwcEngineServer = require('../index');
module = require(compiledFixturePath);
});
const lwcEngineServer = await import('../index');
const module = (await import(compiledFixturePath)) as FixtureModule;

const features = module!.features ?? [];
features.forEach((flag) => {
lwcEngineServer!.setFeatureFlagForTest(flag, true);
});

lwcEngineServer!.setHooks({
sanitizeHtmlContent(content: unknown) {
return content as string;
},
});

let result;
let err;
try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { rollup, RollupLog } from 'rollup';
import replace from '@rollup/plugin-replace';
import virtual from '@rollup/plugin-virtual';
import lwcRollupPlugin from '@lwc/rollup-plugin';
import { vi } from 'vitest';
import * as engineServer from '../index';

/**
Expand All @@ -20,7 +21,7 @@ import * as engineServer from '../index';
* robust than snapshots, which may have invalid/incorrect HTML.
*/

jest.setTimeout(10_000 /* 10 seconds */);
vi.setConfig({ testTimeout: 10_000 /* 10 seconds */ });

// Compile a component to an HTML string, using the full LWC compilation pipeline
async function compileComponent(tagName: string, componentName: string) {
Expand Down
20 changes: 20 additions & 0 deletions packages/@lwc/engine-server/vitest.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { defineProject, mergeConfig } from 'vitest/config';
import baseConfig from '../../../vitest.shared.mjs';
import pkg from './package.json';

export default mergeConfig(
baseConfig,
defineProject({
test: {
name: 'lwc-engine-server',
// Workaround to fix `const enum`, which is required because we use e.g. `APIFeature` from `@lwc/shared`
// See https://github.com/vitest-dev/vitest/discussions/3964
// Using `src` also ensures that the test coverage is accurately reported
alias: Object.fromEntries(
Object.keys(pkg.dependencies ?? {})
.filter((dep) => dep.startsWith('@lwc/'))
.map((dep) => [dep, `${dep}/src`])
),
},
})
);
Loading
Loading