-
-
Notifications
You must be signed in to change notification settings - Fork 9.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
41 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,43 +1,63 @@ | ||
import fse from 'fs-extra'; | ||
import path from 'path'; | ||
import { sync as spawnSync } from 'cross-spawn'; | ||
import { logger } from '@storybook/node-logger'; | ||
import { exec } from './repro-generators/scripts'; | ||
|
||
interface LinkOptions { | ||
reproUrl: string; | ||
target: string; | ||
local?: boolean; | ||
} | ||
|
||
export const link = async ({ reproUrl }: LinkOptions) => { | ||
const storybookDirectory = process.cwd(); | ||
export const link = async ({ target, local }: LinkOptions) => { | ||
const storybookDir = process.cwd(); | ||
try { | ||
const packageJson = JSON.parse(fse.readFileSync('package.json', 'utf8')); | ||
if (packageJson.name !== '@storybook/root') throw new Error(); | ||
} catch { | ||
throw new Error('Expected to run link from the root of the storybook monorepo'); | ||
} | ||
|
||
const reprosDirectory = path.join(storybookDirectory, '../storybook-repros'); | ||
logger.info(`Ensuring directory ${reprosDirectory}`); | ||
fse.ensureDirSync(reprosDirectory); | ||
let reproDir = target; | ||
let reproName = path.basename(target); | ||
|
||
logger.info(`Cloning ${reproUrl}`); | ||
await exec(`git clone ${reproUrl}`, { cwd: reprosDirectory }); | ||
// Extract a repro name from url given as input (take the last part of the path and remove the extension) | ||
const reproName = path.basename(reproUrl, path.extname(reproUrl)); | ||
const repro = path.join(reprosDirectory, reproName); | ||
if (!local) { | ||
const reprosDir = path.join(storybookDir, '../storybook-repros'); | ||
logger.info(`Ensuring directory ${reprosDir}`); | ||
fse.ensureDirSync(reprosDir); | ||
|
||
logger.info(`Linking ${repro}`); | ||
await exec(`yarn link --all ${storybookDirectory}`, { cwd: repro }); | ||
logger.info(`Cloning ${target}`); | ||
await exec(`git clone ${target}`, { cwd: reprosDir }); | ||
// Extract a repro name from url given as input (take the last part of the path and remove the extension) | ||
reproName = path.basename(target, path.extname(target)); | ||
reproDir = path.join(reprosDir, reproName); | ||
} | ||
|
||
const version = spawnSync('yarn', ['--version'], { | ||
cwd: reproDir, | ||
stdio: 'pipe', | ||
}).stdout.toString(); | ||
|
||
if (!version.startsWith('2.')) { | ||
logger.warn(`🚨 Expected yarn 2 in ${reproDir}!`); | ||
logger.warn(''); | ||
logger.warn('Please set it up with `yarn set version berry`,'); | ||
logger.warn(`then link '${reproDir}' with the '--local' flag.`); | ||
return; | ||
} | ||
|
||
logger.info(`Linking ${reproDir}`); | ||
await exec(`yarn link --all ${storybookDir}`, { cwd: reproDir }); | ||
|
||
logger.info(`Installing ${reproName}`); | ||
await exec(`yarn install`, { cwd: repro }); | ||
await exec(`yarn install`, { cwd: reproDir }); | ||
|
||
// ⚠️ TODO: Fix peer deps in `@storybook/preset-create-react-app` | ||
logger.info( | ||
`Magic stuff related to @storybook/preset-create-react-app, we need to fix peerDependencies` | ||
); | ||
await exec(`yarn add -D webpack-hot-middleware`, { cwd: repro }); | ||
await exec(`yarn add -D webpack-hot-middleware`, { cwd: reproDir }); | ||
|
||
logger.info(`Running ${reproName} storybook`); | ||
await exec(`yarn run storybook`, { cwd: repro }); | ||
await exec(`yarn run storybook`, { cwd: reproDir }); | ||
}; |