@storybook/cli 7.0.0-alpha.21 → 7.0.0-alpha.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/cjs/automigrate/fixes/builder-vite.js +1 -3
  2. package/dist/cjs/detect.js +2 -18
  3. package/dist/cjs/generators/RAX/index.js +1 -3
  4. package/dist/cjs/generators/baseGenerator.js +18 -14
  5. package/dist/cjs/initiate.js +10 -3
  6. package/dist/cjs/js-package-manager/JsPackageManager.js +59 -10
  7. package/dist/cjs/js-package-manager/JsPackageManagerFactory.js +25 -11
  8. package/dist/cjs/js-package-manager/NPMProxy.js +6 -0
  9. package/dist/cjs/js-package-manager/Yarn1Proxy.js +6 -0
  10. package/dist/cjs/js-package-manager/Yarn2Proxy.js +6 -0
  11. package/dist/cjs/js-package-manager/index.js +0 -13
  12. package/dist/cjs/repro-generators/scripts.js +1 -1
  13. package/dist/cjs/repro-templates.js +49 -14
  14. package/dist/cjs/versions.js +78 -75
  15. package/dist/esm/automigrate/fixes/builder-vite.js +1 -2
  16. package/dist/esm/detect.js +2 -17
  17. package/dist/esm/generators/RAX/index.js +1 -2
  18. package/dist/esm/generators/baseGenerator.js +18 -14
  19. package/dist/esm/initiate.js +10 -3
  20. package/dist/esm/js-package-manager/JsPackageManager.js +55 -9
  21. package/dist/esm/js-package-manager/JsPackageManagerFactory.js +25 -11
  22. package/dist/esm/js-package-manager/NPMProxy.js +6 -0
  23. package/dist/esm/js-package-manager/Yarn1Proxy.js +6 -0
  24. package/dist/esm/js-package-manager/Yarn2Proxy.js +6 -0
  25. package/dist/esm/js-package-manager/index.js +1 -2
  26. package/dist/esm/repro-generators/scripts.js +1 -1
  27. package/dist/esm/repro-templates.js +48 -15
  28. package/dist/esm/versions.js +78 -75
  29. package/dist/types/detect.d.ts +2 -2
  30. package/dist/types/js-package-manager/JsPackageManager.d.ts +13 -0
  31. package/dist/types/js-package-manager/JsPackageManagerFactory.d.ts +1 -1
  32. package/dist/types/js-package-manager/NPMProxy.d.ts +4 -0
  33. package/dist/types/js-package-manager/Yarn1Proxy.d.ts +6 -0
  34. package/dist/types/js-package-manager/Yarn2Proxy.d.ts +6 -0
  35. package/dist/types/js-package-manager/index.d.ts +0 -1
  36. package/dist/types/repro-templates.d.ts +54 -14
  37. package/dist/types/versions.d.ts +3 -0
  38. package/package.json +9 -16
  39. package/dist/cjs/js-package-manager/PackageJsonHelper.js +0 -33
  40. package/dist/esm/js-package-manager/PackageJsonHelper.js +0 -17
  41. package/dist/types/js-package-manager/PackageJsonHelper.d.ts +0 -3
@@ -6,80 +6,83 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  // auto generated file, do not edit
8
8
  var _default = {
9
- '@storybook/addon-a11y': '7.0.0-alpha.21',
10
- '@storybook/addon-actions': '7.0.0-alpha.21',
11
- '@storybook/addon-backgrounds': '7.0.0-alpha.21',
12
- '@storybook/addon-controls': '7.0.0-alpha.21',
13
- '@storybook/addon-docs': '7.0.0-alpha.21',
14
- '@storybook/addon-essentials': '7.0.0-alpha.21',
15
- '@storybook/addon-highlight': '7.0.0-alpha.21',
16
- '@storybook/addon-interactions': '7.0.0-alpha.21',
17
- '@storybook/addon-jest': '7.0.0-alpha.21',
18
- '@storybook/addon-links': '7.0.0-alpha.21',
19
- '@storybook/addon-measure': '7.0.0-alpha.21',
20
- '@storybook/addon-outline': '7.0.0-alpha.21',
21
- '@storybook/addon-storyshots': '7.0.0-alpha.21',
22
- '@storybook/addon-storyshots-puppeteer': '7.0.0-alpha.21',
23
- '@storybook/addon-storysource': '7.0.0-alpha.21',
24
- '@storybook/addon-toolbars': '7.0.0-alpha.21',
25
- '@storybook/addon-viewport': '7.0.0-alpha.21',
26
- '@storybook/addons': '7.0.0-alpha.21',
27
- '@storybook/angular': '7.0.0-alpha.21',
28
- '@storybook/api': '7.0.0-alpha.21',
29
- '@storybook/blocks': '7.0.0-alpha.21',
30
- '@storybook/builder-manager': '7.0.0-alpha.21',
31
- '@storybook/builder-webpack5': '7.0.0-alpha.21',
32
- '@storybook/channel-postmessage': '7.0.0-alpha.21',
33
- '@storybook/channel-websocket': '7.0.0-alpha.21',
34
- '@storybook/channels': '7.0.0-alpha.21',
35
- '@storybook/cli': '7.0.0-alpha.21',
36
- '@storybook/client-api': '7.0.0-alpha.21',
37
- '@storybook/client-logger': '7.0.0-alpha.21',
38
- '@storybook/codemod': '7.0.0-alpha.21',
39
- '@storybook/components': '7.0.0-alpha.21',
40
- '@storybook/core-client': '7.0.0-alpha.21',
41
- '@storybook/core-common': '7.0.0-alpha.21',
42
- '@storybook/core-events': '7.0.0-alpha.21',
43
- '@storybook/core-server': '7.0.0-alpha.21',
44
- '@storybook/core-webpack': '7.0.0-alpha.21',
45
- '@storybook/csf-tools': '7.0.0-alpha.21',
46
- '@storybook/docs-tools': '7.0.0-alpha.21',
47
- '@storybook/ember': '7.0.0-alpha.21',
48
- '@storybook/html': '7.0.0-alpha.21',
49
- '@storybook/html-webpack5': '7.0.0-alpha.21',
50
- '@storybook/instrumenter': '7.0.0-alpha.21',
51
- '@storybook/node-logger': '7.0.0-alpha.21',
52
- '@storybook/postinstall': '7.0.0-alpha.21',
53
- '@storybook/preact': '7.0.0-alpha.21',
54
- '@storybook/preact-webpack5': '7.0.0-alpha.21',
55
- '@storybook/preset-html-webpack': '7.0.0-alpha.21',
56
- '@storybook/preset-preact-webpack': '7.0.0-alpha.21',
57
- '@storybook/preset-react-webpack': '7.0.0-alpha.21',
58
- '@storybook/preset-server-webpack': '7.0.0-alpha.21',
59
- '@storybook/preset-svelte-webpack': '7.0.0-alpha.21',
60
- '@storybook/preset-vue-webpack': '7.0.0-alpha.21',
61
- '@storybook/preset-vue3-webpack': '7.0.0-alpha.21',
62
- '@storybook/preset-web-components-webpack': '7.0.0-alpha.21',
63
- '@storybook/preview-web': '7.0.0-alpha.21',
64
- '@storybook/react': '7.0.0-alpha.21',
65
- '@storybook/react-webpack5': '7.0.0-alpha.21',
66
- '@storybook/router': '7.0.0-alpha.21',
67
- '@storybook/server': '7.0.0-alpha.21',
68
- '@storybook/server-webpack5': '7.0.0-alpha.21',
69
- '@storybook/source-loader': '7.0.0-alpha.21',
70
- '@storybook/store': '7.0.0-alpha.21',
71
- '@storybook/svelte': '7.0.0-alpha.21',
72
- '@storybook/svelte-webpack5': '7.0.0-alpha.21',
73
- '@storybook/telemetry': '7.0.0-alpha.21',
74
- '@storybook/theming': '7.0.0-alpha.21',
75
- '@storybook/ui': '7.0.0-alpha.21',
76
- '@storybook/vue': '7.0.0-alpha.21',
77
- '@storybook/vue-webpack5': '7.0.0-alpha.21',
78
- '@storybook/vue3': '7.0.0-alpha.21',
79
- '@storybook/vue3-webpack5': '7.0.0-alpha.21',
80
- '@storybook/web-components': '7.0.0-alpha.21',
81
- '@storybook/web-components-webpack5': '7.0.0-alpha.21',
82
- sb: '7.0.0-alpha.21',
83
- storybook: '7.0.0-alpha.21'
9
+ '@storybook/addon-a11y': '7.0.0-alpha.25',
10
+ '@storybook/addon-actions': '7.0.0-alpha.25',
11
+ '@storybook/addon-backgrounds': '7.0.0-alpha.25',
12
+ '@storybook/addon-controls': '7.0.0-alpha.25',
13
+ '@storybook/addon-docs': '7.0.0-alpha.25',
14
+ '@storybook/addon-essentials': '7.0.0-alpha.25',
15
+ '@storybook/addon-highlight': '7.0.0-alpha.25',
16
+ '@storybook/addon-interactions': '7.0.0-alpha.25',
17
+ '@storybook/addon-jest': '7.0.0-alpha.25',
18
+ '@storybook/addon-links': '7.0.0-alpha.25',
19
+ '@storybook/addon-measure': '7.0.0-alpha.25',
20
+ '@storybook/addon-outline': '7.0.0-alpha.25',
21
+ '@storybook/addon-storyshots': '7.0.0-alpha.25',
22
+ '@storybook/addon-storyshots-puppeteer': '7.0.0-alpha.25',
23
+ '@storybook/addon-storysource': '7.0.0-alpha.25',
24
+ '@storybook/addon-toolbars': '7.0.0-alpha.25',
25
+ '@storybook/addon-viewport': '7.0.0-alpha.25',
26
+ '@storybook/addons': '7.0.0-alpha.25',
27
+ '@storybook/angular': '7.0.0-alpha.25',
28
+ '@storybook/api': '7.0.0-alpha.25',
29
+ '@storybook/blocks': '7.0.0-alpha.25',
30
+ '@storybook/builder-manager': '7.0.0-alpha.25',
31
+ '@storybook/builder-vite': '7.0.0-alpha.25',
32
+ '@storybook/builder-webpack5': '7.0.0-alpha.25',
33
+ '@storybook/channel-postmessage': '7.0.0-alpha.25',
34
+ '@storybook/channel-websocket': '7.0.0-alpha.25',
35
+ '@storybook/channels': '7.0.0-alpha.25',
36
+ '@storybook/cli': '7.0.0-alpha.25',
37
+ '@storybook/client-api': '7.0.0-alpha.25',
38
+ '@storybook/client-logger': '7.0.0-alpha.25',
39
+ '@storybook/codemod': '7.0.0-alpha.25',
40
+ '@storybook/components': '7.0.0-alpha.25',
41
+ '@storybook/core-client': '7.0.0-alpha.25',
42
+ '@storybook/core-common': '7.0.0-alpha.25',
43
+ '@storybook/core-events': '7.0.0-alpha.25',
44
+ '@storybook/core-server': '7.0.0-alpha.25',
45
+ '@storybook/core-webpack': '7.0.0-alpha.25',
46
+ '@storybook/csf-tools': '7.0.0-alpha.25',
47
+ '@storybook/docs-tools': '7.0.0-alpha.25',
48
+ '@storybook/ember': '7.0.0-alpha.25',
49
+ '@storybook/html': '7.0.0-alpha.25',
50
+ '@storybook/html-webpack5': '7.0.0-alpha.25',
51
+ '@storybook/instrumenter': '7.0.0-alpha.25',
52
+ '@storybook/node-logger': '7.0.0-alpha.25',
53
+ '@storybook/postinstall': '7.0.0-alpha.25',
54
+ '@storybook/preact': '7.0.0-alpha.25',
55
+ '@storybook/preact-webpack5': '7.0.0-alpha.25',
56
+ '@storybook/preset-html-webpack': '7.0.0-alpha.25',
57
+ '@storybook/preset-preact-webpack': '7.0.0-alpha.25',
58
+ '@storybook/preset-react-webpack': '7.0.0-alpha.25',
59
+ '@storybook/preset-server-webpack': '7.0.0-alpha.25',
60
+ '@storybook/preset-svelte-webpack': '7.0.0-alpha.25',
61
+ '@storybook/preset-vue-webpack': '7.0.0-alpha.25',
62
+ '@storybook/preset-vue3-webpack': '7.0.0-alpha.25',
63
+ '@storybook/preset-web-components-webpack': '7.0.0-alpha.25',
64
+ '@storybook/preview-web': '7.0.0-alpha.25',
65
+ '@storybook/react': '7.0.0-alpha.25',
66
+ '@storybook/react-vite': '7.0.0-alpha.25',
67
+ '@storybook/react-webpack5': '7.0.0-alpha.25',
68
+ '@storybook/router': '7.0.0-alpha.25',
69
+ '@storybook/server': '7.0.0-alpha.25',
70
+ '@storybook/server-webpack5': '7.0.0-alpha.25',
71
+ '@storybook/source-loader': '7.0.0-alpha.25',
72
+ '@storybook/store': '7.0.0-alpha.25',
73
+ '@storybook/svelte': '7.0.0-alpha.25',
74
+ '@storybook/svelte-webpack5': '7.0.0-alpha.25',
75
+ '@storybook/telemetry': '7.0.0-alpha.25',
76
+ '@storybook/theming': '7.0.0-alpha.25',
77
+ '@storybook/ui': '7.0.0-alpha.25',
78
+ '@storybook/vue': '7.0.0-alpha.25',
79
+ '@storybook/vue-webpack5': '7.0.0-alpha.25',
80
+ '@storybook/vue3': '7.0.0-alpha.25',
81
+ '@storybook/vue3-vite': '7.0.0-alpha.25',
82
+ '@storybook/vue3-webpack5': '7.0.0-alpha.25',
83
+ '@storybook/web-components': '7.0.0-alpha.25',
84
+ '@storybook/web-components-webpack5': '7.0.0-alpha.25',
85
+ sb: '7.0.0-alpha.25',
86
+ storybook: '7.0.0-alpha.25'
84
87
  };
85
88
  exports.default = _default;
@@ -2,7 +2,6 @@ import chalk from 'chalk';
2
2
  import { dedent } from 'ts-dedent';
3
3
  import { readConfig, writeConfig } from '@storybook/csf-tools';
4
4
  import { getStorybookInfo } from '@storybook/core-common';
5
- import { writePackageJson } from '../../js-package-manager';
6
5
  const logger = console;
7
6
 
8
7
  /**
@@ -78,7 +77,7 @@ export const builderVite = {
78
77
  if (!dryRun) {
79
78
  delete dependencies['storybook-builder-vite'];
80
79
  delete devDependencies['storybook-builder-vite'];
81
- writePackageJson(packageJson);
80
+ packageManager.writePackageJson(packageJson);
82
81
  }
83
82
 
84
83
  logger.info(`Adding '@storybook/builder-vite' as dev dependency`);
@@ -3,7 +3,6 @@ import fs from 'fs';
3
3
  import findUp from 'find-up';
4
4
  import { ProjectType, supportedTemplates, SUPPORTED_RENDERERS, SupportedLanguage, unsupportedTemplate, CoreBuilder } from './project_types';
5
5
  import { getBowerJson, paddedLog } from './helpers';
6
- import { readPackageJson } from './js-package-manager';
7
6
  import { detectNextJS } from './detect-nextjs';
8
7
  const viteConfigFiles = ['vite.config.ts', 'vite.config.js', 'vite.config.mjs'];
9
8
 
@@ -118,15 +117,8 @@ export function isStorybookInstalled(dependencies, force) {
118
117
 
119
118
  return false;
120
119
  }
121
- export function detectLanguage() {
120
+ export function detectLanguage(packageJson) {
122
121
  let language = SupportedLanguage.JAVASCRIPT;
123
- let packageJson;
124
-
125
- try {
126
- packageJson = readPackageJson();
127
- } catch (err) {//
128
- }
129
-
130
122
  const bowerJson = getBowerJson();
131
123
 
132
124
  if (!packageJson && !bowerJson) {
@@ -139,14 +131,7 @@ export function detectLanguage() {
139
131
 
140
132
  return language;
141
133
  }
142
- export function detect(options = {}) {
143
- let packageJson;
144
-
145
- try {
146
- packageJson = readPackageJson();
147
- } catch (err) {//
148
- }
149
-
134
+ export function detect(packageJson, options = {}) {
150
135
  const bowerJson = getBowerJson();
151
136
 
152
137
  if (!packageJson && !bowerJson) {
@@ -1,5 +1,4 @@
1
1
  import { baseGenerator } from '../baseGenerator';
2
- import { writePackageJson } from '../../js-package-manager';
3
2
 
4
3
  const generator = async (packageManager, npmOptions, options) => {
5
4
  const [latestRaxVersion] = await packageManager.getVersions('rax');
@@ -12,7 +11,7 @@ const generator = async (packageManager, npmOptions, options) => {
12
11
  packageJson.dependencies['rax-link'] = packageJson.dependencies['rax-link'] || raxVersion;
13
12
  packageJson.dependencies['rax-text'] = packageJson.dependencies['rax-text'] || raxVersion;
14
13
  packageJson.dependencies['rax-view'] = packageJson.dependencies['rax-view'] || raxVersion;
15
- writePackageJson(packageJson);
14
+ packageManager.writePackageJson(packageJson);
16
15
  await baseGenerator(packageManager, npmOptions, options, 'rax', {
17
16
  extraPackages: ['rax']
18
17
  });
@@ -52,6 +52,7 @@ const getFrameworkDetails = (renderer, builder, pnp) => {
52
52
  return {
53
53
  packages: [rendererPackage],
54
54
  framework: rendererPackagePath,
55
+ rendererId: 'angular',
55
56
  type: 'framework'
56
57
  };
57
58
  }
@@ -60,6 +61,7 @@ const getFrameworkDetails = (renderer, builder, pnp) => {
60
61
  return {
61
62
  packages: [frameworkPackage],
62
63
  framework: frameworkPackagePath,
64
+ rendererId: renderer,
63
65
  type: 'framework'
64
66
  };
65
67
  }
@@ -69,6 +71,7 @@ const getFrameworkDetails = (renderer, builder, pnp) => {
69
71
  packages: [rendererPackage, builderPackage],
70
72
  builder: builderPackagePath,
71
73
  renderer: rendererPackagePath,
74
+ rendererId: renderer,
72
75
  type: 'renderer'
73
76
  };
74
77
  }
@@ -78,7 +81,7 @@ const getFrameworkDetails = (renderer, builder, pnp) => {
78
81
 
79
82
  const stripVersions = addons => addons.map(addon => getPackageDetails(addon)[0]);
80
83
 
81
- const hasInteractiveStories = framework => ['react', 'angular', 'preact', 'svelte', 'vue', 'vue3', 'html'].includes(framework);
84
+ const hasInteractiveStories = rendererId => ['react', 'angular', 'preact', 'svelte', 'vue', 'vue3', 'html'].includes(rendererId);
82
85
 
83
86
  export async function baseGenerator(packageManager, npmOptions, {
84
87
  language,
@@ -96,13 +99,23 @@ export async function baseGenerator(packageManager, npmOptions, {
96
99
  addESLint,
97
100
  extraMain,
98
101
  extensions
99
- } = Object.assign({}, defaultOptions, options); // added to main.js
102
+ } = Object.assign({}, defaultOptions, options);
103
+ const {
104
+ packages: frameworkPackages,
105
+ type,
106
+ // @ts-ignore
107
+ renderer: rendererInclude,
108
+ // deepscan-disable-line UNUSED_DECL
109
+ rendererId,
110
+ framework: frameworkInclude,
111
+ builder: builderInclude
112
+ } = getFrameworkDetails(renderer, builder, pnp); // added to main.js
100
113
 
101
114
  const addons = ['@storybook/addon-links', '@storybook/addon-essentials', ...stripVersions(extraAddonPackages)]; // added to package.json
102
115
 
103
116
  const addonPackages = ['@storybook/addon-links', '@storybook/addon-essentials', ...extraAddonPackages];
104
117
 
105
- if (hasInteractiveStories(renderer)) {
118
+ if (hasInteractiveStories(rendererId)) {
106
119
  addons.push('@storybook/addon-interactions');
107
120
  addonPackages.push('@storybook/addon-interactions', '@storybook/testing-library');
108
121
  }
@@ -110,16 +123,7 @@ export async function baseGenerator(packageManager, npmOptions, {
110
123
  const yarn2ExtraPackages = packageManager.type === 'yarn2' ? ['@storybook/addon-docs', '@mdx-js/react@1.x.x'] : [];
111
124
  const files = await fse.readdir(process.cwd());
112
125
  const packageJson = packageManager.retrievePackageJson();
113
- const installedDependencies = new Set(Object.keys(Object.assign({}, packageJson.dependencies, packageJson.devDependencies)));
114
- const {
115
- packages: frameworkPackages,
116
- type,
117
- // @ts-ignore
118
- renderer: rendererInclude,
119
- // deepscan-disable-line UNUSED_DECL
120
- framework: frameworkInclude,
121
- builder: builderInclude
122
- } = getFrameworkDetails(renderer, builder, pnp); // TODO: We need to start supporting this at some point
126
+ const installedDependencies = new Set(Object.keys(Object.assign({}, packageJson.dependencies, packageJson.devDependencies))); // TODO: We need to start supporting this at some point
123
127
 
124
128
  if (type === 'renderer') {
125
129
  throw new Error(dedent`
@@ -152,7 +156,7 @@ export async function baseGenerator(packageManager, npmOptions, {
152
156
  } // FIXME: temporary workaround for https://github.com/storybookjs/storybook/issues/17516
153
157
 
154
158
 
155
- if (frameworkPackages.includes('@storybook/builder-vite')) {
159
+ if (frameworkPackages.find(pkg => pkg.match(/^@storybook\/.*-vite$/))) {
156
160
  const previewHead = dedent`
157
161
  <script>
158
162
  window.global = window;
@@ -34,7 +34,14 @@ const installStorybook = (projectType, packageManager, options) => {
34
34
  installAsDevDependencies: true,
35
35
  skipInstall: options.skipInstall
36
36
  };
37
- const language = detectLanguage();
37
+ let packageJson;
38
+
39
+ try {
40
+ packageJson = packageManager.readPackageJson();
41
+ } catch (err) {//
42
+ }
43
+
44
+ const language = detectLanguage(packageJson);
38
45
  const generatorOptions = {
39
46
  language,
40
47
  builder: options.builder || detectBuilder(packageManager),
@@ -208,7 +215,7 @@ export async function initiate(options, pkg) {
208
215
  process.exit(1);
209
216
  }
210
217
  } else {
211
- projectType = detect(options);
218
+ projectType = detect(packageJson, options);
212
219
  }
213
220
  } catch (ex) {
214
221
  done(ex.message);
@@ -225,7 +232,7 @@ export async function initiate(options, pkg) {
225
232
  }
226
233
 
227
234
  await automigrate({
228
- yes: process.env.CI === 'true'
235
+ yes: options.yes || process.env.CI === 'true'
229
236
  });
230
237
  logger.log('\nTo run your Storybook, type:\n');
231
238
  codeLog([packageManager.getRunStorybookCommand()]);
@@ -1,8 +1,9 @@
1
1
  import chalk from 'chalk';
2
2
  import { gt, satisfies } from '@storybook/semver';
3
3
  import { sync as spawnSync } from 'cross-spawn';
4
+ import path from 'path';
5
+ import fs from 'fs';
4
6
  import { commandLog } from '../helpers';
5
- import { readPackageJson, writePackageJson } from './PackageJsonHelper';
6
7
  import storybookPackagesVersions from '../versions';
7
8
  const logger = console;
8
9
  /**
@@ -25,13 +26,31 @@ export function getPackageDetails(pkg) {
25
26
  return [packageName, packageVersion];
26
27
  }
27
28
  export class JsPackageManager {
28
- constructor() {
29
- this.type = void 0;
29
+ // NOTE: for some reason yarn prefers the npm registry in
30
+ // local development, so always use npm
31
+ setRegistryURL(url) {
32
+ if (url) {
33
+ this.executeCommand('npm', ['config', 'set', 'registry', url]);
34
+ } else {
35
+ this.executeCommand('npm', ['config', 'delete', 'registry']);
36
+ }
30
37
  }
31
38
 
39
+ getRegistryURL() {
40
+ const url = this.executeCommand('npm', ['config', 'get', 'registry']).trim();
41
+ return url === 'undefined' ? undefined : url;
42
+ }
43
+
44
+ constructor(options) {
45
+ this.type = void 0;
46
+ this.cwd = void 0;
47
+ this.cwd = options?.cwd;
48
+ }
32
49
  /**
33
50
  * Install dependencies listed in `package.json`
34
51
  */
52
+
53
+
35
54
  installDependencies() {
36
55
  let done = commandLog('Preparing to install dependencies');
37
56
  done();
@@ -48,6 +67,26 @@ export class JsPackageManager {
48
67
 
49
68
  done();
50
69
  }
70
+
71
+ packageJsonPath() {
72
+ return this.cwd ? path.resolve(this.cwd, 'package.json') : path.resolve('package.json');
73
+ }
74
+
75
+ readPackageJson() {
76
+ const packageJsonPath = this.packageJsonPath();
77
+
78
+ if (!fs.existsSync(packageJsonPath)) {
79
+ throw new Error(`Could not read package.json file at ${packageJsonPath}`);
80
+ }
81
+
82
+ const jsonContent = fs.readFileSync(packageJsonPath, 'utf8');
83
+ return JSON.parse(jsonContent);
84
+ }
85
+
86
+ writePackageJson(packageJson) {
87
+ const content = `${JSON.stringify(packageJson, null, 2)}\n`;
88
+ fs.writeFileSync(this.packageJsonPath(), content, 'utf8');
89
+ }
51
90
  /**
52
91
  * Read the `package.json` file available in the directory the command was call from
53
92
  * If there is no `package.json` it will create one.
@@ -58,10 +97,10 @@ export class JsPackageManager {
58
97
  let packageJson;
59
98
 
60
99
  try {
61
- packageJson = readPackageJson();
100
+ packageJson = this.readPackageJson();
62
101
  } catch (err) {
63
102
  this.initPackageJson();
64
- packageJson = readPackageJson();
103
+ packageJson = this.readPackageJson();
65
104
  }
66
105
 
67
106
  return Object.assign({}, packageJson, {
@@ -106,7 +145,7 @@ export class JsPackageManager {
106
145
  packageJson.dependencies = Object.assign({}, packageJson.dependencies, dependenciesMap);
107
146
  }
108
147
 
109
- writePackageJson(packageJson);
148
+ this.writePackageJson(packageJson);
110
149
  } else {
111
150
  try {
112
151
  this.runAddDeps(dependencies, options.installAsDevDependencies);
@@ -148,7 +187,7 @@ export class JsPackageManager {
148
187
  delete packageJson.dependencies[dep];
149
188
  }
150
189
  });
151
- writePackageJson(packageJson);
190
+ this.writePackageJson(packageJson);
152
191
  } else {
153
192
  try {
154
193
  this.runRemoveDeps(dependencies);
@@ -253,7 +292,7 @@ export class JsPackageManager {
253
292
 
254
293
  addESLintConfig() {
255
294
  const packageJson = this.retrievePackageJson();
256
- writePackageJson(Object.assign({}, packageJson, {
295
+ this.writePackageJson(Object.assign({}, packageJson, {
257
296
  eslintConfig: Object.assign({}, packageJson.eslintConfig, {
258
297
  overrides: [...(packageJson.eslintConfig?.overrides || []), {
259
298
  files: ['**/*.stories.*'],
@@ -267,13 +306,20 @@ export class JsPackageManager {
267
306
 
268
307
  addScripts(scripts) {
269
308
  const packageJson = this.retrievePackageJson();
270
- writePackageJson(Object.assign({}, packageJson, {
309
+ this.writePackageJson(Object.assign({}, packageJson, {
271
310
  scripts: Object.assign({}, packageJson.scripts, scripts)
272
311
  }));
273
312
  }
274
313
 
314
+ addPackageResolutions(versions) {
315
+ const packageJson = this.retrievePackageJson();
316
+ const resolutions = this.getResolutions(packageJson, versions);
317
+ this.writePackageJson(Object.assign({}, packageJson, resolutions));
318
+ }
319
+
275
320
  executeCommand(command, args, stdio) {
276
321
  const commandResult = spawnSync(command, args, {
322
+ cwd: this.cwd,
277
323
  stdio: stdio ?? 'pipe',
278
324
  encoding: 'utf-8'
279
325
  });
@@ -4,21 +4,31 @@ import { NPMProxy } from './NPMProxy';
4
4
  import { Yarn2Proxy } from './Yarn2Proxy';
5
5
  import { Yarn1Proxy } from './Yarn1Proxy';
6
6
  export class JsPackageManagerFactory {
7
- static getPackageManager(forceNpmUsage = false) {
7
+ static getPackageManager(forceNpmUsage = false, cwd) {
8
8
  if (forceNpmUsage) {
9
- return new NPMProxy();
9
+ return new NPMProxy({
10
+ cwd
11
+ });
10
12
  }
11
13
 
12
- const yarnVersion = getYarnVersion();
13
- const hasYarnLockFile = findUpSync('yarn.lock');
14
- const hasNPMCommand = hasNPM();
14
+ const yarnVersion = getYarnVersion(cwd);
15
+ const hasYarnLockFile = findUpSync('yarn.lock', {
16
+ cwd
17
+ });
18
+ const hasNPMCommand = hasNPM(cwd);
15
19
 
16
20
  if (yarnVersion && (hasYarnLockFile || !hasNPMCommand)) {
17
- return yarnVersion === 1 ? new Yarn1Proxy() : new Yarn2Proxy();
21
+ return yarnVersion === 1 ? new Yarn1Proxy({
22
+ cwd
23
+ }) : new Yarn2Proxy({
24
+ cwd
25
+ });
18
26
  }
19
27
 
20
28
  if (hasNPMCommand) {
21
- return new NPMProxy();
29
+ return new NPMProxy({
30
+ cwd
31
+ });
22
32
  }
23
33
 
24
34
  throw new Error('Unable to find a usable package manager within NPM, Yarn and Yarn 2');
@@ -26,13 +36,17 @@ export class JsPackageManagerFactory {
26
36
 
27
37
  }
28
38
 
29
- function hasNPM() {
30
- const npmVersionCommand = spawnSync('npm', ['--version']);
39
+ function hasNPM(cwd) {
40
+ const npmVersionCommand = spawnSync('npm', ['--version'], {
41
+ cwd
42
+ });
31
43
  return npmVersionCommand.status === 0;
32
44
  }
33
45
 
34
- function getYarnVersion() {
35
- const yarnVersionCommand = spawnSync('yarn', ['--version']);
46
+ function getYarnVersion(cwd) {
47
+ const yarnVersionCommand = spawnSync('yarn', ['--version'], {
48
+ cwd
49
+ });
36
50
 
37
51
  if (yarnVersionCommand.status !== 0) {
38
52
  return undefined;
@@ -53,6 +53,12 @@ export class NPMProxy extends JsPackageManager {
53
53
  return this.uninstallArgs;
54
54
  }
55
55
 
56
+ getResolutions(packageJson, versions) {
57
+ return {
58
+ overrides: Object.assign({}, packageJson.overrides, versions)
59
+ };
60
+ }
61
+
56
62
  runInstall() {
57
63
  this.executeCommand('npm', this.getInstallArgs(), 'inherit');
58
64
  }
@@ -17,6 +17,12 @@ export class Yarn1Proxy extends JsPackageManager {
17
17
  return `yarn ${command}`;
18
18
  }
19
19
 
20
+ getResolutions(packageJson, versions) {
21
+ return {
22
+ resolutions: Object.assign({}, packageJson.resolutions, versions)
23
+ };
24
+ }
25
+
20
26
  runInstall() {
21
27
  this.executeCommand('yarn', [], 'inherit');
22
28
  }
@@ -17,6 +17,12 @@ export class Yarn2Proxy extends JsPackageManager {
17
17
  return `yarn ${command}`;
18
18
  }
19
19
 
20
+ getResolutions(packageJson, versions) {
21
+ return {
22
+ resolutions: Object.assign({}, packageJson.resolutions, versions)
23
+ };
24
+ }
25
+
20
26
  runInstall() {
21
27
  this.executeCommand('yarn', [], 'inherit');
22
28
  }
@@ -1,4 +1,3 @@
1
1
  export * from './JsPackageManagerFactory';
2
2
  export * from './JsPackageManager';
3
- export * from './PackageJson';
4
- export * from './PackageJsonHelper';
3
+ export * from './PackageJson';
@@ -112,7 +112,7 @@ const configureYarn2ForE2E = async ({
112
112
  cwd
113
113
  }) => {
114
114
  const command = [// ⚠️ Need to set registry because Yarn 2 is not using the conf of Yarn 1 (URL is hardcoded in CircleCI config.yml)
115
- `yarn config set npmScopes --json '{ "storybook": { "npmRegistryServer": "http://localhost:6000/" } }'`, // Some required magic to be able to fetch deps from local registry
115
+ `yarn config set npmScopes --json '{ "storybook": { "npmRegistryServer": "http://localhost:6001/" } }'`, // Some required magic to be able to fetch deps from local registry
116
116
  `yarn config set unsafeHttpWhitelist --json '["localhost"]'`, // Disable fallback mode to make sure everything is required correctly
117
117
  `yarn config set pnpFallbackMode none`, // We need to be able to update lockfile when bootstrapping the examples
118
118
  `yarn config set enableImmutableInstalls false`, // Discard all YN0013 - FETCH_NOT_CACHED messages