@nx/storybook
Version:
72 lines (71 loc) • 3.46 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) {
let storybook7VersionToInstall = versions_1.storybookVersion;
if ((0, utilities_1.storybookMajorVersion)() >= 7 &&
(0, utilities_1.getInstalledStorybookVersion)() &&
(0, semver_1.gte)((0, utilities_1.getInstalledStorybookVersion)(), '7.0.0')) {
storybook7VersionToInstall = (0, utilities_1.getInstalledStorybookVersion)();
}
const dependencies = {};
const devDependencies = {
'@storybook/core-server': storybook7VersionToInstall,
'@storybook/addon-essentials': storybook7VersionToInstall,
};
const packageJson = (0, devkit_1.readJson)(tree, 'package.json');
packageJson.dependencies ??= {};
packageJson.devDependencies ??= {};
if (!(0, semver_1.gte)((0, semver_1.coerce)(storybook7VersionToInstall), '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] = storybook7VersionToInstall;
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+)/);
const uiFrameworkWithoutBuilder = matchResult ? matchResult[0] : null;
if (uiFrameworkWithoutBuilder) {
devDependencies[uiFrameworkWithoutBuilder] = storybook7VersionToInstall;
}
}
if (options.uiFramework === '@storybook/vue3-vite') {
if (!packageJson.dependencies['@storybook/vue3'] &&
!packageJson.devDependencies['@storybook/vue3']) {
devDependencies['@storybook/vue3'] = storybook7VersionToInstall;
}
}
if (options.uiFramework === '@storybook/angular') {
if (!packageJson.dependencies['@angular/forms'] &&
!packageJson.devDependencies['@angular/forms']) {
devDependencies['@angular/forms'] = '*';
}
}
if (options.uiFramework === '@storybook/web-components-vite' ||
options.uiFramework === '@storybook/web-components-webpack5') {
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);
}