1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-18 18:33:50 +00:00

Use a shared jest config

Add play.spec.ts as playwright test plaths. Also establishes .type.spec.ts as a specially ignored path everywhere.

Finally, we no longer need the ast transformer since we don't use import.meta statements anymore. (this was also two years ago, it's possible this just works now).
This commit is contained in:
Matt Gibson
2025-10-07 11:44:30 -07:00
parent f988d3fd70
commit cb6217acc5
37 changed files with 55 additions and 87 deletions

View File

@@ -2,7 +2,7 @@ const { pathsToModuleNameMapper } = require("ts-jest");
const { compilerOptions } = require("../../tsconfig.base");
const sharedConfig = require("../../libs/shared/jest.config.ts");
const sharedConfig = require("../../libs/shared/jest.config");
/** @type {import('jest').Config} */
module.exports = {

View File

@@ -2,7 +2,7 @@ const { pathsToModuleNameMapper } = require("ts-jest");
const { compilerOptions } = require("../../tsconfig.base");
const sharedConfig = require("../../libs/shared/jest.config.ts");
const sharedConfig = require("../../libs/shared/jest.config");
/** @type {import('jest').Config} */
module.exports = {

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -2,7 +2,7 @@ const { pathsToModuleNameMapper } = require("ts-jest");
const { compilerOptions } = require("../../tsconfig.base");
const sharedConfig = require("../shared/jest.config.ts");
const sharedConfig = require("../shared/jest.config");
/** @type {import('jest').Config} */
module.exports = {

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -4,7 +4,6 @@ const sharedConfig = require("../../libs/shared/jest.config.angular");
module.exports = {
...sharedConfig,
testEnvironment: "./fix-jsdom.ts",
testMatch: ["**/+(*.)+(spec).+(mjs)"],
displayName: "libs/eslint tests",
setupFilesAfterEnv: ["<rootDir>/test.setup.mjs"],
};

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -2,7 +2,7 @@ const { pathsToModuleNameMapper } = require("ts-jest");
const { compilerOptions } = require("../../tsconfig.base");
const sharedConfig = require("../shared/jest.config.ts");
const sharedConfig = require("../shared/jest.config");
/** @type {import('jest').Config} */
module.exports = {

View File

@@ -7,7 +7,7 @@
"types": ["jest", "node"]
},
"include": [
"jest.config.ts",
"jest.config",
"src/**/*.test.ts",
"src/**/*.spec.ts",
"src/**/*.d.ts",

View File

@@ -7,7 +7,7 @@
"types": ["jest", "node"]
},
"include": [
"jest.config.ts",
"jest.config",
"src/**/*.test.ts",
"src/**/*.spec.ts",
"src/**/*.d.ts",

View File

@@ -2,7 +2,7 @@ const { pathsToModuleNameMapper } = require("ts-jest");
const { compilerOptions } = require("../../tsconfig.base");
const sharedConfig = require("../shared/jest.config.ts");
const sharedConfig = require("../shared/jest.config");
/** @type {import('jest').Config} */
module.exports = {

View File

@@ -45,7 +45,7 @@
"executor": "@nx/jest:jest",
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
"options": {
"jestConfig": "libs/nx-plugin/jest.config.ts"
"jestConfig": "libs/nx-plugin/jest.config"
}
}
}

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -6,5 +6,5 @@
"types": ["node"]
},
"include": ["src/**/*.ts"],
"exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"]
"exclude": ["jest.config", "src/**/*.spec.ts", "src/**/*.test.ts"]
}

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -1,36 +0,0 @@
import * as ts from "typescript";
// Custom Typescript AST transformer for use with ts-jest / jest-preset-angular
// Removes specified ES2020 syntax from source code, as node does not support it yet
// Reference: https://kulshekhar.github.io/ts-jest/docs/getting-started/options/astTransformers
// Use this tool to understand how we identify and filter AST nodes: https://ts-ast-viewer.com/
/**
* Remember to increase the version whenever transformer's content is changed. This is to inform Jest to not reuse
* the previous cache which contains old transformer's content
*/
export const version = 1;
export const name = "bit-es2020-transformer";
// Returns true for 'import.meta' statements
const isImportMetaStatement = (node: ts.Node) =>
ts.isPropertyAccessExpression(node) &&
ts.isMetaProperty(node.expression) &&
node.expression.keywordToken === ts.SyntaxKind.ImportKeyword;
export const factory = function (/*opts?: Opts*/) {
function visitor(ctx: ts.TransformationContext, sf: ts.SourceFile) {
const visitor: ts.Visitor = (node: ts.Node): ts.VisitResult<any> => {
if (isImportMetaStatement(node)) {
return null;
}
// Continue searching child nodes
return ts.visitEachChild(node, visitor, ctx);
};
return visitor;
}
return (ctx: ts.TransformationContext): ts.Transformer<any> => {
return (sf: ts.SourceFile) => ts.visitNode(sf, visitor(ctx, sf));
};
};

View File

@@ -4,9 +4,6 @@ const { createCjsPreset } = require("jest-preset-angular/presets");
const presetConfig = createCjsPreset({
tsconfig: "<rootDir>/tsconfig.spec.json",
astTransformers: {
before: ["<rootDir>/../../libs/shared/es2020-transformer.ts"],
},
diagnostics: {
ignoreCodes: ["TS151001"],
},
@@ -16,10 +13,10 @@ const presetConfig = createCjsPreset({
module.exports = {
...presetConfig,
testMatch: ["**/+(*.)+(spec).+(ts)"],
testPathIgnorePatterns: [
"/node_modules/", // default value
".*.type.spec.ts", // ignore type tests (which are checked at compile time and not run by jest)
".*.play.spec.ts", // ignore playwright tests
],
// Improves on-demand performance, for watches prefer 25%, overridable by setting --maxWorkers

View File

@@ -2,7 +2,13 @@
/** @type {import('jest').Config} */
module.exports = {
// Match all .spec.ts files, but not .play.spec.ts files, those are playwright tests
testMatch: ["**/+(*.)+(spec).+(ts)"],
testPathIgnorePatterns: [
"/node_modules/", // default value
".*.type.spec.ts", // ignore type tests (which are checked at compile time and not run by jest)
".*.play.spec.ts", // ignore playwright tests
],
// Workaround for a memory leak that crashes tests in CI:
// https://github.com/facebook/jest/issues/9430#issuecomment-1149882002
@@ -20,9 +26,6 @@ module.exports = {
// Makes tests run faster and reduces size/rate of leak, but loses typechecking on test code
// See https://bitwarden.atlassian.net/browse/EC-497 for more info
isolatedModules: true,
astTransformers: {
before: ["<rootDir>/../../libs/shared/es2020-transformer.ts"],
},
},
],
},

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

View File

@@ -1,10 +1,11 @@
const { pathsToModuleNameMapper } = require("ts-jest");
const sharedConfig = require("../../../../shared/jest.config");
const { compilerOptions } = require("../../../../../tsconfig.base");
/** @type {import('jest').Config} */
module.exports = {
testMatch: ["**/+(*.)+(spec).+(ts)"],
...sharedConfig,
preset: "ts-jest",
testEnvironment: "jsdom",
moduleNameMapper: pathsToModuleNameMapper(

View File

@@ -1,10 +1,11 @@
const { pathsToModuleNameMapper } = require("ts-jest");
const sharedConfig = require("../../../../shared/jest.config");
const { compilerOptions } = require("../../../../../tsconfig.base");
/** @type {import('jest').Config} */
module.exports = {
testMatch: ["**/+(*.)+(spec).+(ts)"],
...sharedConfig,
preset: "ts-jest",
testEnvironment: "jsdom",
moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, {

View File

@@ -1,10 +1,11 @@
const { pathsToModuleNameMapper } = require("ts-jest");
const sharedConfig = require("../../../shared/jest.config");
const { compilerOptions } = require("../../../../tsconfig.base");
/** @type {import('jest').Config} */
module.exports = {
testMatch: ["**/+(*.)+(spec).+(ts)"],
...sharedConfig,
preset: "ts-jest",
testEnvironment: "../../../shared/test.environment.ts",
moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, {

View File

@@ -1,10 +1,11 @@
const { pathsToModuleNameMapper } = require("ts-jest");
const sharedConfig = require("../../../shared/jest.config");
const { compilerOptions } = require("../../../../tsconfig.base");
/** @type {import('jest').Config} */
module.exports = {
testMatch: ["**/+(*.)+(spec).+(ts)"],
...sharedConfig,
preset: "ts-jest",
testEnvironment: "../../../shared/test.environment.ts",
moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, {

View File

@@ -1,10 +1,11 @@
const { pathsToModuleNameMapper } = require("ts-jest");
const sharedConfig = require("../../../../shared/jest.config");
const { compilerOptions } = require("../../../../../tsconfig.base");
/** @type {import('jest').Config} */
module.exports = {
testMatch: ["**/+(*.)+(spec).+(ts)"],
...sharedConfig,
preset: "ts-jest",
testEnvironment: "../../../../shared/test.environment.ts",
moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, {

View File

@@ -1,10 +1,11 @@
const { pathsToModuleNameMapper } = require("ts-jest");
const sharedConfig = require("../../../../shared/jest.config");
const { compilerOptions } = require("../../../../../tsconfig.base");
/** @type {import('jest').Config} */
module.exports = {
testMatch: ["**/+(*.)+(spec).+(ts)"],
...sharedConfig,
preset: "ts-jest",
testEnvironment: "../../../../shared/test.environment.ts",
moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, {

View File

@@ -1,10 +1,11 @@
const { pathsToModuleNameMapper } = require("ts-jest");
const sharedConfig = require("../../../../shared/jest.config");
const { compilerOptions } = require("../../../../../tsconfig.base");
/** @type {import('jest').Config} */
module.exports = {
testMatch: ["**/+(*.)+(spec).+(ts)"],
...sharedConfig,
preset: "ts-jest",
testEnvironment: "../../../../shared/test.environment.ts",
moduleNameMapper: pathsToModuleNameMapper(compilerOptions?.paths || {}, {

View File

@@ -1,4 +1,5 @@
const { pathsToModuleNameMapper } = require("ts-jest");
const sharedConfig = require("../../../shared/jest.config.angular");
const { compilerOptions } = require("../../../../tsconfig.base");
@@ -7,9 +8,6 @@ const { createCjsPreset } = require("jest-preset-angular/presets");
// FIXME: Should use the shared config!
const presetConfig = createCjsPreset({
tsconfig: "<rootDir>/tsconfig.spec.json",
astTransformers: {
before: ["<rootDir>/../../../shared/es2020-transformer.ts"],
},
diagnostics: {
ignoreCodes: ["TS151001"],
},
@@ -17,6 +15,7 @@ const presetConfig = createCjsPreset({
/** @type {import('jest').Config} */
module.exports = {
...sharedConfig,
...presetConfig,
displayName: "tools/send-ui tests",
setupFilesAfterEnv: ["<rootDir>/test.setup.ts"],

View File

@@ -6,5 +6,5 @@
"moduleResolution": "node10",
"types": ["jest", "node"]
},
"include": ["jest.config.ts", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
"include": ["jest.config", "src/**/*.test.ts", "src/**/*.spec.ts", "src/**/*.d.ts"]
}

18
package-lock.json generated
View File

@@ -60,6 +60,7 @@
"oidc-client-ts": "2.4.1",
"open": "10.1.2",
"papaparse": "5.5.3",
"playwright": "1.56.0",
"proper-lockfile": "4.1.2",
"qrcode-parser": "2.1.3",
"qrious": "4.0.2",
@@ -33325,13 +33326,12 @@
}
},
"node_modules/playwright": {
"version": "1.53.1",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.53.1.tgz",
"integrity": "sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw==",
"dev": true,
"version": "1.56.0",
"resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.0.tgz",
"integrity": "sha512-X5Q1b8lOdWIE4KAoHpW3SE8HvUB+ZZsUoN64ZhjnN8dOb1UpujxBtENGiZFE+9F/yhzJwYa+ca3u43FeLbboHA==",
"license": "Apache-2.0",
"dependencies": {
"playwright-core": "1.53.1"
"playwright-core": "1.56.0"
},
"bin": {
"playwright": "cli.js"
@@ -33344,10 +33344,9 @@
}
},
"node_modules/playwright-core": {
"version": "1.53.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.1.tgz",
"integrity": "sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg==",
"dev": true,
"version": "1.56.0",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.0.tgz",
"integrity": "sha512-1SXl7pMfemAMSDn5rkPeZljxOCYAmQnYLBTExuh6E8USHXGSX3dx6lYZN/xPpTz1vimXmPA9CDnILvmJaB8aSQ==",
"license": "Apache-2.0",
"bin": {
"playwright-core": "cli.js"
@@ -33360,7 +33359,6 @@
"version": "2.3.2",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
"optional": true,

View File

@@ -195,6 +195,7 @@
"oidc-client-ts": "2.4.1",
"open": "10.1.2",
"papaparse": "5.5.3",
"playwright": "1.56.0",
"proper-lockfile": "4.1.2",
"qrcode-parser": "2.1.3",
"qrious": "4.0.2",