Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #17829 from storybookjs/feat/add-vite-builder-auto…
…migration CLI: Add automigration to `@storybook/builder-vite`
- Loading branch information
Showing
4 changed files
with
159 additions
and
1 deletion.
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 |
---|---|---|
@@ -0,0 +1,52 @@ | ||
/* eslint-disable no-underscore-dangle */ | ||
import path from 'path'; | ||
import { JsPackageManager } from '../../js-package-manager'; | ||
import { builderVite } from './builder-vite'; | ||
|
||
// eslint-disable-next-line global-require, jest/no-mocks-import | ||
jest.mock('fs-extra', () => require('../../../../../__mocks__/fs-extra')); | ||
|
||
const checkBuilderVite = async ({ packageJson = {}, main }) => { | ||
// eslint-disable-next-line global-require | ||
require('fs-extra').__setMockFiles({ | ||
[path.join('.storybook', 'main.js')]: `module.exports = ${JSON.stringify(main)};`, | ||
}); | ||
const packageManager = { | ||
retrievePackageJson: () => ({ dependencies: {}, devDependencies: {}, ...packageJson }), | ||
} as JsPackageManager; | ||
return builderVite.check({ packageManager }); | ||
}; | ||
|
||
describe('builder-vite fix', () => { | ||
describe('storybook-builder-vite', () => { | ||
it('using storybook-builder-vite', async () => { | ||
const main = { core: { builder: 'storybook-builder-vite' } }; | ||
await expect(checkBuilderVite({ main })).resolves.toMatchObject({ | ||
builder: 'storybook-builder-vite', | ||
}); | ||
}); | ||
it('using storybook-builder-vite with options', async () => { | ||
const main = { core: { builder: { name: 'storybook-builder-vite', options: {} } } }; | ||
await expect(checkBuilderVite({ main })).resolves.toMatchObject({ | ||
builder: { | ||
name: 'storybook-builder-vite', | ||
options: {}, | ||
}, | ||
}); | ||
}); | ||
}); | ||
describe('other builders', () => { | ||
it('using @storybook/builder-vite', async () => { | ||
const main = { core: { builder: { name: '@storybook/builder-vite', options: {} } } }; | ||
await expect(checkBuilderVite({ main })).resolves.toBeFalsy(); | ||
}); | ||
it('using webpack5', async () => { | ||
const main = { core: { builder: 'webpack5' } }; | ||
await expect(checkBuilderVite({ main })).resolves.toBeFalsy(); | ||
}); | ||
it('no builder specified', async () => { | ||
const main = {}; | ||
await expect(checkBuilderVite({ main })).resolves.toBeFalsy(); | ||
}); | ||
}); | ||
}); |
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 |
---|---|---|
@@ -0,0 +1,94 @@ | ||
import chalk from 'chalk'; | ||
import dedent from 'ts-dedent'; | ||
|
||
import { ConfigFile, readConfig, writeConfig } from '@storybook/csf-tools'; | ||
|
||
import { Fix } from '../types'; | ||
import { getStorybookInfo } from '../helpers/getStorybookInfo'; | ||
import { PackageJson, writePackageJson } from '../../js-package-manager'; | ||
|
||
const logger = console; | ||
|
||
interface BuilderViteOptions { | ||
builder: any; | ||
main: ConfigFile; | ||
packageJson: PackageJson; | ||
} | ||
|
||
/** | ||
* Is the user using 'storybook-builder-vite' in their project? | ||
* | ||
* If so, prompt them to upgrade to '@storybook/builder-vite'. | ||
* | ||
* - Add '@storybook/builder-vite' as dev dependency | ||
* - Remove 'storybook-builder-vite' dependency | ||
* - Add core.builder = '@storybook/builder-vite' to main.js | ||
*/ | ||
export const builderVite: Fix<BuilderViteOptions> = { | ||
id: 'builder-vite', | ||
|
||
async check({ packageManager }) { | ||
const packageJson = packageManager.retrievePackageJson(); | ||
const { mainConfig } = getStorybookInfo(packageJson); | ||
if (!mainConfig) { | ||
logger.warn('Unable to find storybook main.js config'); | ||
return null; | ||
} | ||
const main = await readConfig(mainConfig); | ||
const builder = main.getFieldValue(['core', 'builder']); | ||
const builderName = typeof builder === 'string' ? builder : builder?.name; | ||
|
||
if (builderName !== 'storybook-builder-vite') { | ||
logger.info(`Not using community vite builder, skipping`); | ||
return null; | ||
} | ||
|
||
return { builder, main, packageJson }; | ||
}, | ||
|
||
prompt({ builder }) { | ||
const builderFormatted = chalk.cyan(JSON.stringify(builder, null, 2)); | ||
|
||
return dedent` | ||
We've detected you're using the community vite builder: ${builderFormatted} | ||
'storybook-builder-vite' is deprecated and now located at ${chalk.cyan( | ||
'@storybook/builder-vite' | ||
)}. | ||
We can upgrade your project to use the new builder automatically. | ||
More info: ${chalk.yellow( | ||
'https://github.com/storybookjs/storybook/blob/next/MIGRATION.md#vite-builder-renamed' | ||
)} | ||
`; | ||
}, | ||
|
||
async run({ result: { builder, main, packageJson }, packageManager, dryRun }) { | ||
const { dependencies = {}, devDependencies = {} } = packageJson; | ||
|
||
logger.info(`Removing existing 'storybook-builder-vite' dependency`); | ||
if (!dryRun) { | ||
delete dependencies['storybook-builder-vite']; | ||
delete devDependencies['storybook-builder-vite']; | ||
writePackageJson(packageJson); | ||
} | ||
|
||
logger.info(`Adding '@storybook/builder-vite' as dev dependency`); | ||
if (!dryRun) { | ||
packageManager.addDependencies({ installAsDevDependencies: true }, [ | ||
'@storybook/builder-vite', | ||
]); | ||
} | ||
|
||
logger.info(`Updating main.js to use vite builder`); | ||
if (!dryRun) { | ||
const updatedBuilder = | ||
typeof builder === 'string' | ||
? '@storybook/builder-vite' | ||
: { name: '@storybook/builder-vite', options: builder.options }; | ||
main.setFieldValue(['core', 'builder'], updatedBuilder); | ||
await writeConfig(main); | ||
} | ||
}, | ||
}; |
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