@storybook/addon-coverage
Version:
Tools to support code coverage in Storybook
109 lines (103 loc) • 3.79 kB
JavaScript
// src/preset.ts
import { fileURLToPath } from "url";
// src/constants.ts
var commonExtensions = [".js", ".mjs", ".cjs", ".ts", ".cts", ".mts"];
var defaultExtensions = [...commonExtensions, ".tsx", ".jsx", ".vue", ".svelte"];
var testFileExtensions = defaultExtensions.map((extension) => extension.slice(1)).join(",");
var configFileExtensions = commonExtensions.map((extension) => extension.slice(1)).join(",");
var defaultExclude = [
"**/node_modules/**",
".storybook/**",
"coverage/**",
"packages/*/test{,s}/**",
"**/*.d.ts",
"**/*.mock.*",
"test{,s}/**",
`test{,-*}.{${testFileExtensions}}`,
`**/*{.,-}{spec,story,stories,types}.{${testFileExtensions}}`,
"**/__tests__/**",
"**/*-entry.js",
/* Exclude common development tool configuration files */
`**/{ava,babel,nyc}.config.{${configFileExtensions}}`,
`**/{jest,vitest}.config.{${configFileExtensions}}`,
`**/{karma,rollup,webpack,vite}.config.{${configFileExtensions}}`,
`**/.{eslint,mocha}rc.{${configFileExtensions}}`
];
// src/webpack5-exclude.ts
import TestExclude from "test-exclude";
// src/nyc-config.ts
import { loadNycConfig } from "@istanbuljs/load-nyc-config";
async function getNycConfig(opts = {}) {
const cwd = opts.cwd ?? process.cwd();
return loadNycConfig({
cwd,
nycrcPath: opts.nycrcPath
});
}
// src/webpack5-exclude.ts
async function createTestExclude(opts = {}) {
const { nycrcPath, include, exclude, extension } = opts;
const cwd = opts.cwd ?? process.cwd();
const nycConfig = await getNycConfig({
cwd,
nycrcPath
});
return new TestExclude({
cwd,
include: include ?? nycConfig.include,
exclude: exclude ?? nycConfig.exclude ?? defaultExclude,
extension: extension ?? nycConfig.extension ?? defaultExtensions,
excludeNodeModules: true
});
}
// src/preset.ts
import { createInstrumenter } from "istanbul-lib-instrument";
var viteFinal = async (viteConfig, options) => {
const viteIstanbulPlugin = (await import("vite-plugin-istanbul")).default;
const istanbul = viteIstanbulPlugin ?? viteIstanbulPlugin.default;
console.log("[addon-coverage] Adding istanbul plugin to Vite config");
viteConfig.build = viteConfig.build || {};
viteConfig.build.sourcemap = true;
viteConfig.plugins ||= [];
viteConfig.plugins.push(
istanbul({
forceBuildInstrument: options.configType === "PRODUCTION",
...options.istanbul,
include: Array.from(options.istanbul?.include || []),
exclude: [options.configDir + "/**", ...defaultExclude, ...Array.from(options.istanbul?.exclude || [])],
extension: options.istanbul?.extension || defaultExtensions
})
);
return viteConfig;
};
var defaultOptions = {
preserveComments: true,
produceSourceMap: true,
autoWrap: true,
esModules: true,
compact: false
};
var webpackFinal = async (webpackConfig, options) => {
webpackConfig.module.rules ||= [];
const nycConfig = await getNycConfig(options.istanbul);
const extensions = options.istanbul?.extension ?? nycConfig.extension ?? defaultExtensions;
console.log("[addon-coverage] Adding istanbul loader to Webpack config");
const testExclude = await createTestExclude(options.istanbul);
let instrumenterOptions = Object.assign(defaultOptions, options.istanbul);
let instrumenter = createInstrumenter(instrumenterOptions);
webpackConfig.module.rules.unshift({
test: new RegExp(extensions?.join("|").replace(/\./g, "\\.")),
loader: fileURLToPath(import.meta.resolve("@storybook/addon-coverage/loader/webpack5-istanbul-loader")),
enforce: "post",
options: {
...options.istanbul ?? {},
instrumenter
},
include: (modulePath) => testExclude.shouldInstrument(modulePath)
});
return webpackConfig;
};
export {
viteFinal,
webpackFinal
};