UNPKG

5.2 kBJavaScriptView Raw
1"use strict";
2
3require("core-js/modules/es.promise.js");
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.add = add;
9exports.addStorybookAddonToFile = exports.getPackageArg = exports.getInstalledStorybookVersion = exports.getPackageName = exports.storybookAddonScope = void 0;
10
11var _path = _interopRequireDefault(require("path"));
12
13var _fs = _interopRequireDefault(require("fs"));
14
15var _crossSpawn = require("cross-spawn");
16
17var _helpers = require("./helpers");
18
19var _jsPackageManager = require("./js-package-manager");
20
21function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
22
23const logger = console;
24const storybookAddonScope = '@storybook/addon-';
25exports.storybookAddonScope = storybookAddonScope;
26
27const isAddon = async (packageManager, name) => {
28 try {
29 await packageManager.latestVersion(name);
30 return true;
31 } catch (e) {
32 return false;
33 }
34};
35
36const isStorybookAddon = async (packageManager, name) => isAddon(packageManager, `${storybookAddonScope}${name}`);
37
38const getPackageName = (addonName, isOfficialAddon) => isOfficialAddon ? storybookAddonScope + addonName : addonName;
39
40exports.getPackageName = getPackageName;
41
42const getInstalledStorybookVersion = packageJson => packageJson.devDependencies[// This only considers the first occurrence.
43Object.keys(packageJson.devDependencies).find(devDep => /@storybook/.test(devDep))] || false;
44
45exports.getInstalledStorybookVersion = getInstalledStorybookVersion;
46
47const getPackageArg = (addonName, isOfficialAddon, packageJson) => {
48 if (isOfficialAddon) {
49 const addonNameNoTag = addonName.split('@')[0];
50 const installedStorybookVersion = getInstalledStorybookVersion(packageJson);
51 return installedStorybookVersion ? `${addonNameNoTag}@${getInstalledStorybookVersion(packageJson)}` : addonName;
52 }
53
54 return addonName;
55};
56
57exports.getPackageArg = getPackageArg;
58
59const installAddon = (packageManager, addonName, isOfficialAddon) => {
60 const prepareDone = (0, _helpers.commandLog)(`Preparing to install the ${addonName} Storybook addon`);
61 prepareDone();
62 logger.log();
63 const packageArg = getPackageArg(addonName, isOfficialAddon, packageManager.retrievePackageJson());
64 logger.log();
65 const installDone = (0, _helpers.commandLog)(`Installing the ${addonName} Storybook addon`);
66
67 try {
68 packageManager.addDependencies({}, [packageArg]);
69 } catch (e) {
70 installDone(`Something went wrong installing the addon: "${getPackageName(addonName, isOfficialAddon)}"`);
71 logger.log();
72 process.exit(1);
73 }
74
75 installDone();
76};
77
78const addStorybookAddonToFile = (addonName, addonsFile, isOfficialAddon) => {
79 const addonNameNoTag = addonName.split('@')[0];
80 const alreadyRegistered = addonsFile.find(line => line.includes(`${addonNameNoTag}/register`));
81
82 if (alreadyRegistered) {
83 return addonsFile;
84 }
85
86 const latestImportIndex = addonsFile.reduce((prev, curr, currIndex) => curr.startsWith('import') && curr.includes('register') ? currIndex : prev, -1);
87 return [...addonsFile.slice(0, latestImportIndex + 1), `import '${getPackageName(addonNameNoTag, isOfficialAddon)}/register';`, ...addonsFile.slice(latestImportIndex + 1)];
88};
89
90exports.addStorybookAddonToFile = addStorybookAddonToFile;
91const LEGACY_CONFIGS = ['addons', 'config', 'presets'];
92
93const postinstallAddon = async (addonName, isOfficialAddon) => {
94 let skipMsg = null;
95
96 if (!isOfficialAddon) {
97 skipMsg = 'unofficial addon';
98 } else if (!_fs.default.existsSync('.storybook')) {
99 skipMsg = 'no .storybook config';
100 } else {
101 skipMsg = 'no codmods found';
102 LEGACY_CONFIGS.forEach(config => {
103 try {
104 const codemod = require.resolve(`${getPackageName(addonName, isOfficialAddon)}/postinstall/${config}.js`);
105
106 (0, _helpers.commandLog)(`Running postinstall script for ${addonName}`)();
107
108 let configFile = _path.default.join('.storybook', `${config}.ts`);
109
110 if (!_fs.default.existsSync(configFile)) {
111 configFile = _path.default.join('.storybook', `${config}.js`);
112
113 if (!_fs.default.existsSync(configFile)) {
114 _fs.default.writeFileSync(configFile, '', 'utf8');
115 }
116 }
117
118 (0, _crossSpawn.sync)('npx', ['jscodeshift', '-t', codemod, configFile], {
119 stdio: 'inherit'
120 });
121 skipMsg = null;
122 } catch (err) {// resolve failed, skip
123 }
124 });
125 }
126
127 if (skipMsg) {
128 (0, _helpers.commandLog)(`Skipping postinstall for ${addonName}, ${skipMsg}`)();
129 }
130};
131
132async function add(addonName, options) {
133 const packageManager = _jsPackageManager.JsPackageManagerFactory.getPackageManager(options.useNpm);
134
135 const addonCheckDone = (0, _helpers.commandLog)(`Verifying that ${addonName} is an addon`);
136 const isOfficialAddon = await isStorybookAddon(packageManager, addonName);
137
138 if (!isOfficialAddon) {
139 if (!(await isAddon(packageManager, addonName))) {
140 addonCheckDone(`The provided package was not a Storybook addon: ${addonName}.`);
141 return;
142 }
143 }
144
145 addonCheckDone();
146 installAddon(packageManager, addonName, isOfficialAddon);
147
148 if (!options.skipPostinstall) {
149 await postinstallAddon(addonName, isOfficialAddon);
150 }
151}
\No newline at end of file