Files
metabase/jest.base.conf.js
Romeo Van Snick 3d9a6743c6 Hash static images through the rspack build (#82726)
* Declare png and gif module imports for the bundler

* Hash onboarding, upsell and example images through the build

* Assert the Slack app icon link against the bundled asset

* Hash the upsell card story illustration through the build

* Take image sources as props instead of building paths from a base string

* Add a ?url image import that the SDK bundle references instead of inlining

* Hash empty state, upsell and driver logo images through the build

* Hash the map skeleton sprite and the bridge illustration through the build
2026-10-07 10:25:24 +11:00

145 lines
5.2 KiB
JavaScript

// @ts-check
// eslint-disable-next-line import/no-commonjs
const esmPackages = require("./jest.esm-packages.js");
const swcJestTransform = [
"@swc/jest",
{
jsc: {
// Jest runs on Node so we can target a modern engine and skip a bunch
// of polyfills/transforms that `env.targets: ["defaults"]` would emit.
target: "es2022",
loose: true,
parser: {
syntax: "typescript",
tsx: true,
},
transform: {
react: {
runtime: "automatic",
},
},
experimental: {
plugins: [
["@swc-contrib/mut-cjs-exports", {}],
["@swc/plugin-emotion", { sourceMap: false }],
],
},
},
module: {
type: "commonjs",
// A test file loads only the modules its tests touch, not its full import
// graph. Modules that must run before the tests start are listed in
// frontend/test/jest-setup-eager.js.
lazy: true,
},
sourceMaps: "inline",
minify: false,
},
];
const baseConfig = {
transform: {
"^.+\\.m?[jt]sx?$": swcJestTransform,
},
moduleNameMapper: {
// Force jose to use Node.js runtime instead of browser runtime in jsdom environment.
// The browser runtime expects CryptoKey to be globally available, which jsdom doesn't provide.
"^jose$": "<rootDir>/node_modules/jose/dist/node/cjs/index.js",
// remend only declares an `import` export condition, so jest's CJS resolver can't find it.
"^remend$": "<rootDir>/node_modules/remend/dist/index.js",
"^build-configs/(.*)$": "<rootDir>/frontend/build/$1",
"\\.(css|less)$": "<rootDir>/frontend/test/__mocks__/styleMock.js",
"\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)(\\?url)?$":
"<rootDir>/frontend/test/__mocks__/fileMock.js",
"^cljs/(.*)$": "<rootDir>/target/cljs_dev/$1",
// The real catalogues are a build artifact, so tests resolve a small fixture
// per locale instead.
"^locales/(.*)\\.json$": "<rootDir>/frontend/test/__mocks__/locales/$1.json",
"\\.svg\\?(component|source)":
"<rootDir>/frontend/test/__mocks__/svgMock.tsx",
"csv-parse/browser/esm/sync":
"<rootDir>/node_modules/csv-parse/dist/cjs/sync",
"csv-stringify/browser/esm/sync":
"<rootDir>/node_modules/csv-stringify/dist/cjs/sync",
/**
* SDK components import root SDK folder (`embedding-sdk`) that contains the ee plugins.
* This isn't a problem in the core app because we seem to not import to entry file directly
* for any component under tests.
*/
"sdk-ee-plugins": "<rootDir>/frontend/src/metabase/plugins/noop.ts",
/**
* SDK iframe embedding imports the embedding sdk and its components.
* We want to exclude the SDK from the main app's bundle to reduce the bundle size.
*/
"sdk-iframe-embedding-ee-plugins":
"<rootDir>/frontend/src/metabase/utils/noop.ts",
"ee-plugins": "<rootDir>/frontend/src/metabase/utils/noop.ts",
"ee-overrides": "<rootDir>/frontend/src/metabase/utils/noop.ts",
/**
* Docs snippets are loaded as raw text (asset/source) in rspack.
* In Jest, mock them as plain strings.
*/
"^docs/embedding/sdk/snippets/(.*)$":
"<rootDir>/frontend/test/__mocks__/fileMock.js",
"docs/(.*)$": "<rootDir>/docs/$1",
},
transformIgnorePatterns: [
// Combined pattern for both flat and bun isolated node_modules structures
// - Flat: node_modules/<pkg>/ where <pkg> is NOT in esmPackages
// - Bun: node_modules/.bun/<pkg>@<ver>/ where <pkg> is NOT in esmPackages
`<rootDir>/node_modules/(?:\\.bun/(?!(${esmPackages.join("|")})@)|(?!\\.bun)(?!(${esmPackages.join("|")})/))`,
// CLJS files are already compiled CJS — skip transform entirely
"<rootDir>/target/cljs_dev/",
],
testPathIgnorePatterns: [
"<rootDir>/frontend/.*/.*.tz.unit.spec.{js,jsx,ts,tsx}",
"<rootDir>/release/.*",
],
testMatch: ["<rootDir>/**/*.unit.spec.{js,jsx,ts,tsx}"],
modulePaths: [
"<rootDir>/frontend/test",
"<rootDir>/frontend/src",
"<rootDir>/enterprise/frontend/src",
],
modulePathIgnorePatterns: [
"<rootDir>/target/cljs_release/.*",
"<rootDir>/target/classes/.*",
"<rootDir>/resources/frontend_client",
"<rootDir>/.*/__mocks__",
"<rootDir>/enterprise/frontend/src/custom-viz",
],
setupFiles: [
"<rootDir>/frontend/test/jest-setup.js",
"<rootDir>/frontend/test/metabase-bootstrap.js",
"<rootDir>/frontend/test/register-visualizations.js",
],
setupFilesAfterEnv: [
"<rootDir>/frontend/test/jest-setup-eager.js",
"<rootDir>/frontend/test/jest-setup-env.js",
],
globals: {
ga: {},
},
coverageDirectory: "./coverage",
collectCoverageFrom: [
"frontend/src/**/*.{js,jsx,ts,tsx}",
"enterprise/frontend/src/**/*.{js,jsx,ts,tsx}",
"!<rootDir>/**/*.styled.{js,jsx,ts,tsx}",
"!<rootDir>/**/*.story.{js,jsx,ts,tsx}",
"!<rootDir>/**/*.info.{js,jsx,ts,tsx}",
"!<rootDir>/**/*.unit.spec.{js,jsx,ts,tsx}",
],
coveragePathIgnorePatterns: [
"/node_modules/",
"/target/cljs_dev/",
"/target/cljs_release/",
"/frontend/test/",
],
testEnvironment: "jest-environment-jsdom",
testRunner: "<rootDir>/frontend/test/jest-test-runner.js",
};
// eslint-disable-next-line import/no-commonjs
module.exports = baseConfig;