UNPKG

5.29 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.upgrade = exports.addExtraFlags = exports.checkVersionConsistency = exports.isCorePackage = exports.getStorybookVersion = void 0;
7
8require("core-js/modules/es.promise.js");
9
10var _crossSpawn = require("cross-spawn");
11
12var _semver = _interopRequireDefault(require("@storybook/semver"));
13
14var _nodeLogger = require("@storybook/node-logger");
15
16var _jsPackageManager = require("./js-package-manager");
17
18var _helpers = require("./helpers");
19
20var _automigrate = require("./automigrate");
21
22function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
24const versionRegex = /(@storybook\/[^@]+)@(\S+)/;
25
26const getStorybookVersion = line => {
27 if (line.startsWith('npm ')) return null;
28 const match = versionRegex.exec(line);
29 if (!match || !_semver.default.clean(match[2])) return null;
30 return {
31 package: match[1],
32 version: match[2]
33 };
34};
35
36exports.getStorybookVersion = getStorybookVersion;
37const excludeList = ['@storybook/linter-config', '@storybook/design-system', '@storybook/ember-cli-storybook', '@storybook/semver', '@storybook/eslint-config-storybook', '@storybook/bench', '@storybook/addon-bench', '@storybook/addon-console', '@storybook/csf', '@storybook/storybook-deployer', '@storybook/addon-postcss', '@storybook/react-docgen-typescript-plugin', '@storybook/babel-plugin-require-context-hook', '@storybook/builder-vite', '@storybook/mdx1-csf', '@storybook/mdx2-csf'];
38
39const isCorePackage = pkg => pkg.startsWith('@storybook/') && !pkg.startsWith('@storybook/preset-') && !excludeList.includes(pkg);
40
41exports.isCorePackage = isCorePackage;
42const deprecatedPackages = [{
43 minVersion: '6.0.0-alpha.0',
44 url: 'https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#60-deprecations',
45 deprecations: ['@storybook/addon-notes', '@storybook/addon-info', '@storybook/addon-contexts', '@storybook/addon-options', '@storybook/addon-centered']
46}];
47
48const formatPackage = pkg => `${pkg.package}@${pkg.version}`;
49
50const warnPackages = pkgs => pkgs.forEach(pkg => _nodeLogger.logger.warn(`- ${formatPackage(pkg)}`));
51
52const checkVersionConsistency = () => {
53 const lines = (0, _crossSpawn.sync)('npm', ['ls'], {
54 stdio: 'pipe'
55 }).output.toString().split('\n');
56 const storybookPackages = lines.map(getStorybookVersion).filter(Boolean).filter(pkg => isCorePackage(pkg.package));
57
58 if (!storybookPackages.length) {
59 _nodeLogger.logger.warn('No storybook core packages found.');
60
61 _nodeLogger.logger.warn(`'npm ls | grep storybook' can show if multiple versions are installed.`);
62
63 return;
64 }
65
66 storybookPackages.sort((a, b) => _semver.default.rcompare(a.version, b.version));
67 const latestVersion = storybookPackages[0].version;
68 const outdated = storybookPackages.filter(pkg => pkg.version !== latestVersion);
69
70 if (outdated.length > 0) {
71 _nodeLogger.logger.warn(`Found ${outdated.length} outdated packages (relative to '${formatPackage(storybookPackages[0])}')`);
72
73 _nodeLogger.logger.warn('Please make sure your packages are updated to ensure a consistent experience.');
74
75 warnPackages(outdated);
76 }
77
78 deprecatedPackages.forEach(({
79 minVersion,
80 url,
81 deprecations
82 }) => {
83 if (_semver.default.gte(latestVersion, minVersion)) {
84 const deprecated = storybookPackages.filter(pkg => deprecations.includes(pkg.package));
85
86 if (deprecated.length > 0) {
87 _nodeLogger.logger.warn(`Found ${deprecated.length} deprecated packages since ${minVersion}`);
88
89 _nodeLogger.logger.warn(`See ${url}`);
90
91 warnPackages(deprecated);
92 }
93 }
94 });
95};
96
97exports.checkVersionConsistency = checkVersionConsistency;
98const EXTRA_FLAGS = {
99 'react-scripts@<5': ['--reject', '/preset-create-react-app/']
100};
101
102const addExtraFlags = (extraFlags, flags, {
103 dependencies,
104 devDependencies
105}) => {
106 return Object.entries(extraFlags).reduce((acc, entry) => {
107 const [pattern, extra] = entry;
108 const [pkg, specifier] = (0, _jsPackageManager.getPackageDetails)(pattern);
109 const pkgVersion = dependencies[pkg] || devDependencies[pkg];
110
111 if (pkgVersion && _semver.default.satisfies(_semver.default.coerce(pkgVersion), specifier)) {
112 return [...acc, ...extra];
113 }
114
115 return acc;
116 }, [...flags]);
117};
118
119exports.addExtraFlags = addExtraFlags;
120
121const upgrade = async ({
122 prerelease,
123 skipCheck,
124 useNpm,
125 dryRun,
126 yes
127}) => {
128 const packageManager = _jsPackageManager.JsPackageManagerFactory.getPackageManager(useNpm);
129
130 (0, _helpers.commandLog)(`Checking for latest versions of '@storybook/*' packages`);
131 let flags = [];
132 if (!dryRun) flags.push('--upgrade');
133 flags.push('--target');
134 flags.push(prerelease ? 'greatest' : 'latest');
135 flags = addExtraFlags(EXTRA_FLAGS, flags, packageManager.retrievePackageJson());
136 const check = (0, _crossSpawn.sync)('npx', ['npm-check-updates@latest', '/storybook/', ...flags], {
137 stdio: 'pipe'
138 }).output.toString();
139
140 _nodeLogger.logger.info(check);
141
142 if (!dryRun) {
143 (0, _helpers.commandLog)(`Installing upgrades`);
144 packageManager.installDependencies();
145 }
146
147 if (!skipCheck) {
148 checkVersionConsistency();
149 await (0, _automigrate.automigrate)({
150 dryRun,
151 yes
152 });
153 }
154};
155
156exports.upgrade = upgrade;
\No newline at end of file