From 1595bf11ddc85fe76cee9a6251a8f80c30527577 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 17 May 2020 15:15:24 +0200 Subject: [PATCH] packages/cli: update jest config to point to src and use sucrase --- packages/cli/config/jest.js | 65 +++++++++++++++++++++++++------------ packages/cli/package.json | 1 + yarn.lock | 9 ++++- 3 files changed, 53 insertions(+), 22 deletions(-) diff --git a/packages/cli/config/jest.js b/packages/cli/config/jest.js index 77f345a0dd..53e0f98f18 100644 --- a/packages/cli/config/jest.js +++ b/packages/cli/config/jest.js @@ -14,44 +14,67 @@ * limitations under the License. */ -const fs = require('fs'); +const fs = require('fs-extra'); const path = require('path'); -// If the package has it's own jest config, we use that instead. It will have to -// manually extend @spotify/web-scripts/config/jest.config.js that is desired -if (fs.existsSync('jest.config.js')) { - module.exports = require(path.resolve('jest.config.js')); -} else if (fs.existsSync('jest.config.ts')) { - module.exports = require(path.resolve('jest.config.ts')); -} else { - const extraOptions = { - modulePaths: [''], - moduleNameMapper: { - '\\.(css|less|scss|sss|styl)$': require.resolve('jest-css-modules'), - }, +async function getConfig() { + // If the package has it's own jest config, we use that instead. + if (await fs.pathExists('jest.config.js')) { + return require(path.resolve('jest.config.js')); + } else if (await fs.pathExists('jest.config.ts')) { + return require(path.resolve('jest.config.ts')); + } + + const moduleNameMapper = { + '\\.(css|less|scss|sss|styl)$': require.resolve('jest-css-modules'), + }; + + // Only point to src/ if we're not in CI, there we just build packages first anyway + if (!process.env.CI) { + const LernaProject = require('@lerna/project'); + const project = new LernaProject(path.resolve('.')); + const packages = await project.getPackages(); + + // To avoid having to build all deps inside the monorepo before running tests, + // we point directory to src/ where applicable. + for (const pkg of packages) { + const mainSrc = pkg.get('main:src'); + if (mainSrc) { + moduleNameMapper[pkg.name] = path.resolve(pkg.location, mainSrc); + } + } + } + + const options = { + rootDir: path.resolve('src'), + coverageDirectory: path.resolve('coverage'), + collectCoverageFrom: ['**/*.{js,jsx,ts,tsx}', '!**/*.d.ts'], + moduleNameMapper, + // We build .esm.js files with plugin:build, so to be able to load these in tests they need to be transformed // TODO: jest is working on module support, it's possible that we can remove this in the future transform: { '\\.esm\\.js$': require.resolve('jest-esm-transformer'), + '\\.(js|jsx|ts|tsx)': require.resolve('@sucrase/jest-plugin'), }, - // Default behaviour is to not apply transforms for node_modules, but we still want to tranform .esm.js files + + // Default behaviour is to not apply transforms for node_modules, but we still want + // to apply the esm-transformer to .esm.js files, since that's what we use in backstage packages. transformIgnorePatterns: ['/node_modules/(?!.*\\.esm\\.js$)'], }; // Use src/setupTests.ts as the default location for configuring test env if (fs.existsSync('src/setupTests.ts')) { - extraOptions.setupFilesAfterEnv = ['/setupTests.ts']; + options.setupFilesAfterEnv = ['/setupTests.ts']; } - module.exports = { - // We base the jest config on web-scripts, it's pretty flat so we skip any complex merging of config objects - // Config can be found here: https://github.com/spotify/web-scripts/blob/master/packages/web-scripts/config/jest.config.js - ...require('@spotify/web-scripts/config/jest.config.js'), - - ...extraOptions, + return { + ...options, // If the package has a jest object in package.json we merge that config in. This is the recommended // location for configuring tests. ...require(path.resolve('package.json')).jest, }; } + +module.exports = getConfig(); diff --git a/packages/cli/package.json b/packages/cli/package.json index 5e028e72a8..f3f9b04667 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -36,6 +36,7 @@ "@rollup/plugin-json": "^4.0.2", "@rollup/plugin-node-resolve": "^7.1.1", "@spotify/web-scripts": "^6.0.0", + "@sucrase/jest-plugin": "^2.0.0", "@sucrase/webpack-loader": "^2.0.0", "bfj": "^7.0.2", "chalk": "^4.0.0", diff --git a/yarn.lock b/yarn.lock index 47b54d2f7a..13820ed3e8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3395,6 +3395,13 @@ "@styled-system/core" "^5.1.2" "@styled-system/css" "^5.1.5" +"@sucrase/jest-plugin@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sucrase/jest-plugin/-/jest-plugin-2.0.0.tgz#bcca4d877f5013fd66d4092e4c8ba475b18228e4" + integrity sha512-UqmtOnj2OliwV1qKFCQsci41vPX665wGvf5YosRjL+l6jF69HrgB3T8gGnCcF4tAmRycYw8t59x+Dgz64szXWA== + dependencies: + sucrase "^3.0.0" + "@sucrase/webpack-loader@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@sucrase/webpack-loader/-/webpack-loader-2.0.0.tgz#b8a70b8d3df3eeb570e6a3315e1a9c6b723e4a37" @@ -18844,7 +18851,7 @@ stylis@3.5.0: resolved "https://registry.npmjs.org/stylis/-/stylis-3.5.0.tgz#016fa239663d77f868fef5b67cf201c4b7c701e1" integrity sha512-pP7yXN6dwMzAR29Q0mBrabPCe0/mNO1MSr93bhay+hcZondvMMTpeGyd8nbhYJdyperNT2DRxONQuUGcJr5iPw== -sucrase@^3.14.0: +sucrase@^3.0.0, sucrase@^3.14.0: version "3.14.0" resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.14.0.tgz#4364f4da5d57465acba364ef65b14ca78672d500" integrity sha512-sWyDtHMD0Q1wv4GpL3Jp10Pxi8ht4qrYeo1tAtHJ21BaMjl3PCrIM22FudoKRVY90r+lj3ytvIcf6WkYqt7TJg==