UNPKG

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