@nx/storybook
Version:
72 lines (71 loc) • 3.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ensureDependencies = ensureDependencies;
const devkit_1 = require("@nx/devkit");
const semver_1 = require("semver");
const utilities_1 = require("../../../utils/utilities");
const versions_1 = require("../../../utils/versions");
function ensureDependencies(tree, options) {
const storybookVersionToInstall = (0, utilities_1.getInstalledStorybookVersion)(tree);
const installedStorybookMajorVersion = (0, utilities_1.storybookMajorVersion)(tree);
const dependencies = {};
const devDependencies = installedStorybookMajorVersion < 9
? {
'@storybook/core-server': storybookVersionToInstall,
'@storybook/addon-essentials': storybookVersionToInstall,
}
: {};
const packageJson = (0, devkit_1.readJson)(tree, 'package.json');
packageJson.dependencies ??= {};
packageJson.devDependencies ??= {};
if (!(0, semver_1.gte)((0, semver_1.coerce)(storybookVersionToInstall), '8.0.0')) {
// Needed for Storybook 7
// https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#react-peer-dependencies-required
if (!packageJson.dependencies['react'] &&
!packageJson.devDependencies['react']) {
dependencies['react'] = versions_1.reactVersion;
}
if (!packageJson.dependencies['react-dom'] &&
!packageJson.devDependencies['react-dom']) {
dependencies['react-dom'] = versions_1.reactVersion;
}
}
if (options.uiFramework) {
devDependencies[options.uiFramework] = storybookVersionToInstall;
const isPnpm = (0, devkit_1.detectPackageManager)(tree.root) === 'pnpm';
if (isPnpm) {
// If it's pnpm, it needs the framework without the builder
// as a dependency too (eg. @storybook/react)
const matchResult = options.uiFramework?.match(/^@storybook\/([\w-]+?)(?:-(?:vite|webpack5|webpack))?$/);
const uiFrameworkWithoutBuilder = matchResult
? `@storybook/${matchResult[1]}`
: null;
if (uiFrameworkWithoutBuilder &&
uiFrameworkWithoutBuilder !== options.uiFramework) {
devDependencies[uiFrameworkWithoutBuilder] = storybookVersionToInstall;
}
}
if (options.uiFramework === '@storybook/vue3-vite') {
if (!packageJson.dependencies['@storybook/vue3'] &&
!packageJson.devDependencies['@storybook/vue3']) {
devDependencies['@storybook/vue3'] = storybookVersionToInstall;
}
}
if (options.uiFramework === '@storybook/angular') {
if (!packageJson.dependencies['@angular/forms'] &&
!packageJson.devDependencies['@angular/forms']) {
devDependencies['@angular/forms'] = '*';
}
}
if (options.uiFramework === '@storybook/web-components-vite') {
devDependencies['lit'] = versions_1.litVersion;
}
if (options.uiFramework.endsWith('-vite')) {
if (!packageJson.dependencies['vite'] &&
!packageJson.devDependencies['vite']) {
devDependencies['vite'] = versions_1.viteVersion;
}
}
}
return (0, devkit_1.addDependenciesToPackageJson)(tree, dependencies, devDependencies);
}