From 6ad6dd9081c4e61a0b52e49f7b3e70e51c19cf88 Mon Sep 17 00:00:00 2001 From: Joel Arvidsson Date: Wed, 25 Mar 2020 21:59:18 +0100 Subject: [PATCH] Add support for Storybook 5 in init command (#225) --- .travis.yml | 6 ++ docs/getting-started.md | 16 +++++ package.json | 3 +- packages/browser/src/get-stories.js | 2 +- .../src/create-aws-lambda-renderer.spec.js | 2 +- packages/runner/src/commands/init/index.js | 29 ++++++--- .../src/create-chrome-docker-target.spec.js | 2 +- test/cli/.gitignore | 1 + .../chrome_laptop_Welcome_to_Storybook.png | Bin 0 -> 58162 bytes test/cli/package.json | 12 ++++ test/cli/test-cra-init.sh | 58 ++++++++++++++++++ 11 files changed, 118 insertions(+), 13 deletions(-) create mode 100644 test/cli/.gitignore create mode 100644 test/cli/fixtures/chrome_laptop_Welcome_to_Storybook.png create mode 100644 test/cli/package.json create mode 100755 test/cli/test-cra-init.sh diff --git a/.travis.yml b/.travis.yml index 80e0e464..4045e2d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,6 +12,12 @@ jobs: - stage: test name: 'Unit tests' script: yarn test + - stage: test + name: 'Integration tests: CLI' + services: + - docker + before_script: cd test/cli + script: yarn test - stage: test name: 'Visual tests: React DOM' services: diff --git a/docs/getting-started.md b/docs/getting-started.md index b53bcab0..33b42575 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -21,6 +21,22 @@ yarn add loki --dev yarn loki init ``` +### Manually + +Optionally add [loki configuration](/configuration.html) and integrate as follows: + +#### React + +Add `import 'loki/configure-react'` to `.storybook/preview.js`, create it if it doesn't exist already. + +#### Vue + +Add `import 'loki/configure-vue'` to `.storybook/preview.js`, create it if it doesn't exist already. + +#### React native + +Add `import 'loki/configure-react-native'` to `storybook/storybook.js`. + ## Running your first tests ### 1. Review configuration diff --git a/package.json b/package.json index 13503c23..a4299d3c 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "loki": "bin/loki" }, "scripts": { - "format": "prettier '{,packages/**/,examples/**/,website/**/,docs/**/}*.{md,js,json}' --write", + "format": "prettier '{,packages/**/,examples/**/,website/**/,docs/**/,test/**/}*.{md,js,json}' --write", "lint": "eslint packages/*/src", "test": "jest" }, @@ -31,6 +31,7 @@ "workspaces": { "packages": [ "packages/*", + "test/*", "website", "examples/react", "examples/renderer-aws-lambda" diff --git a/packages/browser/src/get-stories.js b/packages/browser/src/get-stories.js index 5c1085f7..0b3813b6 100644 --- a/packages/browser/src/get-stories.js +++ b/packages/browser/src/get-stories.js @@ -2,7 +2,7 @@ const getStories = window => { const getStorybook = window.loki && window.loki.getStorybook; if (!getStorybook) { throw new Error( - "Loki addon not registered. Add `import 'loki/configure-react'` to your config.js file." + "Loki addon not registered. Add `import 'loki/configure-react'` to your .storybook/preview.js file." ); } return getStorybook().map(component => ({ diff --git a/packages/renderer-aws-lambda/src/create-aws-lambda-renderer.spec.js b/packages/renderer-aws-lambda/src/create-aws-lambda-renderer.spec.js index c97f12c3..ec5c76a2 100644 --- a/packages/renderer-aws-lambda/src/create-aws-lambda-renderer.spec.js +++ b/packages/renderer-aws-lambda/src/create-aws-lambda-renderer.spec.js @@ -80,7 +80,7 @@ describe('createChromeAWSLambdaRenderer', () => { 'throws if not configured', async () => { await expect(fetchStorybookFixture('unconfigured')).rejects.toThrow( - "Loki addon not registered. Add `import 'loki/configure-react'` to your config.js file." + "Loki addon not registered. Add `import 'loki/configure-react'` to your .storybook/preview.js file." ); }, DOCKER_TEST_TIMEOUT diff --git a/packages/runner/src/commands/init/index.js b/packages/runner/src/commands/init/index.js index cf324bcf..009d091a 100644 --- a/packages/runner/src/commands/init/index.js +++ b/packages/runner/src/commands/init/index.js @@ -25,7 +25,7 @@ const insertAfter = ( )}\n${stringToInsert}${content.substr(insertionIndex)}`; } if (fallback === 'append') { - return `${content}\n${stringToInsert}\n`; + return `${content ? `${content}\n` : ''}${stringToInsert}\n`; } return `${stringToInsert}\n${content}`; }; @@ -88,24 +88,35 @@ function init(args) { fs.outputFileSync(storybookjsPath, modifiedStorybookjs); } } else { - const configjsPath = `${storybookPath}/config.js`; - const configjs = fs.readFileSync(configjsPath, 'utf8'); const projectType = isVueProject ? 'vue' : 'react'; const configPackage = `loki/configure-${projectType}`; const storybookPackage = `@storybook/${projectType}`; - if (configjs.indexOf(configPackage) !== -1) { + + const configjsPath = `${storybookPath}/config.js`; + const previewjsPath = `${storybookPath}/preview.js`; + const destinationPath = fs.existsSync(configjsPath) + ? configjsPath + : previewjsPath; + + const configContent = fs.existsSync(destinationPath) + ? fs.readFileSync(destinationPath, 'utf8') + : ''; + + if (configContent.indexOf(configPackage) !== -1) { warn( - `${relative(configjsPath)} already has loki configuration, skipping...` + `${relative( + destinationPath + )} already has loki configuration, skipping...` ); } else { - info(`Adding loki configuration to ${relative(configjsPath)}`); - const modifiedConfigjs = insertAfter( - configjs, + info(`Adding loki configuration to ${relative(destinationPath)}`); + const modifiedConfigContent = insertAfter( + configContent, new RegExp(`(require\\(|from )['"]${storybookPackage}['"]\\)?;?[ \t]*`), `import '${configPackage}';`, 'append' ); - fs.outputFileSync(configjsPath, modifiedConfigjs); + fs.outputFileSync(destinationPath, modifiedConfigContent); } } } diff --git a/packages/target-chrome-docker/src/create-chrome-docker-target.spec.js b/packages/target-chrome-docker/src/create-chrome-docker-target.spec.js index 913bcca0..22c621fb 100644 --- a/packages/target-chrome-docker/src/create-chrome-docker-target.spec.js +++ b/packages/target-chrome-docker/src/create-chrome-docker-target.spec.js @@ -55,7 +55,7 @@ describe('createChromeTarget', () => { 'throws if not configured', async () => { await expect(fetchStorybookFixture('unconfigured')).rejects.toThrow( - "Loki addon not registered. Add `import 'loki/configure-react'` to your config.js file." + "Loki addon not registered. Add `import 'loki/configure-react'` to your .storybook/preview.js file." ); }, DOCKER_TEST_TIMEOUT diff --git a/test/cli/.gitignore b/test/cli/.gitignore new file mode 100644 index 00000000..86d4c2dd --- /dev/null +++ b/test/cli/.gitignore @@ -0,0 +1 @@ +generated diff --git a/test/cli/fixtures/chrome_laptop_Welcome_to_Storybook.png b/test/cli/fixtures/chrome_laptop_Welcome_to_Storybook.png new file mode 100644 index 0000000000000000000000000000000000000000..9f7be9983afdc11be8872a0357fbde9fd8e9b5c8 GIT binary patch literal 58162 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 literal 0 HcmV?d00001 diff --git a/test/cli/package.json b/test/cli/package.json new file mode 100644 index 00000000..ea2e87a6 --- /dev/null +++ b/test/cli/package.json @@ -0,0 +1,12 @@ +{ + "name": "@loki/test-cli", + "version": "0.20.1", + "private": true, + "scripts": { + "test": "bash ./test-cra-init.sh" + }, + "devDependencies": { + "execa": "^1.0.0", + "loki": "^0.20.1" + } +} diff --git a/test/cli/test-cra-init.sh b/test/cli/test-cra-init.sh new file mode 100755 index 00000000..646d61a9 --- /dev/null +++ b/test/cli/test-cra-init.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +set -Eeuo pipefail + +assert_contains() { + FILENAME=$1 + EXPECTED_CONTENT=$2 + + if [[ "$(cat $FILENAME)" == *"${EXPECTED_CONTENT}"* ]]; then + return 0 + else + echo "Unable to find $EXPECTED_CONTENT in $FILENAME" + return 1 + fi +} + +# Ensure we're in the correct folder +pushd "$( dirname "${BASH_SOURCE[0]}" )" > /dev/null + +# Scaffold a new CRA project with storybook and loki +mkdir -p generated +cd generated +rm -rf create-react-app || true +yarn create react-app create-react-app +cd create-react-app +npx -p @storybook/cli sb init +yarn add loki +../../../../node_modules/.bin/loki init + +# Ensure modifications has been made +assert_contains "package.json" "$(cat <<-END + "loki": { + "configurations": { + "chrome.laptop": { + "target": "chrome.docker", + "width": 1366, + "height": 768, + "deviceScaleFactor": 1, + "mobile": false + }, + "chrome.iphone7": { + "target": "chrome.docker", + "preset": "iPhone 7" + } + } + } +END +)" +assert_contains ".storybook/preview.js" "import 'loki/configure-react'" + +# Ensure we can snap stories +yarn build-storybook +mkdir -p .loki/reference +cp ../../fixtures/chrome_laptop_Welcome_to_Storybook.png ./.loki/reference +../../../../node_modules/.bin/loki test laptop --requireReference --storiesFilter Welcome --reactUri file:./storybook-static + +# Peace out +popd > /dev/null