diff --git a/addons/docs/src/frameworks/common/preset.ts b/addons/docs/src/frameworks/common/preset.ts index f580ea0e747b..c3997e09446c 100644 --- a/addons/docs/src/frameworks/common/preset.ts +++ b/addons/docs/src/frameworks/common/preset.ts @@ -24,7 +24,7 @@ type BabelParams = { function createBabelOptions({ babelOptions, mdxBabelOptions, configureJSX }: BabelParams) { const babelPlugins = mdxBabelOptions?.plugins || babelOptions?.plugins || []; const jsxPlugin = [ - '@babel/plugin-transform-react-jsx', + require.resolve('@babel/plugin-transform-react-jsx'), { pragma: 'React.createElement', pragmaFrag: 'React.Fragment' }, ]; const plugins = configureJSX ? [...babelPlugins, jsxPlugin] : babelPlugins; diff --git a/cypress/generated/addon-viewport.spec.ts b/cypress/generated/addon-viewport.spec.ts new file mode 100644 index 000000000000..0177cbbb7d08 --- /dev/null +++ b/cypress/generated/addon-viewport.spec.ts @@ -0,0 +1,16 @@ +describe('addon-viewport', () => { + before(() => { + cy.visitStorybook(); + }); + + it('should have viewport button in the toolbar', () => { + cy.navigateToStory('button', 'Text'); + + // Click on viewport button and select small mobile + cy.get('[title="Change the size of the preview"]').click(); + cy.get('#mobile1').click(); + + // Check that Welcome story is still displayed + cy.getStoryElement().should('contain.text', 'Button'); + }); +}); diff --git a/lib/cli/package.json b/lib/cli/package.json index 034f6522669f..49029114ae33 100644 --- a/lib/cli/package.json +++ b/lib/cli/package.json @@ -32,10 +32,10 @@ "versions.json" ], "scripts": { - "prepare": "node ../../scripts/prepare.js && node -r esm ./scripts/generate-app-versions.js", + "prepare": "node ../../scripts/prepare.js && node -r esm ./scripts/generate-sb-packages-versions.js", "test": "cd test && ./run_tests.sh", "test-yarn-2": "cd test && ./run_tests_yarn_2.sh", - "postversion": "node -r esm ./scripts/generate-app-versions.js" + "postversion": "node -r esm ./scripts/generate-sb-packages-versions.js" }, "dependencies": { "@babel/core": "^7.9.6", @@ -63,32 +63,6 @@ "update-notifier": "^4.0.0" }, "devDependencies": { - "@storybook/addon-actions": "6.0.0-rc.3", - "@storybook/addon-docs": "6.0.0-rc.3", - "@storybook/addon-essentials": "6.0.0-rc.3", - "@storybook/addon-graphql": "6.0.0-rc.3", - "@storybook/addon-knobs": "6.0.0-rc.3", - "@storybook/addon-links": "6.0.0-rc.3", - "@storybook/addon-storyshots": "6.0.0-rc.3", - "@storybook/addons": "6.0.0-rc.3", - "@storybook/angular": "6.0.0-rc.3", - "@storybook/channel-postmessage": "6.0.0-rc.3", - "@storybook/channel-websocket": "6.0.0-rc.3", - "@storybook/channels": "6.0.0-rc.3", - "@storybook/ember": "6.0.0-rc.3", - "@storybook/html": "6.0.0-rc.3", - "@storybook/marionette": "6.0.0-rc.3", - "@storybook/marko": "6.0.0-rc.3", - "@storybook/mithril": "6.0.0-rc.3", - "@storybook/preact": "6.0.0-rc.3", - "@storybook/rax": "6.0.0-rc.3", - "@storybook/react": "6.0.0-rc.3", - "@storybook/react-native": "6.0.0-alpha.0", - "@storybook/riot": "6.0.0-rc.3", - "@storybook/svelte": "6.0.0-rc.3", - "@storybook/ui": "6.0.0-rc.3", - "@storybook/vue": "6.0.0-rc.3", - "@storybook/web-components": "6.0.0-rc.3", "@types/cross-spawn": "^6.0.1", "@types/inquirer": "^6.5.0", "@types/puppeteer-core": "^2.0.0", diff --git a/lib/cli/scripts/generate-app-versions.js b/lib/cli/scripts/generate-app-versions.js deleted file mode 100644 index 3717442cb300..000000000000 --- a/lib/cli/scripts/generate-app-versions.js +++ /dev/null @@ -1,37 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; -import { parse } from 'json5'; - -const logger = console; - -const appsFolder = path.join(__dirname, '..', '..', '..', 'app'); - -const run = async () => { - const apps = await fs.readdir(appsFolder); - const versions = await Promise.all( - apps.map(async (appName) => { - const { name, version } = parse( - await fs.readFile(path.join(appsFolder, appName, 'package.json')) - ); - - return { - name, - version, - }; - }) - ); - - await fs.writeFile( - path.join(__dirname, '..', 'versions.json'), - JSON.stringify( - versions.reduce((acc, { name, version }) => ({ ...acc, [name]: version }), {}), - null, - 2 - ) - ); -}; - -run().catch((e) => { - logger.error(e); - process.exit(1); -}); diff --git a/lib/cli/scripts/generate-sb-packages-versions.js b/lib/cli/scripts/generate-sb-packages-versions.js new file mode 100644 index 000000000000..a9a5e964e2d9 --- /dev/null +++ b/lib/cli/scripts/generate-sb-packages-versions.js @@ -0,0 +1,41 @@ +import { writeJson, readJson } from 'fs-extra'; +import path from 'path'; +import globby from 'globby'; + +const rootDirectory = path.join(__dirname, '..', '..', '..'); + +const logger = console; + +const run = async () => { + const storybookPackagesPaths = await globby( + `${rootDirectory}/@(app|addons|lib)/**/package.json`, + { + ignore: '**/node_modules/**/*', + } + ); + + const packageToVersionMap = ( + await Promise.all( + storybookPackagesPaths.map(async (storybookPackagePath) => { + const { name, version } = await readJson(storybookPackagePath); + + return { + name, + version, + }; + }) + ) + ) + // Remove non-`@storybook/XXX` package (like: `cli-sb`, `cli-storybook`) + .filter(({ name }) => /@storybook/.test(name)) + // As some previous steps are asynchronous order is not always the same so sort them to avoid that + .sort((package1, package2) => package1.name.localeCompare(package2.name)) + .reduce((acc, { name, version }) => ({ ...acc, [name]: version }), {}); + + await writeJson(path.join(__dirname, '..', 'versions.json'), packageToVersionMap, { spaces: 2 }); +}; + +run().catch((e) => { + logger.error(e); + process.exit(1); +}); diff --git a/lib/cli/src/generate.ts b/lib/cli/src/generate.ts index 33d19a55976a..2cf71a2dc5bf 100644 --- a/lib/cli/src/generate.ts +++ b/lib/cli/src/generate.ts @@ -17,7 +17,7 @@ const logger = console; program .command('init') .description('Initialize Storybook into your project.') - .option('-f --force', 'Force add storybook') + .option('-f --force', 'Force add Storybook') .option('-s --skip-install', 'Skip installing deps') .option('-N --use-npm', 'Use npm to install deps') .option('-p --parser ', 'jscodeshift parser') @@ -35,7 +35,7 @@ program program .command('upgrade') - .description('Upgrade your storybook packages to the latest') + .description('Upgrade your Storybook packages to the latest') .option('-N --use-npm', 'Use NPM to build the Storybook server') .option('-n --dry-run', 'Only check for upgrades, do not install') .option('-p --prerelease', 'Upgrade to the pre-release packages') @@ -60,7 +60,7 @@ program program .command('migrate [migration]') - .description('Run a storybook codemod migration on your source files') + .description('Run a Storybook codemod migration on your source files') .option('-l --list', 'List available migrations') .option('-g --glob ', 'Glob for files upon which to apply the migration', '**/*.js') .option('-p --parser ', 'jscodeshift parser') diff --git a/lib/cli/src/generators/baseGenerator.ts b/lib/cli/src/generators/baseGenerator.ts index 9c6295d44999..8c18d943e87c 100644 --- a/lib/cli/src/generators/baseGenerator.ts +++ b/lib/cli/src/generators/baseGenerator.ts @@ -49,11 +49,15 @@ export async function baseGenerator( '@storybook/addon-essentials', ]; + const yarn2Dependencies = + packageManager.type === 'yarn2' ? ['@storybook/addon-docs', '@mdx-js/react'] : []; + const packages = [ `@storybook/${framework}`, ...addons, ...extraPackages, ...extraAddons, + ...yarn2Dependencies, // ⚠️ Some addons have peer deps that must be added too, like '@storybook/addon-docs' => 'react-is' 'react-is', ].filter(Boolean); diff --git a/lib/cli/src/initiate.ts b/lib/cli/src/initiate.ts index 743ab7a31fd3..c1e540c344d8 100644 --- a/lib/cli/src/initiate.ts +++ b/lib/cli/src/initiate.ts @@ -70,7 +70,7 @@ const installStorybook = (projectType: ProjectType, options: CommandOptions): Pr packageManager.installDependencies(); } - logger.log('\nTo run your storybook, type:\n'); + logger.log('\nTo run your Storybook, type:\n'); codeLog([packageManager.getRunStorybookCommand()]); logger.log('\nFor more information visit:', chalk.cyan('https://storybook.js.org')); @@ -85,7 +85,7 @@ const installStorybook = (projectType: ProjectType, options: CommandOptions): Pr switch (projectType) { case ProjectType.ALREADY_HAS_STORYBOOK: logger.log(); - paddedLog('There seems to be a storybook already available in this project.'); + paddedLog('There seems to be a Storybook already available in this project.'); paddedLog('Apply following command to force:\n'); codeLog(['sb init [options] -f']); @@ -96,17 +96,17 @@ const installStorybook = (projectType: ProjectType, options: CommandOptions): Pr case ProjectType.UPDATE_PACKAGE_ORGANIZATIONS: return updateOrganisationsGenerator(packageManager, options.parser, npmOptions) .then(() => null) // commmandLog doesn't like to see output - .then(commandLog('Upgrading your project to the new storybook packages.')) + .then(commandLog('Upgrading your project to the new Storybook packages.')) .then(end); case ProjectType.REACT_SCRIPTS: return reactScriptsGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Create React App" based project')) + .then(commandLog('Adding Storybook support to your "Create React App" based project')) .then(end); case ProjectType.REACT: return reactGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "React" app')) + .then(commandLog('Adding Storybook support to your "React" app')) .then(end); case ProjectType.REACT_NATIVE: { @@ -117,7 +117,7 @@ const installStorybook = (projectType: ProjectType, options: CommandOptions): Pr type: 'confirm', name: 'server', message: - 'Do you want to install dependencies necessary to run storybook server? You can manually do it later by install @storybook/react-native-server', + 'Do you want to install dependencies necessary to run Storybook server? You can manually do it later by install @storybook/react-native-server', default: false, }, ]) as Promise<{ server: boolean }>) @@ -125,11 +125,11 @@ const installStorybook = (projectType: ProjectType, options: CommandOptions): Pr .then(({ server }) => reactNativeGenerator(packageManager, npmOptions, server, generatorOptions) ) - .then(commandLog('Adding storybook support to your "React Native" app')) + .then(commandLog('Adding Storybook support to your "React Native" app')) .then(end) .then(() => { logger.log(chalk.red('NOTE: installation is not 100% automated.')); - logger.log(`To quickly run storybook, replace contents of your app entry with:\n`); + logger.log(`To quickly run Storybook, replace contents of your app entry with:\n`); codeLog(["export default from './storybook';"]); logger.log('\n For more in depth setup instructions, see:\n'); logger.log(chalk.cyan(REACT_NATIVE_DISCUSSION)); @@ -139,82 +139,82 @@ const installStorybook = (projectType: ProjectType, options: CommandOptions): Pr case ProjectType.METEOR: return meteorGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Meteor" app')) + .then(commandLog('Adding Storybook support to your "Meteor" app')) .then(end); case ProjectType.WEBPACK_REACT: return webpackReactGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Webpack React" app')) + .then(commandLog('Adding Storybook support to your "Webpack React" app')) .then(end); case ProjectType.REACT_PROJECT: return reactGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "React" library')) + .then(commandLog('Adding Storybook support to your "React" library')) .then(end); case ProjectType.SFC_VUE: return sfcVueGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Single File Components Vue" app')) + .then(commandLog('Adding Storybook support to your "Single File Components Vue" app')) .then(end); case ProjectType.VUE: return vueGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Vue" app')) + .then(commandLog('Adding Storybook support to your "Vue" app')) .then(end); case ProjectType.ANGULAR: return angularGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Angular" app')) + .then(commandLog('Adding Storybook support to your "Angular" app')) .then(end); case ProjectType.EMBER: return emberGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Ember" app')) + .then(commandLog('Adding Storybook support to your "Ember" app')) .then(end); case ProjectType.MITHRIL: return mithrilGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Mithril" app')) + .then(commandLog('Adding Storybook support to your "Mithril" app')) .then(end); case ProjectType.MARIONETTE: return marionetteGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Marionette.js" app')) + .then(commandLog('Adding Storybook support to your "Marionette.js" app')) .then(end); case ProjectType.MARKO: return markoGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Marko" app')) + .then(commandLog('Adding Storybook support to your "Marko" app')) .then(end); case ProjectType.HTML: return htmlGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "HTML" app')) + .then(commandLog('Adding Storybook support to your "HTML" app')) .then(end); case ProjectType.WEB_COMPONENTS: return webComponentsGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "web components" app')) + .then(commandLog('Adding Storybook support to your "web components" app')) .then(end); case ProjectType.RIOT: return riotGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "riot.js" app')) + .then(commandLog('Adding Storybook support to your "riot.js" app')) .then(end); case ProjectType.PREACT: return preactGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Preact" app')) + .then(commandLog('Adding Storybook support to your "Preact" app')) .then(end); case ProjectType.SVELTE: return svelteGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Svelte" app')) + .then(commandLog('Adding Storybook support to your "Svelte" app')) .then(end); case ProjectType.RAX: return raxGenerator(packageManager, npmOptions, generatorOptions) - .then(commandLog('Adding storybook support to your "Rax" app')) + .then(commandLog('Adding Storybook support to your "Rax" app')) .then(end); default: @@ -263,7 +263,7 @@ const projectTypeInquirer = async (options: { yes?: boolean }) => { }; export default function (options: CommandOptions, pkg: IPackage): Promise { - const welcomeMessage = 'sb init - the simplest way to add a storybook to your project.'; + const welcomeMessage = 'sb init - the simplest way to add a Storybook to your project.'; logger.log(chalk.inverse(`\n ${welcomeMessage} \n`)); // Update notify code. diff --git a/lib/cli/src/js-package-manager/JsPackageManager.ts b/lib/cli/src/js-package-manager/JsPackageManager.ts index 25043912d88e..a2659b069a73 100644 --- a/lib/cli/src/js-package-manager/JsPackageManager.ts +++ b/lib/cli/src/js-package-manager/JsPackageManager.ts @@ -7,10 +7,10 @@ import { readPackageJson, writePackageJson } from './PackageJsonHelper'; const logger = console; // Cannot be `import` as it's not under TS root dir -const { storybookCLIVersion, devDependencies } = require('../../package.json'); +const storybookPackagesVersions = require('../../versions.json'); export abstract class JsPackageManager { - public abstract type: 'npm' | 'yarn' | 'yarn2'; + public abstract readonly type: 'npm' | 'yarn1' | 'yarn2'; public abstract initPackageJson(): void; @@ -138,10 +138,9 @@ export abstract class JsPackageManager { public async getVersion(packageName: string, constraint?: string): Promise { let current; - if (packageName === '@storybook/cli') { - current = storybookCLIVersion; - } else if (/storybook/.test(packageName)) { - current = devDependencies[packageName]; + + if (/@storybook/.test(packageName)) { + current = storybookPackagesVersions[packageName]; } let latest; diff --git a/lib/cli/src/js-package-manager/NPMProxy.test.ts b/lib/cli/src/js-package-manager/NPMProxy.test.ts index e152732bab9e..27e6eca31b4d 100644 --- a/lib/cli/src/js-package-manager/NPMProxy.test.ts +++ b/lib/cli/src/js-package-manager/NPMProxy.test.ts @@ -7,6 +7,10 @@ describe('NPM Proxy', () => { npmProxy = new NPMProxy(); }); + it('type should be npm', () => { + expect(npmProxy.type).toEqual('npm'); + }); + describe('initPackageJson', () => { it('should run `npm init -y`', () => { const executeCommandSpy = jest.spyOn(npmProxy, 'executeCommand').mockReturnValue(''); @@ -78,4 +82,39 @@ describe('NPM Proxy', () => { await expect(npmProxy.latestVersion('@storybook/addons')).rejects.toThrow(); }); }); + + describe('getVersion', () => { + it('with a Storybook package listed in versions.json it returns the version', async () => { + // eslint-disable-next-line global-require + const storybookAngularVersion = require('../../versions.json')['@storybook/angular']; + const executeCommandSpy = jest.spyOn(npmProxy, 'executeCommand').mockReturnValue('"5.3.19"'); + + const version = await npmProxy.getVersion('@storybook/angular'); + + expect(executeCommandSpy).toHaveBeenCalledWith('npm', [ + 'info', + '@storybook/angular', + 'version', + '--json', + ]); + expect(version).toEqual(`^${storybookAngularVersion}`); + }); + + it('with a Storybook package not listed in versions.json it returns the latest version', async () => { + const packageVersion = '5.3.19'; + const executeCommandSpy = jest + .spyOn(npmProxy, 'executeCommand') + .mockReturnValue(`"${packageVersion}"`); + + const version = await npmProxy.getVersion('@storybook/react-native'); + + expect(executeCommandSpy).toHaveBeenCalledWith('npm', [ + 'info', + '@storybook/react-native', + 'version', + '--json', + ]); + expect(version).toEqual(`^${packageVersion}`); + }); + }); }); diff --git a/lib/cli/src/js-package-manager/NPMProxy.ts b/lib/cli/src/js-package-manager/NPMProxy.ts index ae74509acf03..f751a7a7bb5f 100644 --- a/lib/cli/src/js-package-manager/NPMProxy.ts +++ b/lib/cli/src/js-package-manager/NPMProxy.ts @@ -1,7 +1,7 @@ import { JsPackageManager } from './JsPackageManager'; export class NPMProxy extends JsPackageManager { - type: 'npm'; + readonly type = 'npm'; initPackageJson() { return this.executeCommand('npm', ['init', '-y']); diff --git a/lib/cli/src/js-package-manager/Yarn1Proxy.test.ts b/lib/cli/src/js-package-manager/Yarn1Proxy.test.ts index 0db351c79bff..c33cbfcac1bc 100644 --- a/lib/cli/src/js-package-manager/Yarn1Proxy.test.ts +++ b/lib/cli/src/js-package-manager/Yarn1Proxy.test.ts @@ -7,6 +7,10 @@ describe('Yarn 1 Proxy', () => { yarn1Proxy = new Yarn1Proxy(); }); + it('type should be yarn1', () => { + expect(yarn1Proxy.type).toEqual('yarn1'); + }); + describe('initPackageJson', () => { it('should run `yarn init -y`', () => { const executeCommandSpy = jest.spyOn(yarn1Proxy, 'executeCommand').mockReturnValue(''); diff --git a/lib/cli/src/js-package-manager/Yarn1Proxy.ts b/lib/cli/src/js-package-manager/Yarn1Proxy.ts index ed40c199e11b..345a96a25991 100644 --- a/lib/cli/src/js-package-manager/Yarn1Proxy.ts +++ b/lib/cli/src/js-package-manager/Yarn1Proxy.ts @@ -1,7 +1,7 @@ import { JsPackageManager } from './JsPackageManager'; export class Yarn1Proxy extends JsPackageManager { - type: 'yarn'; + readonly type = 'yarn1'; initPackageJson() { return this.executeCommand('yarn', ['init', '-y']); diff --git a/lib/cli/src/js-package-manager/Yarn2Proxy.test.ts b/lib/cli/src/js-package-manager/Yarn2Proxy.test.ts index 3c3fc17ba799..4ecba3fbf72b 100644 --- a/lib/cli/src/js-package-manager/Yarn2Proxy.test.ts +++ b/lib/cli/src/js-package-manager/Yarn2Proxy.test.ts @@ -7,6 +7,10 @@ describe('Yarn 1 Proxy', () => { yarn2Proxy = new Yarn2Proxy(); }); + it('type should be yarn2', () => { + expect(yarn2Proxy.type).toEqual('yarn2'); + }); + describe('initPackageJson', () => { it('should run `yarn init`', () => { const executeCommandSpy = jest.spyOn(yarn2Proxy, 'executeCommand').mockReturnValue(''); diff --git a/lib/cli/src/js-package-manager/Yarn2Proxy.ts b/lib/cli/src/js-package-manager/Yarn2Proxy.ts index 5d8d8fe2b7b2..adae2865dbce 100644 --- a/lib/cli/src/js-package-manager/Yarn2Proxy.ts +++ b/lib/cli/src/js-package-manager/Yarn2Proxy.ts @@ -1,7 +1,7 @@ import { JsPackageManager } from './JsPackageManager'; export class Yarn2Proxy extends JsPackageManager { - type: 'yarn2'; + readonly type = 'yarn2'; initPackageJson() { return this.executeCommand('yarn', ['init']); diff --git a/lib/cli/versions.json b/lib/cli/versions.json index 77157dd976b2..553c24698f66 100644 --- a/lib/cli/versions.json +++ b/lib/cli/versions.json @@ -1,17 +1,55 @@ { + "@storybook/addon-a11y": "6.0.0-rc.3", + "@storybook/addon-actions": "6.0.0-rc.3", + "@storybook/addon-backgrounds": "6.0.0-rc.3", + "@storybook/addon-controls": "6.0.0-rc.3", + "@storybook/addon-cssresources": "6.0.0-rc.3", + "@storybook/addon-design-assets": "6.0.0-rc.3", + "@storybook/addon-docs": "6.0.0-rc.3", + "@storybook/addon-essentials": "6.0.0-rc.3", + "@storybook/addon-events": "6.0.0-rc.3", + "@storybook/addon-google-analytics": "6.0.0-rc.3", + "@storybook/addon-graphql": "6.0.0-rc.3", + "@storybook/addon-jest": "6.0.0-rc.3", + "@storybook/addon-knobs": "6.0.0-rc.3", + "@storybook/addon-links": "6.0.0-rc.3", + "@storybook/addon-queryparams": "6.0.0-rc.3", + "@storybook/addon-storyshots": "6.0.0-rc.3", + "@storybook/addon-storyshots-puppeteer": "6.0.0-rc.3", + "@storybook/addon-storysource": "6.0.0-rc.3", + "@storybook/addon-toolbars": "6.0.0-rc.3", + "@storybook/addon-viewport": "6.0.0-rc.3", + "@storybook/addons": "6.0.0-rc.3", "@storybook/angular": "6.0.0-rc.3", + "@storybook/api": "6.0.0-rc.3", "@storybook/aurelia": "6.0.0-rc.3", + "@storybook/channel-postmessage": "6.0.0-rc.3", + "@storybook/channel-websocket": "6.0.0-rc.3", + "@storybook/channels": "6.0.0-rc.3", + "@storybook/cli": "6.0.0-rc.3", + "@storybook/client-api": "6.0.0-rc.3", + "@storybook/client-logger": "6.0.0-rc.3", + "@storybook/codemod": "6.0.0-rc.3", + "@storybook/components": "6.0.0-rc.3", + "@storybook/core": "6.0.0-rc.3", + "@storybook/core-events": "6.0.0-rc.3", "@storybook/ember": "6.0.0-rc.3", "@storybook/html": "6.0.0-rc.3", "@storybook/marionette": "6.0.0-rc.3", "@storybook/marko": "6.0.0-rc.3", "@storybook/mithril": "6.0.0-rc.3", + "@storybook/node-logger": "6.0.0-rc.3", + "@storybook/postinstall": "6.0.0-rc.3", "@storybook/preact": "6.0.0-rc.3", "@storybook/rax": "6.0.0-rc.3", "@storybook/react": "6.0.0-rc.3", "@storybook/riot": "6.0.0-rc.3", + "@storybook/router": "6.0.0-rc.3", "@storybook/server": "6.0.0-rc.3", + "@storybook/source-loader": "6.0.0-rc.3", "@storybook/svelte": "6.0.0-rc.3", + "@storybook/theming": "6.0.0-rc.3", + "@storybook/ui": "6.0.0-rc.3", "@storybook/vue": "6.0.0-rc.3", "@storybook/web-components": "6.0.0-rc.3" -} \ No newline at end of file +} diff --git a/yarn.lock b/yarn.lock index 20639c1a4d20..26672fc274e9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2003,20 +2003,6 @@ resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== -"@emotion/native@^10.0.14": - version "10.0.27" - resolved "https://registry.yarnpkg.com/@emotion/native/-/native-10.0.27.tgz#67c2c0ceeeed873c849c611d9a6497a006d43a8f" - integrity sha512-3qxR2XFizGfABKKbX9kAYc0PHhKuCEuyxshoq3TaMEbi9asWHdQVChg32ULpblm4XAf9oxaitAU7J9SfdwFxtw== - dependencies: - "@emotion/primitives-core" "10.0.27" - -"@emotion/primitives-core@10.0.27": - version "10.0.27" - resolved "https://registry.yarnpkg.com/@emotion/primitives-core/-/primitives-core-10.0.27.tgz#7a5fae07fe06a046ced597f5c0048f22d5c45842" - integrity sha512-fRBEDNPSFFOrBJ0OcheuElayrNTNdLF9DzMxtL0sFgsCFvvadlzwJHhJMSwEJuxwARm9GhVLr1p8G8JGkK98lQ== - dependencies: - css-to-react-native "^2.2.1" - "@emotion/serialize@^0.11.15", "@emotion/serialize@^0.11.16": version "0.11.16" resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.16.tgz#dee05f9e96ad2fb25a5206b6d759b2d1ed3379ad" @@ -3785,7 +3771,7 @@ "@parcel/utils" "^1.11.0" physical-cpu-count "^2.0.0" -"@reach/router@^1.2.1", "@reach/router@^1.3.3": +"@reach/router@^1.3.3": version "1.3.3" resolved "https://registry.yarnpkg.com/@reach/router/-/router-1.3.3.tgz#58162860dce6c9449d49be86b0561b5ef46d80db" integrity sha512-gOIAiFhWdiVGSVjukKeNKkCRBLmnORoTPyBihI/jLunICPgxdP30DroAvPQuf1eVfQbfGJQDJkwhJXsNPMnVWw== @@ -3875,110 +3861,6 @@ resolved "https://registry.yarnpkg.com/@soda/get-current-script/-/get-current-script-1.0.0.tgz#623aa40623550e3b94767cffeb096a6fb597ed09" integrity sha512-9GvTek+7cVw7r+L7TNGOG1astZJWXz2h5q4BqMXl28KN+24iSCm1xo+RhZOZvwdT3bzNe9hD7riJc/lBoO7mgg== -"@storybook/addons@6.0.0-alpha.0": - version "6.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@storybook/addons/-/addons-6.0.0-alpha.0.tgz#f4416a8c9c081961e5950a7962d7a5102138717e" - integrity sha512-CrPvlo7pW44t7f/YWoEXMRgafvBKAcDYw9/sbBlltu88nKMHU28qjLf95HiTXtiE6P9AqdkRdVkQtyVWhnqKQA== - dependencies: - "@storybook/api" "6.0.0-alpha.0" - "@storybook/channels" "6.0.0-alpha.0" - "@storybook/client-logger" "6.0.0-alpha.0" - "@storybook/core-events" "6.0.0-alpha.0" - core-js "^3.0.1" - global "^4.3.2" - util-deprecate "^1.0.2" - -"@storybook/api@6.0.0-alpha.0": - version "6.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@storybook/api/-/api-6.0.0-alpha.0.tgz#9b612f8c41fb8b1f9bbd3c990b5a1b3beb0eb82a" - integrity sha512-aKYxx39jfakMfYB0FJkFqlqig8Ph/y3K4QaUgmYbL9CSuouvvfBDGh1onhp2mwZpqohrAKl9UAeNZp9HDM0dug== - dependencies: - "@reach/router" "^1.2.1" - "@storybook/channels" "6.0.0-alpha.0" - "@storybook/client-logger" "6.0.0-alpha.0" - "@storybook/core-events" "6.0.0-alpha.0" - "@storybook/csf" "0.0.1" - "@storybook/router" "6.0.0-alpha.0" - "@storybook/theming" "6.0.0-alpha.0" - "@types/reach__router" "^1.2.3" - core-js "^3.0.1" - fast-deep-equal "^2.0.1" - global "^4.3.2" - lodash "^4.17.15" - memoizerific "^1.11.3" - prop-types "^15.6.2" - react "^16.8.3" - semver "^6.0.0" - shallow-equal "^1.1.0" - store2 "^2.7.1" - telejson "^3.2.0" - util-deprecate "^1.0.2" - -"@storybook/channel-postmessage@6.0.0-alpha.0": - version "6.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@storybook/channel-postmessage/-/channel-postmessage-6.0.0-alpha.0.tgz#dec7245e9be7b1303c8bd60e664134a56639ae54" - integrity sha512-OX3Ho/MbQ1+wVPh/9gAATf4LxoFN6k62GtmB5qcpkpJkSUhs5AQQPVG70kHpb7eCaRmV6a90b67tiLDRWNyzow== - dependencies: - "@storybook/channels" "6.0.0-alpha.0" - "@storybook/client-logger" "6.0.0-alpha.0" - core-js "^3.0.1" - global "^4.3.2" - telejson "^3.2.0" - -"@storybook/channel-websocket@6.0.0-alpha.0": - version "6.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@storybook/channel-websocket/-/channel-websocket-6.0.0-alpha.0.tgz#81d10287250b76b0ab5856cb96c4827714f31875" - integrity sha512-bbTeYoRTXPjh/eybeOtBrnFGKE2YUmu7S2sCLzvyDbbQCLYuE/qlhFBX23d/xJSzZZz4pCkj687E15MOIXQ3eA== - dependencies: - "@storybook/channels" "6.0.0-alpha.0" - core-js "^3.0.1" - global "^4.3.2" - json-fn "^1.1.1" - -"@storybook/channels@6.0.0-alpha.0": - version "6.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@storybook/channels/-/channels-6.0.0-alpha.0.tgz#c86e3bdff2e98444a0e9938a1a4abec503221af4" - integrity sha512-0Va1Cajk2X9tQVJKizdDFLKgBJmYakd3ykV1rIYdlPHi+5DndQQ3EqxKrLGE6nQLcKVoxM84Sq8nCLyC891+mw== - dependencies: - core-js "^3.0.1" - -"@storybook/client-api@6.0.0-alpha.0": - version "6.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@storybook/client-api/-/client-api-6.0.0-alpha.0.tgz#9a6766a9878ee1f41b35debd93d480fef50506c2" - integrity sha512-G24H5mFxxptS0G2UwNNxPlV8RM+h6vUxQTmXUtqQoangJPQ/IUm+Ts9QgqDiyHEks9pwYEpSGMAdycZf0IUhJA== - dependencies: - "@storybook/addons" "6.0.0-alpha.0" - "@storybook/channel-postmessage" "6.0.0-alpha.0" - "@storybook/channels" "6.0.0-alpha.0" - "@storybook/client-logger" "6.0.0-alpha.0" - "@storybook/core-events" "6.0.0-alpha.0" - "@storybook/csf" "0.0.1" - "@types/webpack-env" "^1.15.0" - core-js "^3.0.1" - eventemitter3 "^4.0.0" - global "^4.3.2" - is-plain-object "^3.0.0" - lodash "^4.17.15" - memoizerific "^1.11.3" - qs "^6.6.0" - stable "^0.1.8" - ts-dedent "^1.1.0" - util-deprecate "^1.0.2" - -"@storybook/client-logger@6.0.0-alpha.0": - version "6.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@storybook/client-logger/-/client-logger-6.0.0-alpha.0.tgz#c8dd075d5a4a78158f6acb8ace14cf0492f2af16" - integrity sha512-qiML4TiQCFosvxlVGqDbqSy2MA7DuBPclbocliaXEnYAlHzHy5LaQ7OK2SZzigMuim7LOr/eNmqaLAIDVfAjTg== - dependencies: - core-js "^3.0.1" - -"@storybook/core-events@6.0.0-alpha.0": - version "6.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@storybook/core-events/-/core-events-6.0.0-alpha.0.tgz#a35d2f96f6d38aba080d7f5f1ec67799325728de" - integrity sha512-BvJvokog7ezWg0rMIYYUA1d1Bi14hy8iZeQyD0s/Q17EMjqZb1ATQ1cPr9lVJ0CpyYOYRJp8IPbvGDnMFkm8YA== - dependencies: - core-js "^3.0.1" - "@storybook/csf@0.0.1": version "0.0.1" resolved "https://registry.yarnpkg.com/@storybook/csf/-/csf-0.0.1.tgz#95901507dc02f0bc6f9ac8ee1983e2fc5bb98ce6" @@ -4055,37 +3937,6 @@ resolved "https://registry.yarnpkg.com/@storybook/preset-scss/-/preset-scss-1.0.2.tgz#6c993b972c6f599237082b55e12c875f0f66ab06" integrity sha512-Kq+Y3H7qRBxocLW57V9HtQhrw9ZzmTodFCjf+OelMh1k6SZ7/FvJHb7mtWofafHcqq1tSQlNIgYMtHRDJ64WVg== -"@storybook/react-native@6.0.0-alpha.0": - version "6.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@storybook/react-native/-/react-native-6.0.0-alpha.0.tgz#e05090a351d41da756fb0cf9a637a05be15babb4" - integrity sha512-36lg/YqDTB2AZquRj4xVORVzNPE+A9E0WysJUn6If2yP3LCQ9y0mMucArKxJinYnW6A6UZptw18gZqOmkYatFg== - dependencies: - "@emotion/core" "^10.0.20" - "@emotion/native" "^10.0.14" - "@storybook/addons" "6.0.0-alpha.0" - "@storybook/channel-websocket" "6.0.0-alpha.0" - "@storybook/channels" "6.0.0-alpha.0" - "@storybook/client-api" "6.0.0-alpha.0" - "@storybook/core-events" "6.0.0-alpha.0" - core-js "^3.0.1" - emotion-theming "^10.0.19" - react-native-swipe-gestures "^1.0.4" - -"@storybook/router@6.0.0-alpha.0": - version "6.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@storybook/router/-/router-6.0.0-alpha.0.tgz#c2b9da6c7eba0dccf32228a72e23ecf8875aacac" - integrity sha512-jpFaJu8SFiHqTqG5bSab7qOMRcAZb5htFjD6zSTb/1a3km9yLJQqYA0Jk0rFBrc89lwd/ngYVBOuOrn/XJRwoA== - dependencies: - "@reach/router" "^1.2.1" - "@storybook/csf" "0.0.1" - "@types/reach__router" "^1.2.3" - core-js "^3.0.1" - global "^4.3.2" - lodash "^4.17.15" - memoizerific "^1.11.3" - qs "^6.6.0" - util-deprecate "^1.0.2" - "@storybook/semver@^7.3.2": version "7.3.2" resolved "https://registry.yarnpkg.com/@storybook/semver/-/semver-7.3.2.tgz#f3b9c44a1c9a0b933c04e66d0048fcf2fa10dac0" @@ -4094,25 +3945,6 @@ core-js "^3.6.5" find-up "^4.1.0" -"@storybook/theming@6.0.0-alpha.0": - version "6.0.0-alpha.0" - resolved "https://registry.yarnpkg.com/@storybook/theming/-/theming-6.0.0-alpha.0.tgz#0a9580cecb1c9609e070c8db7737bd121faf56c3" - integrity sha512-XFFpbX2ls1AvbesF64y1q53kMMZYTd/U5EluFmqDsAvoqXVXXKbh8wcguxnMlEHYvgXoDKmzCww+IpmVbAyYcA== - dependencies: - "@emotion/core" "^10.0.20" - "@emotion/is-prop-valid" "^0.8.6" - "@emotion/styled" "^10.0.17" - "@storybook/client-logger" "6.0.0-alpha.0" - core-js "^3.0.1" - deep-object-diff "^1.1.0" - emotion-theming "^10.0.19" - global "^4.3.2" - memoizerific "^1.11.3" - polished "^3.3.1" - prop-types "^15.7.2" - resolve-from "^5.0.0" - ts-dedent "^1.1.0" - "@stroncium/procfs@^1.0.0": version "1.2.1" resolved "https://registry.yarnpkg.com/@stroncium/procfs/-/procfs-1.2.1.tgz#6b9be6fd20fb0a4c20e99a8695e083c699bb2b45" @@ -4833,7 +4665,7 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== -"@types/reach__router@^1.2.3", "@types/reach__router@^1.3.5": +"@types/reach__router@^1.3.5": version "1.3.5" resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.3.5.tgz#14e1e981cccd3a5e50dc9e969a72de0b9d472f6d" integrity sha512-h0NbqXN/tJuBY/xggZSej1SKQEstbHO7J/omt1tYoFGmj3YXOodZKbbqD4mNDh7zvEGYd7YFrac1LTtAr3xsYQ== @@ -5034,7 +4866,7 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-7.0.4.tgz#00a5749810b4ad80bff73a61f9cc9d0d521feb3c" integrity sha512-WGZCqBZZ0mXN2RxvLHL6/7RCu+OWs28jgQMP04LWfpyJlQUMTR6YU9CNJAKDgbw+EV/u687INXuLUc7FuML/4g== -"@types/webpack-env@^1.15.0", "@types/webpack-env@^1.15.1", "@types/webpack-env@^1.15.2": +"@types/webpack-env@^1.15.1", "@types/webpack-env@^1.15.2": version "1.15.2" resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.2.tgz#927997342bb9f4a5185a86e6579a0a18afc33b0a" integrity sha512-67ZgZpAlhIICIdfQrB5fnDvaKFcDxpKibxznfYRVAT4mQE41Dido/3Ty+E3xGBmTogc5+0Qb8tWhna+5B8z1iQ== @@ -11341,7 +11173,7 @@ css-selector-tokenizer@^0.7.0, css-selector-tokenizer@^0.7.1: fastparse "^1.1.2" regexpu-core "^4.6.0" -css-to-react-native@^2.2.1, css-to-react-native@^2.2.2: +css-to-react-native@^2.2.2: version "2.3.2" resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-2.3.2.tgz#e75e2f8f7aa385b4c3611c52b074b70a002f2e7d" integrity sha512-VOFaeZA053BqvvvqIA8c9n0+9vFppVBAHCp6JgFTtTMU3Mzi+XnelJ9XC9ul3BqFzZyQ5N+H0SnwsWT2Ebchxw== @@ -14484,11 +14316,6 @@ fast-deep-equal@^1.0.0: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - fast-deep-equal@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" @@ -17646,7 +17473,7 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-function@^1.0.1, is-function@^1.0.2: +is-function@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== @@ -19919,11 +19746,6 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= -json-fn@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/json-fn/-/json-fn-1.1.1.tgz#4293c9198a482d6697d334a6e32cd0d221121e80" - integrity sha1-QpPJGYpILWaX0zSm4yzQ0iESHoA= - json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -24463,7 +24285,7 @@ pnp-webpack-plugin@1.6.4, pnp-webpack-plugin@^1.6.4: dependencies: ts-pnp "^1.1.6" -polished@^3.3.1, polished@^3.4.4: +polished@^3.4.4: version "3.6.3" resolved "https://registry.yarnpkg.com/polished/-/polished-3.6.3.tgz#68f4fe7ffad46530733029b939dd12978200cb59" integrity sha512-QJ0q0b6gX1+0OJtPMfgVJxV0vg5XTa4im+Rca989dAtmsd/fEky3X+0A+V+OUXq1nyiDGplJwqD853dTS0gkPg== @@ -26721,11 +26543,6 @@ react-moment-proptypes@^1.7.0: dependencies: moment ">=1.6.0" -react-native-swipe-gestures@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/react-native-swipe-gestures/-/react-native-swipe-gestures-1.0.5.tgz#a172cb0f3e7478ccd681fd36b8bfbcdd098bde7c" - integrity sha512-Ns7Bn9H/Tyw278+5SQx9oAblDZ7JixyzeOczcBK8dipQk2pD7Djkcfnf1nB/8RErAmMLL9iXgW0QHqiII8AhKw== - react-popper-tooltip@^2.11.0, react-popper-tooltip@^2.11.1: version "2.11.1" resolved "https://registry.yarnpkg.com/react-popper-tooltip/-/react-popper-tooltip-2.11.1.tgz#3c4bdfd8bc10d1c2b9a162e859bab8958f5b2644" @@ -28866,11 +28683,6 @@ shallow-copy@~0.0.1: resolved "https://registry.yarnpkg.com/shallow-copy/-/shallow-copy-0.0.1.tgz#415f42702d73d810330292cc5ee86eae1a11a170" integrity sha1-QV9CcC1z2BAzApLMXuhurhoRoXA= -shallow-equal@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/shallow-equal/-/shallow-equal-1.2.1.tgz#4c16abfa56043aa20d050324efa68940b0da79da" - integrity sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA== - shallowequal@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" @@ -30414,20 +30226,6 @@ teeny-request@6.0.1: stream-events "^1.0.5" uuid "^3.3.2" -telejson@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/telejson/-/telejson-3.3.0.tgz#6d814f3c0d254d5c4770085aad063e266b56ad03" - integrity sha512-er08AylQ+LEbDLp1GRezORZu5wKOHaBczF6oYJtgC3Idv10qZ8A3p6ffT+J5BzDKkV9MqBvu8HAKiIIOp6KJ2w== - dependencies: - "@types/is-function" "^1.0.0" - global "^4.4.0" - is-function "^1.0.1" - is-regex "^1.0.4" - is-symbol "^1.0.3" - isobject "^4.0.0" - lodash "^4.17.15" - memoizerific "^1.11.3" - telejson@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/telejson/-/telejson-4.0.0.tgz#91ac1747f1efbc88a58e4344fbd8fe438695f77e" @@ -31130,7 +30928,7 @@ tryer@^1.0.1: resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== -ts-dedent@^1.1.0, ts-dedent@^1.1.1: +ts-dedent@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ts-dedent/-/ts-dedent-1.1.1.tgz#68fad040d7dbd53a90f545b450702340e17d18f3" integrity sha512-UGTRZu1evMw4uTPyYF66/KFd22XiU+jMaIuHrkIHQ2GivAXVlLV0v/vHrpOuTRf9BmpNHi/SO7Vd0rLu0y57jg==