Merge pull request #4942 from storybooks/react-native/use-core-for-server

React native - Use Core
This commit is contained in:
Norbert de Langen 2019-03-15 10:44:45 +01:00 committed by GitHub
commit 7fbb406a9f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
63 changed files with 12682 additions and 1508 deletions

View File

@ -309,6 +309,25 @@ https://url-of-storybook?path=/story/<storyId>
The structure of `storyId` is a slugified `<selectedKind>--<selectedStory>` (slugified = lowercase, hyphen-separated). Each `storyId` must be unique. We plan to build more features into Storybook in upcoming versions based on this new structure.
## Rename of the `--secure` cli parameter to `--https`
Storybook for React Native's start commands & the Web versions' start command were a bit different, for no reason.
We've changed the start command for Reactnative to match the other.
This means that when you previously used the `--secure` flag like so:
```sh
start-storybook --secure
# or
start-storybook --s
```
You have to replace it with:
```sh
start-storybook --https
```
## From version 4.0.x to 4.1.x
There are are a few migrations you should be aware of in 4.1, including one unintentionally breaking change for advanced addon usage.

View File

@ -23,6 +23,7 @@
},
"dependencies": {
"@storybook/addons": "5.1.0-alpha.6",
"@storybook/core-events": "5.1.0-alpha.6",
"core-js": "^2.6.5",
"deep-equal": "^1.0.1",
"prop-types": "^15.7.2",
@ -32,7 +33,7 @@
"react-native-switch": "^1.5.0"
},
"peerDependencies": {
"@storybook/addon-knobs": "5.0.0-alpha.5",
"@storybook/addon-knobs": "5.1.0-alpha.6",
"react": "*",
"react-native": "*"
},

View File

@ -1,7 +1,8 @@
import React from 'react';
import { View, Text, TouchableOpacity } from 'react-native';
import PropTypes from 'prop-types';
import { SELECT_STORY, FORCE_RE_RENDER } from '@storybook/core-events';
import { SET, SET_OPTIONS, RESET, CHANGE, CLICK } from '@storybook/addon-knobs/events';
import GroupTabs from './GroupTabs';
import PropForm from './PropForm';
@ -29,18 +30,16 @@ export default class Panel extends React.Component {
componentDidMount() {
const { channel } = this.props;
channel.on('addon:knobs:setKnobs', this.setKnobs);
channel.on('addon:knobs:setOptions', this.setOptions);
channel.on('selectStory', this.reset);
channel.emit('forceReRender');
channel.on(SET, this.setKnobs);
channel.on(SET_OPTIONS, this.setOptions);
channel.on(SELECT_STORY, this.reset);
channel.emit(FORCE_RE_RENDER);
}
componentWillUnmount() {
const { channel } = this.props;
channel.removeListener('addon:knobs:setKnobs', this.setKnobs);
channel.removeListener('selectStory', this.reset);
channel.removeListener(SET, this.setKnobs);
channel.removeListener(SELECT_STORY, this.reset);
}
onGroupSelect(name) {
@ -60,12 +59,12 @@ export default class Panel extends React.Component {
reset = () => {
const { channel } = this.props;
this.setState({ knobs: {} });
channel.emit('addon:knobs:reset');
channel.emit(RESET);
};
emitChange(changedKnob) {
const { channel } = this.props;
channel.emit('addon:knobs:knobChange', changedKnob);
channel.emit(CHANGE, changedKnob);
}
handleChange(changedKnob) {
@ -86,7 +85,7 @@ export default class Panel extends React.Component {
handleClick(knob) {
const { channel } = this.props;
channel.emit('addon:knobs:knobClick', knob);
channel.emit(CLICK, knob);
}
render() {

View File

@ -30,7 +30,7 @@
"regenerator-runtime": "^0.12.1"
},
"peerDependencies": {
"@storybook/addon-storyshots": "5.0.0-alpha.5"
"@storybook/addon-storyshots": "5.1.0-alpha.6"
},
"publishConfig": {
"access": "public"

View File

@ -0,0 +1,2 @@
docs
.babelrc

3
app/react-native-server/bin/index.js vendored Executable file
View File

@ -0,0 +1,3 @@
#!/usr/bin/env node
require('../dist/server');

View File

@ -0,0 +1,46 @@
{
"name": "@storybook/react-native-server",
"version": "5.1.0-alpha.6",
"description": "A better way to develop React Native Components for your app",
"keywords": [
"react",
"react-native",
"storybook"
],
"homepage": "https://github.com/storybooks/storybook/tree/master/app/react-native-server",
"bugs": {
"url": "https://github.com/storybooks/storybook/issues"
},
"repository": {
"type": "git",
"url": "https://github.com/storybooks/storybook.git"
},
"license": "MIT",
"bin": {
"start-storybook": "./bin/index.js",
"storybook-server": "./bin/index.js"
},
"scripts": {
"prepare": "node ../../scripts/prepare.js"
},
"dependencies": {
"@storybook/addons": "5.1.0-alpha.6",
"@storybook/channel-websocket": "5.1.0-alpha.6",
"@storybook/core": "5.1.0-alpha.6",
"@storybook/core-events": "5.1.0-alpha.6",
"@storybook/ui": "5.1.0-alpha.6",
"commander": "^2.19.0",
"global": "^4.3.2",
"react": "^16.6.0",
"react-dom": "^16.6.0",
"uuid": "^3.3.2",
"webpack": "^4.23.1",
"ws": "^6.1.0"
},
"peerDependencies": {
"babel-loader": "^7.0.0 || ^8.0.0"
},
"publishConfig": {
"access": "public"
}
}

View File

@ -0,0 +1,13 @@
# Storybook Server for React Native
Additional package for @storybook/react-native to support a web server and browser UI that runs alongside the RN on-device UI
For more information visit: [storybook.js.org](https://storybook.js.org)
## Usage
After setting up Storybook for React Native install this package.
```shell
npm install --save-dev @storybook/react-native-server
```
Then run `npx storybook start`

View File

@ -11,11 +11,6 @@ export default class ReactProvider extends Provider {
super();
this.options = options;
this.selection = null;
try {
this.channel = addons.getChannel();
} catch (err) {
this.channel = undefined;
}
const { secured, host, port } = options;
const websocketType = secured ? 'wss' : 'ws';
@ -38,30 +33,37 @@ export default class ReactProvider extends Provider {
}
}
renderPreview(kind, story) {
this.selection = { kind, story };
this.channel.emit(Events.SET_CURRENT_STORY, { kind, story });
const renderPreview = addons.getPreview();
getElements(type) {
return addons.getElements(type);
}
const innerPreview = renderPreview ? renderPreview(kind, story) : null;
return innerPreview || <PreviewHelp />;
renderPreview(state, api) {
if (state.storiesHash[state.storyId]) {
const { kind, story } = state.storiesHash[state.storyId];
this.selection = { kind, story };
api.emit(Events.SET_CURRENT_STORY, { kind, story });
// FIXME: getPreview not implemented yet.
if (addons.getPreview) {
const renderPreview = addons.getPreview();
if (renderPreview) {
return renderPreview(kind, story);
}
}
}
return <PreviewHelp />;
}
handleAPI(api) {
addons.loadAddons(api);
api.onStory((kind, story) => {
this.selection = { kind, story };
this.channel.emit(Events.SET_CURRENT_STORY, this.selection);
api.emit(Events.SET_CURRENT_STORY, this.selection);
});
this.channel.on(Events.SELECT_STORY, ({ kind, story }) => {
api.selectStory(kind, story);
api.on(Events.GET_CURRENT_STORY, () => {
api.emit(Events.SET_CURRENT_STORY, this.selection);
});
this.channel.on(Events.SET_STORIES, data => {
api.setStories(data.stories);
});
this.channel.on(Events.GET_CURRENT_STORY, () => {
this.channel.emit(Events.SET_CURRENT_STORY, this.selection);
});
this.channel.emit(Events.GET_STORIES);
addons.loadAddons(api);
api.emit(Events.GET_STORIES);
}
}

View File

@ -0,0 +1,39 @@
import path from 'path';
import program from 'commander';
export function parseList(str) {
return str.split(',');
}
function getCli() {
program
.option('-h, --host <host>', 'host to listen on', 'localhost')
.option('-p, --port <port>', 'port to listen on', 7007)
.option('-e, --environment [environment]', 'DEVELOPMENT/PRODUCTION environment for webpack')
.option('-i, --manual-id', 'allow multiple users to work with same storybook')
.option('-c, --config-dir [dir-name]', 'Directory where to load Storybook configurations from')
.option(
'--https',
'Serve Storybook over HTTPS. Note: You must provide your own certificate information.'
)
.option(
'--ssl-ca <ca>',
'Provide an SSL certificate authority. (Optional with --https, required if using a self-signed certificate)',
parseList
)
.option('--ssl-cert <cert>', 'Provide an SSL certificate. (Required with --https)')
.option('--ssl-key <key>', 'Provide an SSL key. (Required with --https)')
.option('--smoke-test', 'Exit after successful start')
.option('--ci', "CI mode (skip interactive prompts, don't open browser")
.option('--quiet', 'Suppress verbose build output')
.parse(process.argv);
const configDir = path.resolve(program.configDir || './storybook');
return {
...program,
configDir,
};
}
export default getCli;

View File

@ -1,17 +1,24 @@
import express from 'express';
#!/usr/bin/env node
import querystring from 'querystring';
import http from 'http';
import ws from 'ws';
import storybook from './middleware';
import storybook from '@storybook/core/standalone';
import extendOptions from './options';
import getCli from './cli';
export default class Server {
constructor(options) {
this.options = options;
this.httpServer = http.createServer();
this.expressApp = express();
this.expressApp.use(storybook(options));
this.httpServer.on('request', this.expressApp);
this.wsServer = new ws.Server({ server: this.httpServer });
this.attachWS = this.attachWS.bind(this);
this.options = extendOptions(options, this.attachWS);
}
start() {
return storybook(this.options);
}
attachWS(server) {
this.wsServer = new ws.Server({ server });
this.wsServer.on('connection', (s, req) => this.handleWS(s, req));
}
@ -32,8 +39,7 @@ export default class Server {
});
});
}
listen(...args) {
this.httpServer.listen(...args);
}
}
const server = new Server(getCli());
server.start();

View File

@ -0,0 +1,27 @@
import { managerPreset } from '@storybook/core/server';
import packageJson from '../../package.json';
function extendOptions(options, extendServer) {
const { manualId, https: secured, host, port } = options;
const storybookOptions = { manualId, secured, host, port };
return {
...options,
extendServer,
packageJson,
mode: 'dev',
ignorePreview: true,
corePresets: [
{
name: managerPreset,
options: { managerEntry: require.resolve('../client/manager') },
},
{
name: require.resolve('./rn-options-preset.js'),
options: { storybookOptions },
},
],
};
}
export default extendOptions;

View File

@ -0,0 +1,15 @@
import webpack from 'webpack';
export async function managerWebpack(config, options) {
const { storybookOptions } = options;
return {
...config,
plugins: [
...config.plugins,
new webpack.DefinePlugin({
storybookOptions: JSON.stringify(storybookOptions),
}),
],
};
}

View File

@ -84,7 +84,8 @@ RN application, e.g. on a tab or within an admin screen.
## Server support
If you want to support having a storybook server running add following NPM script into your `package.json` file:
If you want to support having a storybook server running install storybook server `npm install --save-dev @storybook/react-native-server`
and add following NPM script into your `package.json` file:
```json
{

View File

@ -1,8 +1,5 @@
# Storybook server
The default usage of React Native Storybook till version 4 involved starting Storybook server.
Starting from v4 we do not expect user to start the server since in most cases it is not really necessary.
In case you still want to run Storybook server simply call `npm run storybook` or `npx storybook start`.
Since storybook v5 the storybook server is a standalone package. To keep using storybook server make sure to install @storybook/react-native-server package.
## Benefits of storybook server

View File

@ -20,9 +20,6 @@
"license": "MIT",
"main": "dist/index.js",
"jsnext:main": "src/index.js",
"bin": {
"storybook": "dist/bin/storybook.js"
},
"scripts": {
"prepare": "node ../../scripts/prepare.js"
},
@ -31,50 +28,17 @@
"@storybook/addons": "5.1.0-alpha.6",
"@storybook/channel-websocket": "5.1.0-alpha.6",
"@storybook/channels": "5.1.0-alpha.6",
"@storybook/core": "5.1.0-alpha.6",
"@storybook/client-api": "5.1.0-alpha.6",
"@storybook/core-events": "5.1.0-alpha.6",
"@storybook/ui": "5.1.0-alpha.6",
"babel-loader": "^8.0.4",
"babel-plugin-macros": "^2.4.5",
"babel-plugin-syntax-async-functions": "^6.13.0",
"babel-plugin-syntax-trailing-function-commas": "^6.22.0",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.23.0",
"babel-plugin-transform-regenerator": "^6.26.0",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-preset-env": "^1.7.0",
"babel-preset-minify": "^0.5.0 || 0.6.0-alpha.5",
"babel-preset-react": "^6.24.1",
"babel-runtime": "^6.26.0",
"case-sensitive-paths-webpack-plugin": "^2.2.0",
"commander": "^2.19.0",
"core-js": "^2.6.5",
"dotenv-webpack": "^1.7.0",
"ejs": "^2.6.1",
"express": "^4.16.4",
"find-cache-dir": "^2.0.0",
"global": "^4.3.2",
"html-webpack-plugin": "^4.0.0-beta.2",
"json5": "^2.1.0",
"lazy-universal-dotenv": "^2.0.0",
"prop-types": "^15.7.2",
"raw-loader": "^1.0.0",
"react-dev-utils": "^8.0.0",
"react-native-swipe-gestures": "^1.0.2",
"shelljs": "^0.8.3",
"url-parse": "^1.4.4",
"uuid": "^3.3.2",
"webpack": "^4.29.6",
"webpack-dev-middleware": "^3.6.0",
"webpack-hot-middleware": "^2.24.3",
"ws": "^6.1.4"
"react-native-swipe-gestures": "^1.0.3",
"rn-host-detect": "^1.1.5"
},
"devDependencies": {
"react-native": "^0.57.8"
},
"peerDependencies": {
"babel-core": "^6.26.0 || ^7.0.0-0 || ^7.0.0-bridge.0",
"babel-runtime": ">=6.0.0",
"react": "*",
"react-native": ">=0.57.0"
},

View File

@ -10,11 +10,14 @@ For more information visit: [storybook.js.org](https://storybook.js.org)
The `storybook` CLI tool can be used to add Storybook to your React Native app. Install the `storybook` tool if necessary and run it from your project directory with these commands:
```sh
```shell
cd my-rn-app
npx -p @storybook/cli sb init
```
During installation it will ask if you want to install storybook server.
It allows you to control the storybook from your web browser.
The next thing you need to do is make Storybook UI visible in your app.
### CRNA, React Native vanilla
@ -42,8 +45,7 @@ module.exports = __DEV__ ? StorybookUI : App;
## Start Storybook server (optional)
If you want to control storybook from browser/VS Code/websockets you need to start the server.
After initial setup start the storybook server with the storybook npm script.
If you want to control storybook from browser/VS Code/websockets you need install and start the server.
```sh
npm run storybook
@ -51,16 +53,6 @@ npm run storybook
Now, you can open `<http://localhost:7007>` to view your storybook menus in the browser.
## Old standalone behavior
Since storybook version v4.0 packager is removed from storybook.
The suggested storybook usage is to include it inside your app.
If you want to keep the old behavior, you have to start the packager yourself with a different project root.
```sh
npm run storybook start -p 7007 | react-native start --projectRoot storybook
```
## Start App
To see your Storybook stories on the device, you should start your mobile app for the `<platform>` of your choice (typically `ios` or `android`). (Note that due to an implementation detail, your stories will only show up in the left pane of your browser window after your device has connected to this storybook server.)
@ -90,7 +82,7 @@ The following parameters can be passed to the start command:
host to listen on
-p, --port <port>
port to listen on
-s, --secured
--https
whether server is running on https
-c, --config-dir [dir-name]
storybook config directory

View File

@ -1,5 +0,0 @@
#!/usr/bin/env node
import program from 'commander';
program.option('-o, --outdir <outdir>', 'location to store built storybook').parse(process.argv);

View File

@ -1,42 +0,0 @@
#!/usr/bin/env node
/* eslint-disable no-console */
import path from 'path';
import program from 'commander';
import Server from '../server';
program
.allowUnknownOption()
.option('-h, --host <host>', 'host to listen on', 'localhost')
.option('-p, --port <port>', 'port to listen on', 7007)
.option('-s, --secured', 'whether server is running on https')
.option('-c, --config-dir [dir-name]', 'storybook config directory')
.option('-e, --environment [environment]', 'DEVELOPMENT/PRODUCTION environment for webpack')
.option('-i, --manual-id', 'allow multiple users to work with same storybook')
.option('--smoke-test', 'Exit after successful start')
.parse(process.argv);
const projectDir = path.resolve();
const configDir = path.resolve(program.configDir || './storybook');
const listenAddr = [program.port];
if (program.host) {
listenAddr.push(program.host);
}
const server = new Server({
projectDir,
configDir,
environment: program.environment,
manualId: program.manualId,
secured: program.secured,
});
server.listen(...listenAddr, err => {
if (err) {
throw err;
}
const address = `http://${program.host}:${program.port}/`;
console.info(`\nReact Native Storybook started on => ${address}\n`);
if (program.smokeTest) {
process.exit(0);
}
});

View File

@ -1,9 +0,0 @@
#!/usr/bin/env node
import program from 'commander';
program
.version(require('../../package.json').version)
.command('start', 'starts storybook webapp', { isDefault: true })
.command('build', 'builds storybook webapp')
.parse(process.argv);

View File

@ -11,7 +11,7 @@ export default class Addons extends PureComponent {
super();
addons.loadAddons({});
this.panels = addons.getPanels();
this.panels = addons.getElements('panel');
this.state = {
addonSelected: Object.keys(this.panels)[0] || null,

View File

@ -1,15 +1,13 @@
/* eslint-disable no-underscore-dangle */
import React from 'react';
import { NativeModules } from 'react-native';
import AsyncStorage from '@react-native-community/async-storage';
import parse from 'url-parse';
import getHost from 'rn-host-detect';
import addons from '@storybook/addons';
import Events from '@storybook/core-events';
import Channel from '@storybook/channels';
import createChannel from '@storybook/channel-websocket';
import { StoryStore, ClientApi } from '@storybook/core/client';
import { StoryStore, ClientApi } from '@storybook/client-api';
import OnDeviceUI from './components/OnDeviceUI';
import StoryView from './components/StoryView';
@ -19,7 +17,8 @@ export default class Preview {
constructor() {
this._addons = {};
this._decorators = [];
this._stories = new StoryStore();
this._stories = new StoryStore({});
this._clientApi = new ClientApi({ storyStore: this._stories });
[
@ -63,8 +62,7 @@ export default class Preview {
if (onDeviceUI && params.disableWebsockets) {
channel = new Channel({ async: true });
} else {
const host =
params.host || parse(NativeModules.SourceCode.scriptURL).hostname || 'localhost';
const host = getHost(params.host || 'localhost');
const port = params.port !== false ? `:${params.port || 7007}` : '';
const query = params.query || '';
@ -88,12 +86,14 @@ export default class Preview {
}
addons.setChannel(channel);
this._stories.setChannel(channel);
channel.emit(Events.CHANNEL_CREATED);
}
channel.on(Events.GET_STORIES, () => this._sendSetStories());
channel.on(Events.SET_CURRENT_STORY, d => this._selectStoryEvent(d));
this._sendSetStories();
// If the app is started with server running, set the story as the one selected in the browser
@ -137,6 +137,7 @@ export default class Preview {
const channel = addons.getChannel();
const stories = this._stories.dumpStoryBook();
channel.emit(Events.SET_STORIES, { stories });
channel.emit(Events.STORIES_CONFIGURED);
}
_sendGetCurrentStory() {
@ -188,8 +189,10 @@ export default class Preview {
_selectStoryEvent(selection) {
AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(selection));
const story = this._getStory(selection);
this._selectStory(story);
if (selection) {
const story = this._getStory(selection);
this._selectStory(story);
}
}
_selectStory(story) {

View File

@ -1,136 +0,0 @@
import fs from 'fs';
import path from 'path';
import JSON5 from 'json5';
import findCacheDir from 'find-cache-dir';
import { createDefaultWebpackConfig } from '@storybook/core/server';
// avoid ESLint errors
const logger = console;
function removeReactHmre(presets) {
const index = presets.indexOf('react-hmre');
if (index > -1) {
presets.splice(index, 1);
}
}
// Tries to load a .babelrc and returns the parsed object if successful
function loadBabelConfig(babelConfigPath) {
let config;
if (fs.existsSync(babelConfigPath)) {
const content = fs.readFileSync(babelConfigPath, 'utf-8');
try {
config = JSON5.parse(content);
config.babelrc = false;
} catch (e) {
logger.error(`=> Error parsing .babelrc file: ${e.message}`);
throw e;
}
}
if (!config) return null;
// Remove react-hmre preset.
// It causes issues with react-storybook.
// We don't really need it.
// Earlier, we fix this by runnign storybook in the production mode.
// But, that hide some useful debug messages.
if (config.presets) {
removeReactHmre(config.presets);
}
if (config.env && config.env.development && config.env.development.presets) {
removeReactHmre(config.env.development.presets);
}
return config;
}
// `baseConfig` is a webpack configuration bundled with storybook.
// Storybook will look in the `configDir` directory
// (inside working directory) if a config path is not provided.
export default function(configType, baseConfig, projectDir, configDir) {
const config = baseConfig;
// Search for a .babelrc in project directory, config directory, and storybook
// module directory. If found, use that to extend webpack configurations.
const babelConfigInConfig = loadBabelConfig(path.resolve(configDir, '.babelrc'));
const babelConfigInProject = loadBabelConfig(path.resolve(projectDir, '.babelrc'));
const babelConfigInModule = loadBabelConfig('.babelrc');
let babelConfig = null;
let babelConfigDir = '';
if (babelConfigInConfig) {
logger.info('=> Loading custom .babelrc from config directory.');
babelConfig = babelConfigInConfig;
babelConfigDir = configDir;
} else if (babelConfigInProject) {
logger.info('=> Loading custom .babelrc from project directory.');
babelConfig = babelConfigInProject;
babelConfigDir = projectDir;
} else {
babelConfig = babelConfigInModule;
}
if (babelConfig) {
// If the custom config uses babel's `extends` clause, then replace it with
// an absolute path. `extends` will not work unless we do this.
if (babelConfig.extends) {
babelConfig.extends = babelConfigDir
? path.resolve(babelConfigDir, babelConfig.extends)
: path.resolve(babelConfig.extends);
}
config.module.rules[0].query = babelConfig;
}
// This is a feature of `babel-loader` for webpack (not Babel itself).
// It enables a cache directory for faster-rebuilds
// `find-cache-dir` will create the cache directory under the node_modules directory.
config.module.rules[0].query.cacheDirectory = findCacheDir({
name: 'react-storybook',
});
// Check whether addons.js file exists inside the storybook.
const storybookCustomAddonsPath = path.resolve(configDir, 'addons.js');
if (fs.existsSync(storybookCustomAddonsPath)) {
logger.info('=> Loading custom addons config.');
config.entry.manager.unshift(storybookCustomAddonsPath);
}
const defaultConfig = createDefaultWebpackConfig(config);
// Check whether user has a custom webpack config file and
// return the (extended) base configuration if it's not available.
const customConfigPath = path.resolve(configDir, 'webpack.config.js');
if (!fs.existsSync(customConfigPath)) {
logger.info('=> Using default webpack setup based on "Create React App".');
return defaultConfig;
}
const customConfig = require(customConfigPath); // eslint-disable-line
if (typeof customConfig === 'function') {
logger.info('=> Loading custom webpack config (full-control mode).');
return customConfig(config, configType, defaultConfig, configDir);
}
logger.info('=> Loading custom webpack config.');
customConfig.module = customConfig.module || {};
return {
...customConfig,
// We'll always load our configurations after the custom config.
// So, we'll always load the stuff we need.
...config,
// We need to use our and custom plugins.
plugins: [...config.plugins, ...(customConfig.plugins || [])],
module: {
...config.module,
// We need to use our and custom rules.
...customConfig.module,
rules: [...config.module.rules, ...(customConfig.module.rules || [])],
},
};
}

View File

@ -1,31 +0,0 @@
module.exports = {
// Don't try to find .babelrc because we want to force this configuration.
babelrc: false,
presets: [
[
require.resolve('babel-preset-env'),
{
modules: process.env.NODE_ENV === 'test' ? 'commonjs' : false,
shippedProposals: true,
},
],
require.resolve('babel-preset-react'),
],
plugins: [
require.resolve('babel-plugin-macros'),
require.resolve('babel-plugin-syntax-trailing-function-commas'),
require.resolve('babel-plugin-syntax-async-functions'),
require.resolve('babel-plugin-transform-class-properties'),
require.resolve('babel-plugin-transform-object-rest-spread'),
require.resolve('babel-plugin-transform-regenerator'),
// Polyfills the runtime needed for async/await and generators
[
require.resolve('babel-plugin-transform-runtime'),
{
helpers: true,
polyfill: true,
regenerator: true,
},
],
],
};

View File

@ -1,30 +0,0 @@
module.exports = {
// Don't try to find .babelrc because we want to force this configuration.
babelrc: false,
presets: [
[
require.resolve('babel-preset-env'),
{
modules: false,
},
],
require.resolve('babel-preset-react'),
require.resolve('babel-preset-minify'),
],
plugins: [
require.resolve('babel-plugin-syntax-trailing-function-commas'),
require.resolve('babel-plugin-syntax-async-functions'),
require.resolve('babel-plugin-transform-class-properties'),
require.resolve('babel-plugin-transform-object-rest-spread'),
require.resolve('babel-plugin-transform-regenerator'),
// Polyfills the runtime needed for async/await and generators
[
require.resolve('babel-plugin-transform-runtime'),
{
helpers: true,
polyfill: true,
regenerator: true,
},
],
],
};

View File

@ -1,33 +0,0 @@
import path from 'path';
import { getEnvironment } from 'lazy-universal-dotenv';
export const includePaths = [path.resolve('./')];
export const excludePaths = [path.resolve('./node_modules')];
export const nodeModulesPaths = path.resolve('./node_modules');
// Load environment variables starts with STORYBOOK_ to the client side.
export function loadEnv(options = {}) {
const defaultNodeEnv = options.production ? 'production' : 'development';
const env = {
NODE_ENV: JSON.stringify(process.env.NODE_ENV || defaultNodeEnv),
// This is to support CRA's public folder feature.
// In production we set this to dot(.) to allow the browser to access these assests
// even when deployed inside a subpath. (like in GitHub pages)
// In development this is just empty as we always serves from the root.
PUBLIC_URL: JSON.stringify(options.production ? '.' : ''),
};
const { stringified } = getEnvironment();
Object.keys(process.env)
.filter(name => /^STORYBOOK_/.test(name))
.forEach(name => {
env[name] = JSON.stringify(process.env[name]);
});
return {
'process.env': Object.assign({}, env, stringified),
};
}

View File

@ -1,75 +0,0 @@
import path from 'path';
import webpack from 'webpack';
import Dotenv from 'dotenv-webpack';
import WatchMissingNodeModulesPlugin from 'react-dev-utils/WatchMissingNodeModulesPlugin';
import CaseSensitivePathsPlugin from 'case-sensitive-paths-webpack-plugin';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import { getManagerHeadHtml } from '@storybook/core/server';
import { includePaths, excludePaths, nodeModulesPaths, loadEnv } from './utils';
import { version } from '../../../package.json';
const getConfig = options => {
const environment = loadEnv();
const entriesMeta = {
manager: {
headHtmlSnippet: getManagerHeadHtml(options.configDir, process.env),
},
};
return {
mode: 'development',
devtool: '#cheap-module-eval-source-map',
entry: {
manager: [require.resolve('../../manager')],
},
output: {
path: path.join(__dirname, 'dist'),
filename: 'static/[name].bundle.js',
publicPath: '/',
},
plugins: [
new HtmlWebpackPlugin({
filename: `index.html`,
chunksSortMode: 'none',
alwaysWriteToDisk: true,
inject: false,
templateParameters: (compilation, files, o) => ({
compilation,
files,
options: o,
version,
dlls: [],
...entriesMeta.manager,
}),
template: require.resolve(`@storybook/core/src/server/templates/index.ejs`),
}),
new webpack.DefinePlugin({
storybookOptions: JSON.stringify(options),
}),
new webpack.HotModuleReplacementPlugin(),
new CaseSensitivePathsPlugin(),
new WatchMissingNodeModulesPlugin(nodeModulesPaths),
new webpack.DefinePlugin(environment),
new Dotenv({ silent: true }),
],
module: {
rules: [
{
test: /\.jsx?$/,
loader: require.resolve('babel-loader'),
query: require('./babel.js'), // eslint-disable-line
include: includePaths,
exclude: excludePaths,
},
{
test: /\.md$/,
loader: require.resolve('raw-loader'),
},
],
},
};
};
export default getConfig;

View File

@ -1,77 +0,0 @@
import path from 'path';
import webpack from 'webpack';
import Dotenv from 'dotenv-webpack';
import HtmlWebpackPlugin from 'html-webpack-plugin';
import { getManagerHeadHtml } from '@storybook/core/dist/server/utils/template';
import { version } from '../../../package.json';
import { includePaths, excludePaths, loadEnv } from './utils';
const getConfig = options => {
const environment = loadEnv({ production: true });
const entriesMeta = {
manager: {
headHtmlSnippet: getManagerHeadHtml(options.configDir, process.env),
},
};
const config = {
mode: 'production',
bail: true,
devtool: '#cheap-module-source-map',
entry: {
manager: [path.resolve(__dirname, '../../manager')],
},
output: {
path: path.join(__dirname, 'dist'),
filename: 'static/[name].bundle.js',
// Here we set the publicPath to ''.
// This allows us to deploy storybook into subpaths like GitHub pages.
// This works with css and image loaders too.
// This is working for storybook since, we don't use pushState urls and
// relative URLs works always.
publicPath: '/',
},
plugins: [
new HtmlWebpackPlugin({
filename: `index.html`,
chunksSortMode: 'none',
alwaysWriteToDisk: true,
inject: false,
templateParameters: (compilation, files, o) => ({
compilation,
files,
options: o,
version,
...entriesMeta.manager,
}),
template: require.resolve(`@storybook/core/src/server/templates/index.ejs`),
}),
new webpack.DefinePlugin({
storybookOptions: JSON.stringify(options),
}),
new webpack.optimize.DedupePlugin(),
new webpack.DefinePlugin(environment),
new Dotenv({ silent: true }),
],
module: {
rules: [
{
test: /\.jsx?$/,
loader: require.resolve('babel-loader'),
query: require('./babel.prod.js'), // eslint-disable-line
include: includePaths,
exclude: excludePaths,
},
{
test: /\.md$/,
loader: require.resolve('raw-loader'),
},
],
},
};
return config;
};
export default getConfig;

View File

@ -1,61 +0,0 @@
import fs from 'fs';
import path from 'path';
import { Router } from 'express';
import webpack from 'webpack';
import webpackDevMiddleware from 'webpack-dev-middleware';
import webpackHotMiddleware from 'webpack-hot-middleware';
import baseConfig from './config/webpack.config';
import baseProductionConfig from './config/webpack.config.prod';
import loadConfig from './config';
function getMiddleware(configDir) {
const middlewarePath = path.resolve(configDir, 'middleware.js');
if (fs.existsSync(middlewarePath)) {
let middlewareModule = require(middlewarePath); // eslint-disable-line
if (middlewareModule.__esModule) { // eslint-disable-line
middlewareModule = middlewareModule.default;
}
return middlewareModule;
}
return () => {};
}
export default function(options) {
const { projectDir, configDir } = options;
// Build the webpack configuration using the `baseConfig`
// custom `.babelrc` file and `webpack.config.js` files
const environment = options.environment || 'DEVELOPMENT';
const isProd = environment === 'PRODUCTION';
const currentWebpackConfig = isProd ? baseProductionConfig(options) : baseConfig(options);
const config = loadConfig(environment, currentWebpackConfig, projectDir, configDir);
// remove the leading '/'
let { publicPath } = config.output;
if (publicPath[0] === '/') {
publicPath = publicPath.slice(1);
}
const compiler = webpack(config);
const devMiddlewareOptions = {
noInfo: true,
publicPath: config.output.publicPath,
watchOptions: config.watchOptions || {},
};
const router = new Router();
const middlewareFn = getMiddleware(configDir);
middlewareFn(router);
router.use(webpackDevMiddleware(compiler, devMiddlewareOptions));
if (!isProd) {
router.use(webpackHotMiddleware(compiler));
}
router.get('/', (req, res) => {
res.set('Content-Type', 'text/html');
res.sendFile(path.join(`${__dirname}/public/index.html`));
});
return router;
}

View File

@ -17,10 +17,10 @@
"storybook": "start-storybook -p 9009 -s src/pages"
},
"dependencies": {
"@storybook/addon-actions": "5.0.0-rc.1",
"@storybook/addon-links": "5.0.0-rc.1",
"@storybook/addons": "5.0.0-rc.1",
"@storybook/react": "5.0.0-rc.1",
"@storybook/addon-actions": "5.1.0-alpha.6",
"@storybook/addon-links": "5.1.0-alpha.6",
"@storybook/addons": "5.1.0-alpha.6",
"@storybook/react": "5.1.0-alpha.6",
"babel-loader": "^6.4.1",
"babel-plugin-styled-components": "^1.10.0",
"bootstrap": "^4.3.1",

File diff suppressed because it is too large Load Diff

View File

@ -1,8 +0,0 @@
{
"presets": ["babel-preset-expo"],
"env": {
"development": {
"plugins": ["transform-react-jsx-source"]
}
}
}

View File

@ -0,0 +1,16 @@
module.exports = {
env: {
development: {
presets: ['babel-preset-expo'],
plugins: ['@babel/plugin-transform-react-jsx-source'],
},
production: {
presets: ['babel-preset-expo'],
plugins: [],
},
storybook: {
presets: [],
plugins: [],
},
},
};

View File

@ -5,5 +5,10 @@ This project was bootstrapped wit [Expo](https://github.com/expo/expo-cli) and s
## Getting started
1. Install dependencies: `yarn install`
2. Run storybook: `yarn storybook`
3. Run the app: `yarn start`
2. Delete node_modules/@storybook
3. Run the storybook server: `yarn storybook`
4. Run the app: `yarn start`
## Iterate on app/react-native
Changes to the yarn workspace do not currently reflect live in this app. To iterate on the react native pieces of storybook, use `scripts/update-crna-kitchen-sink`.

View File

@ -1,6 +1,6 @@
{
"expo": {
"sdkVersion": "30.0.0",
"sdkVersion": "31.0.0",
"platforms": ["ios", "android"],
"androidStatusBarColor": "#C2185B",
"androidStatusBar": {

View File

@ -8,7 +8,7 @@
"eject": "expo eject",
"ios": "expo start --ios",
"start": "expo start",
"storybook": "storybook start",
"storybook": "BABEL_ENV=storybook node ../../app/react-native-server/bin/index",
"test": "node node_modules/jest/bin/jest.js --watch"
},
"jest": {
@ -16,12 +16,14 @@
},
"dependencies": {
"expo": "^31.0.4",
"prop-types": "^15.7.2",
"react": "^16.2.0",
"react-native": "https://github.com/expo/react-native/archive/sdk-30.0.0.tar.gz",
"prop-types": "^15.6.2",
"react": "16.5.1",
"react-native": "https://github.com/expo/react-native/archive/sdk-31.0.0.tar.gz",
"whatwg-fetch": "^3.0.0"
},
"devDependencies": {
"@babel/core": "^7.2.2",
"@babel/plugin-transform-react-jsx-source": "^7.2.0",
"@storybook/addon-actions": "file:../../packs/storybook-addon-actions.tgz",
"@storybook/addon-knobs": "file:../../packs/storybook-addon-knobs.tgz",
"@storybook/addon-links": "file:../../packs/storybook-addon-links.tgz",
@ -34,18 +36,22 @@
"@storybook/client-logger": "file:../../packs/storybook-client-logger.tgz",
"@storybook/components": "file:../../packs/storybook-components.tgz",
"@storybook/router": "file:../../packs/storybook-router.tgz",
"@storybook/core": "file:../../packs/storybook-core.tgz",
"@storybook/core": "file:../../lib/core",
"@storybook/core-events": "file:../../packs/storybook-core-events.tgz",
"@storybook/node-logger": "file:../../packs/storybook-node-logger.tgz",
"@storybook/react-native": "file:../../packs/storybook-react-native.tgz",
"@storybook/react-native-server": "file:../../packs/storybook-react-native-server.tgz",
"@storybook/addon-notes": "file:../../packs/storybook-addon-notes.tgz",
"@storybook/addon-ondevice-backgrounds": "file:../../packs/storybook-addon-ondevice-backgrounds.tgz",
"@storybook/addon-ondevice-knobs": "file:../../packs/storybook-addon-ondevice-knobs.tgz",
"@storybook/addon-ondevice-notes": "file:../../packs/storybook-addon-ondevice-notes.tgz",
"@storybook/ui": "file:../../packs/storybook-ui.tgz",
"@storybook/theming": "file:../../packs/storybook-theming.tgz",
"core-js": "^2.5.7",
"babel-loader": "^8.0.4",
"babel-preset-expo": "^5.0.0",
"jest-expo": "^31.0.0",
"react-dom": "^16.2.0",
"react-test-renderer": "^16.6.0"
"schedule": "^0.4.0",
"react-test-renderer": "16.5.1"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
import deprecate from 'util-deprecate';
import { makeDecorator, StoryContext, StoryGetter } from './make-decorator';
// Copy & paste from internal api: core/client/preview/client_api
// Copy & paste from internal api: client-api/src/client_api
type DecoratorFn = (fn: StoryGetter, context: StoryContext) => any;
export const defaultDecorateStory = (getStory: StoryGetter, decorators: DecoratorFn[]) =>

View File

@ -22,6 +22,7 @@ if (process.argv[1].includes('getstorybook')) {
.option('-N --use-npm', 'Use npm to install deps')
.option('-p --parser <babel | babylon | flow>', 'jscodeshift parser')
.option('-t --type <type>', 'Add Storybook for a specific project type')
.option('-y --yes', 'Answer yes to all prompts')
.action(options => initiate(options, pkg));
program

View File

@ -4,7 +4,7 @@ import shell from 'shelljs';
import chalk from 'chalk';
import { getVersions, getPackageJson, writePackageJson, paddedLog } from '../../lib/helpers';
export default async npmOptions => {
export default async (npmOptions, installServer) => {
const [
storybookVersion,
actionsVersion,
@ -50,7 +50,11 @@ export default async npmOptions => {
packageJson.dependencies = packageJson.dependencies || {};
packageJson.devDependencies = packageJson.devDependencies || {};
packageJson.devDependencies['@storybook/react-native'] = storybookVersion;
if (installServer) {
packageJson.devDependencies['@storybook/react-native-server'] = storybookVersion;
}
packageJson.devDependencies['@storybook/react-native'] = storybookVersion;
packageJson.devDependencies['@storybook/addon-actions'] = actionsVersion;
packageJson.devDependencies['@storybook/addon-links'] = linksVersion;
packageJson.devDependencies['@storybook/addons'] = addonsVersion;
@ -71,8 +75,10 @@ export default async npmOptions => {
packageJson.devDependencies['prop-types'] = propTypesVersion;
}
packageJson.scripts = packageJson.scripts || {};
packageJson.scripts.storybook = 'storybook start';
if (installServer) {
packageJson.scripts = packageJson.scripts || {};
packageJson.scripts.storybook = 'start-storybook -p 6006';
}
writePackageJson(packageJson);
};

View File

@ -78,7 +78,19 @@ const installStorybook = (projectType, options) => {
.then(end);
case types.REACT_NATIVE: {
return reactNativeGenerator(npmOptions)
return (options.yes
? Promise.resolve({ server: true })
: inquirer.prompt([
{
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',
default: false,
},
])
)
.then(({ server }) => reactNativeGenerator(npmOptions, server))
.then(commandLog('Adding storybook support to your "React Native" app'))
.then(end)
.then(() => {
@ -176,14 +188,16 @@ const installStorybook = (projectType, options) => {
};
const projectTypeInquirer = async options => {
const manualAnswer = await inquirer.prompt([
{
type: 'confirm',
name: 'manual',
message: 'Do you want to manually choose a Storybook project type to install?',
default: false,
},
]);
const manualAnswer = options.yes
? true
: await inquirer.prompt([
{
type: 'confirm',
name: 'manual',
message: 'Do you want to manually choose a Storybook project type to install?',
default: false,
},
]);
if (manualAnswer.manual) {
const frameworkAnswer = await inquirer.prompt([

View File

@ -1,8 +0,0 @@
{
"presets": ["babel-preset-expo"],
"env": {
"development": {
"plugins": ["transform-react-jsx-source"]
}
}
}

View File

@ -1,63 +0,0 @@
[ignore]
; We fork some components by platform
.*/*[.]android.js
; Ignore "BUCK" generated dirs
<PROJECT_ROOT>/\.buckd/
; Ignore unexpected extra "@providesModule"
.*/node_modules/.*/node_modules/fbjs/.*
; Ignore duplicate module providers
; For RN Apps installed via npm, "Libraries" folder is inside
; "node_modules/react-native" but in the source repo it is in the root
.*/Libraries/react-native/React.js
.*/Libraries/react-native/ReactNative.js
; Additional create-react-native-app ignores
; Ignore duplicate module providers
.*/node_modules/fbemitter/lib/*
; Ignore misbehaving dev-dependencies
.*/node_modules/xdl/build/*
.*/node_modules/reqwest/tests/*
; Ignore missing expo-sdk dependencies (temporarily)
; https://github.com/expo/expo/issues/162
.*/node_modules/expo/src/*
; Ignore react-native-fbads dependency of the expo sdk
.*/node_modules/react-native-fbads/*
[include]
[libs]
node_modules/react-native/Libraries/react-native/react-native-interface.js
node_modules/react-native/flow
flow/
[options]
module.system=haste
emoji=true
experimental.strict_type_args=true
munge_underscores=true
module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub'
suppress_type=$FlowIssue
suppress_type=$FlowFixMe
suppress_type=$FixMe
suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-9]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)
suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-9]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+
suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy
suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError
unsafe.enable_getters_and_setters=true
[version]
^0.49.1

View File

@ -1,3 +0,0 @@
node_modules/
.expo/
npm-debug.*

View File

@ -1 +0,0 @@
{}

View File

@ -6,8 +6,6 @@ export default class App extends React.Component {
return (
<View style={styles.container}>
<Text>Open up App.js to start working on your app!</Text>
<Text>Changes you make will automatically reload.</Text>
<Text>Shake your phone to open the developer menu.</Text>
</View>
);
}

View File

@ -1,9 +0,0 @@
import React from 'react';
import App from './App';
import renderer from 'react-test-renderer';
it('renders without crashing', () => {
const rendered = renderer.create(<App />).toJSON();
expect(rendered).toBeTruthy();
});

View File

@ -1,199 +0,0 @@
This project was bootstrapped with [Create React Native App](https://github.com/react-community/create-react-native-app).
Below you'll find information about performing common tasks. The most recent version of this guide is available [here](https://github.com/react-community/create-react-native-app/blob/master/react-native-scripts/template/README.md).
## Table of Contents
- [Updating to New Releases](#updating-to-new-releases)
- [Available Scripts](#available-scripts)
- [npm start](#npm-start)
- [Customizing App Display Name and Icon](#customizing-app-display-name-and-icon)
- [Writing and Running Tests](#writing-and-running-tests)
- [Environment Variables](#environment-variables)
- [Configuring Packager IP Address](#configuring-packager-ip-address)
- [Adding Flow](#adding-flow)
- [Sharing and Deployment](#sharing-and-deployment)
- [Publishing to Expo's React Native Community](#publishing-to-expos-react-native-community)
- [Building an Expo "standalone" app](#building-an-expo-standalone-app)
- [Ejecting from Create React Native App](#ejecting-from-create-react-native-app)
- [Troubleshooting](#troubleshooting)
- [Networking](#networking)
- [iOS Simulator won't open](#ios-simulator-wont-open)
- [QR Code does not scan](#qr-code-does-not-scan)
## Updating to New Releases
You should only need to update the global installation of `create-react-native-app` very rarely, ideally never.
Updating the `react-native-scripts` dependency of your app should be as simple as bumping the version number in `package.json` and reinstalling your project's dependencies.
Upgrading to a new version of React Native requires updating the `react-native`, `react`, and `expo` package versions, and setting the correct `sdkVersion` in `app.json`. See the [versioning guide](https://github.com/react-community/create-react-native-app/blob/master/VERSIONS.md) for up-to-date information about package version compatibility.
## Available Scripts
If Yarn was installed when the project was initialized, then dependencies will have been installed via Yarn, and you should probably use it to run these commands as well. Unlike dependency installation, command running syntax is identical for Yarn and NPM at the time of this writing.
### `npm start`
Runs your app in development mode.
Open it in the [Expo app](https://expo.io) on your phone to view it. It will reload if you save edits to your files, and you will see build errors and logs in the terminal.
Sometimes you may need to reset or clear the React Native packager's cache. To do so, you can pass the `--reset-cache` flag to the start script:
npm start -- --reset-cache
# or
yarn start -- --reset-cache
#### `npm test`
Runs the [jest](https://github.com/facebook/jest) test runner on your tests.
#### `npm run ios`
Like `npm start`, but also attempts to open your app in the iOS Simulator if you're on a Mac and have it installed.
#### `npm run android`
Like `npm start`, but also attempts to open your app on a connected Android device or emulator. Requires an installation of Android build tools (see [React Native docs](https://facebook.github.io/react-native/docs/getting-started.html) for detailed setup). We also recommend installing Genymotion as your Android emulator. Once you've finished setting up the native build environment, there are two options for making the right copy of `adb` available to Create React Native App:
##### Using Android Studio's `adb`
1. Make sure that you can run adb from your terminal.
2. Open Genymotion and navigate to `Settings -> ADB`. Select “Use custom Android SDK tools” and update with your [Android SDK directory](https://stackoverflow.com/questions/25176594/android-sdk-location).
##### Using Genymotion's `adb`
1. Find Genymotions copy of adb. On macOS for example, this is normally `/Applications/Genymotion.app/Contents/MacOS/tools/`.
2. Add the Genymotion tools directory to your path (instructions for [Mac](http://osxdaily.com/2014/08/14/add-new-path-to-path-command-line/), [Linux](http://www.computerhope.com/issues/ch001647.htm), and [Windows](https://www.howtogeek.com/118594/how-to-edit-your-system-path-for-easy-command-line-access/)).
3. Make sure that you can run adb from your terminal.
#### `npm run eject`
This will start the process of "ejecting" from Create React Native App's build scripts. You'll be asked a couple of questions about how you'd like to build your project.
**Warning:** Running eject is a permanent action (aside from whatever version control system you use). An ejected app will require you to have an [Xcode and/or Android Studio environment](https://facebook.github.io/react-native/docs/getting-started.html) set up.
## Customizing App Display Name and Icon
You can edit `app.json` to include [configuration keys](https://docs.expo.io/versions/latest/guides/configuration.html) under the `expo` key.
To change your app's display name, set the `expo.name` key in `app.json` to an appropriate string.
To set an app icon, set the `expo.icon` key in `app.json` to be either a local path or a URL. It's recommended that you use a 512x512 png file with transparency.
## Writing and Running Tests
This project is set up to use [jest](https://facebook.github.io/jest/) for tests. You can configure whatever testing strategy you like, but jest works out of the box. Create test files in directories called `__tests__` or with the `.test` extension to have the files loaded by jest. See the [the template project](https://github.com/react-community/create-react-native-app/blob/master/react-native-scripts/template/App.test.js) for an example test. The [jest documentation](https://facebook.github.io/jest/docs/getting-started.html) is also a wonderful resource, as is the [React Native testing tutorial](https://facebook.github.io/jest/docs/tutorial-react-native.html).
## Environment Variables
You can configure some of Create React Native App's behavior using environment variables.
### Configuring Packager IP Address
When starting your project, you'll see something like this for your project URL:
exp://192.168.0.2:19000
The "manifest" at that URL tells the Expo app how to retrieve and load your app's JavaScript bundle, so even if you load it in the app via a URL like `exp://localhost:19000`, the Expo client app will still try to retrieve your app at the IP address that the start script provides.
In some cases, this is less than ideal. This might be the case if you need to run your project inside of a virtual machine and you have to access the packager via a different IP address than the one which prints by default. In order to override the IP address or hostname that is detected by Create React Native App, you can specify your own hostname via the `REACT_NATIVE_PACKAGER_HOSTNAME` environment variable:
Mac and Linux:
REACT_NATIVE_PACKAGER_HOSTNAME='my-custom-ip-address-or-hostname' npm start
Windows:
set REACT_NATIVE_PACKAGER_HOSTNAME='my-custom-ip-address-or-hostname'
npm start
The above example would cause the development server to listen on `exp://my-custom-ip-address-or-hostname:19000`.
## Adding Flow
Flow is a static type checker that helps you write code with fewer bugs. Check out this [introduction to using static types in JavaScript](https://medium.com/@preethikasireddy/why-use-static-types-in-javascript-part-1-8382da1e0adb) if you are new to this concept.
React Native works with [Flow](http://flowtype.org/) out of the box, as long as your Flow version matches the one used in the version of React Native.
To add a local dependency to the correct Flow version to a Create React Native App project, follow these steps:
1. Find the Flow `[version]` at the bottom of the included [.flowconfig](.flowconfig)
2. Run `npm install --save-dev flow-bin@x.y.z` (or `yarn add --dev flow-bin@x.y.z`), where `x.y.z` is the .flowconfig version number.
3. Add `"flow": "flow"` to the `scripts` section of your `package.json`.
4. Add `// @flow` to any files you want to type check (for example, to `App.js`).
Now you can run `npm run flow` (or `yarn flow`) to check the files for type errors.
You can optionally use a [plugin for your IDE or editor](https://flow.org/en/docs/editors/) for a better integrated experience.
To learn more about Flow, check out [its documentation](https://flow.org/).
## Sharing and Deployment
Create React Native App does a lot of work to make app setup and development simple and straightforward, but it's very difficult to do the same for deploying to Apple's App Store or Google's Play Store without relying on a hosted service.
### Publishing to Expo's React Native Community
Expo provides free hosting for the JS-only apps created by CRNA, allowing you to share your app through the Expo client app. This requires registration for an Expo account.
Install the `exp` command-line tool, and run the publish command:
$ npm i -g exp
$ exp publish
### Building an Expo "standalone" app
You can also use a service like [Expo's standalone builds](https://docs.expo.io/versions/latest/guides/building-standalone-apps.html) if you want to get an IPA/APK for distribution without having to build the native code yourself.
### Ejecting from Create React Native App
If you want to build and deploy your app yourself, you'll need to eject from CRNA and use Xcode and Android Studio.
This is usually as simple as running `npm run eject` in your project, which will walk you through the process. Make sure to install `react-native-cli` and follow the [native code getting started guide for React Native](https://facebook.github.io/react-native/docs/getting-started.html).
#### Should I Use ExpoKit?
If you have made use of Expo APIs while working on your project, then those API calls will stop working if you eject to a regular React Native project. If you want to continue using those APIs, you can eject to "React Native + ExpoKit" which will still allow you to build your own native code and continue using the Expo APIs. See the [ejecting guide](https://github.com/react-community/create-react-native-app/blob/master/EJECTING.md) for more details about this option.
## Troubleshooting
### Networking
If you're unable to load your app on your phone due to a network timeout or a refused connection, a good first step is to verify that your phone and computer are on the same network and that they can reach each other. Create React Native App needs access to ports 19000 and 19001 so ensure that your network and firewall settings allow access from your device to your computer on both of these ports.
Try opening a web browser on your phone and opening the URL that the packager script prints, replacing `exp://` with `http://`. So, for example, if underneath the QR code in your terminal you see:
exp://192.168.0.1:19000
Try opening Safari or Chrome on your phone and loading
http://192.168.0.1:19000
and
http://192.168.0.1:19001
If this works, but you're still unable to load your app by scanning the QR code, please open an issue on the [Create React Native App repository](https://github.com/react-community/create-react-native-app) with details about these steps and any other error messages you may have received.
If you're not able to load the `http` URL in your phone's web browser, try using the tethering/mobile hotspot feature on your phone (beware of data usage, though), connecting your computer to that WiFi network, and restarting the packager.
### iOS Simulator won't open
If you're on a Mac, there are a few errors that users sometimes see when attempting to `npm run ios`:
- "non-zero exit code: 107"
- "You may need to install Xcode" but it is already installed
- and others
There are a few steps you may want to take to troubleshoot these kinds of errors:
1. Make sure Xcode is installed and open it to accept the license agreement if it prompts you. You can install it from the Mac App Store.
2. Open Xcode's Preferences, the Locations tab, and make sure that the `Command Line Tools` menu option is set to something. Sometimes when the CLI tools are first installed by Homebrew this option is left blank, which can prevent Apple utilities from finding the simulator. Make sure to re-run `npm/yarn run ios` after doing so.
3. If that doesn't work, open the Simulator, and under the app menu select `Reset Contents and Settings...`. After that has finished, quit the Simulator, and re-run `npm/yarn run ios`.
### QR Code does not scan
If you're not able to scan the QR code, make sure your phone's camera is focusing correctly, and also make sure that the contrast on the two colors in your terminal is high enough. For example, WebStorm's default themes may [not have enough contrast](https://github.com/react-community/create-react-native-app/issues/49) for terminal QR codes to be scannable with the system barcode scanners that the Expo app uses.
If this causes problems for you, you may want to try changing your terminal's color theme to have more contrast, or running Create React Native App from a different terminal. You can also manually enter the URL printed by the packager script in the Expo app's search bar to load it manually.

View File

@ -1,5 +1,29 @@
{
"expo": {
"sdkVersion": "20.0.0"
"name": "storybook example",
"slug": "my-app",
"privacy": "public",
"sdkVersion": "32.0.0",
"platforms": [
"ios",
"android"
],
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"splash": {
"image": "./assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"updates": {
"fallbackToCacheTimeout": 0
},
"assetBundlePatterns": [
"**/*"
],
"ios": {
"supportsTablet": true
}
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

View File

@ -0,0 +1,6 @@
module.exports = function(api) {
api.cache(true);
return {
presets: ['babel-preset-expo'],
};
};

View File

@ -1,26 +1,20 @@
{
"name": "react-native-scripts-fixture",
"version": "0.1.0",
"name": "expo-fixture",
"version": "0.0.1",
"private": true,
"main": "./node_modules/react-native-scripts/build/bin/crna-entry.js",
"main": "node_modules/expo/AppEntry.js",
"scripts": {
"android": "react-native-scripts android",
"eject": "react-native-scripts eject",
"ios": "react-native-scripts ios",
"start": "react-native-scripts start",
"test": "node node_modules/jest/bin/jest.js --watch"
},
"jest": {
"preset": "jest-expo"
"start": "expo start",
"android": "expo start --android",
"ios": "expo start --ios",
"eject": "expo eject"
},
"dependencies": {
"expo": "^20.0.0",
"react": "16.0.0-alpha.12",
"react-native": "^0.47.0"
"expo": "^32.0.0",
"react": "16.5.0",
"react-native": "https://github.com/expo/react-native/archive/sdk-32.0.0.tar.gz"
},
"devDependencies": {
"jest-expo": "~20.0.0",
"react-native-scripts": "1.3.1",
"react-test-renderer": "16.0.0-alpha.12"
"babel-preset-expo": "^5.0.0"
}
}

View File

@ -38,8 +38,14 @@ do
cd $dir
echo "Running storybook-cli in $dir"
# run @storybook/cli
../../../bin/index.js init --skip-install
if [ $dir == *"native"* ]
then
# run @storybook/cli
../../../bin/index.js init --skip-install --yes --install-server
else
# run @storybook/cli
../../../bin/index.js init --skip-install --yes
fi
cd ..
done

View File

@ -53,22 +53,22 @@ const getIdFromLegacyQuery = ({ path, selectedKind, selectedStory }) =>
(path && pathToId(path)) || (selectedKind && selectedStory && toId(selectedKind, selectedStory));
export default class StoryStore extends EventEmitter {
constructor({ channel }) {
constructor(params) {
super();
this._legacydata = {};
this._data = {};
this._revision = 0;
this._selection = {};
this._channel = channel;
this._channel = params.channel;
this.on(Events.STORY_INIT, () => {
let storyId = this.getIdOnPath();
if (!storyId) {
const params = qs.parse(document.location.search, { ignoreQueryPrefix: true });
storyId = getIdFromLegacyQuery(params);
const query = qs.parse(document.location.search, { ignoreQueryPrefix: true });
storyId = getIdFromLegacyQuery(query);
if (storyId) {
const { path, selectedKind, selectedStory, ...rest } = params;
const { path, selectedKind, selectedStory, ...rest } = query;
this.setPath(storyId, rest);
}
}
@ -76,6 +76,10 @@ export default class StoryStore extends EventEmitter {
});
}
setChannel = channel => {
this._channel = channel;
};
// NEW apis
getIdOnPath = () => {

View File

@ -27,20 +27,24 @@ const createProps = (api, layout, location, path, storyId, viewMode, selected) =
const PreviewConnected = React.memo(props => (
<Consumer>
{({ state, api }) => (
<Preview
{...props}
{...createProps(
api,
state.layout,
state.location,
state.path,
state.storyId,
state.viewMode,
state.storiesHash[state.storyId]
)}
/>
)}
{({ state, api }) =>
api.renderPreview ? (
api.renderPreview(state, api)
) : (
<Preview
{...props}
{...createProps(
api,
state.layout,
state.location,
state.path,
state.storyId,
state.viewMode,
state.storiesHash[state.storyId]
)}
/>
)
}
</Consumer>
));
PreviewConnected.displayName = 'PreviewConnected';

View File

@ -5,5 +5,9 @@ export default ({ provider, api }) => {
provider.handleAPI(providerAPI);
if (provider.renderPreview) {
providerAPI.renderPreview = provider.renderPreview;
}
return providerAPI;
};

View File

@ -117,10 +117,14 @@ const initStoriesApi = ({
// This doesn't quite have the right order -- it does not group the top-level keys, see #5518
const storiesHashOutOfOrder = Object.values(input).reduce((acc, item) => {
const { kind, parameters } = item;
// FIXME: figure out why parameters is missing when used with react-native-server
const {
hierarchyRootSeparator: rootSeparator,
hierarchySeparator: groupSeparator,
} = parameters.options;
} = (parameters && parameters.options) || {
hierarchyRootSeparator: '/',
hierarchySeparator: '/',
};
const { root, groups } = splitPath(kind, { rootSeparator, groupSeparator });

View File

@ -1,8 +1,4 @@
export default class Provider {
renderPreview() {
throw new Error('Provider.renderPreview() is not implemented!');
}
handleAPI() {
throw new Error('Provider.handleAPI() is not implemented!');
}

View File

@ -0,0 +1,30 @@
#!/bin/bash
# the crna-kitchen-sink app doesn't integrate with the yarn workspace very well.
# to enable 'quick' iteration on app/react-native,
# this script clears the yarn cache of the targballs and regenerate the relevant one.
set -e
rm -rf ~/Library/Caches/Yarn/v4/npm-@storybook**
rm -rf ~/Library/Caches/Yarn/v4/.tmp
cd app/react-native
yarn prepare
yarn pack
mv storybook-react-native-v5.1.0-alpha.6.tgz ../../packs/storybook-react-native.tgz
cd ../..
cd lib/client-api
yarn prepare
yarn pack
mv storybook-client-api-v5.1.0-alpha.6.tgz ../../packs/storybook-client-api.tgz
cd ../..
cd addons/ondevice-knobs
yarn prepare
yarn pack
mv storybook-addon-ondevice-knobs-v5.1.0-alpha.6.tgz ../../packs/storybook-ondevice-knobs.tgz
cd ../..
yarn
cd examples-native/crna-kitchen-sink
rm yarn.lock && rm -rf node_modules && yarn install

289
yarn.lock
View File

@ -2541,6 +2541,15 @@
"@webassemblyjs/helper-wasm-bytecode" "1.7.11"
"@webassemblyjs/wast-parser" "1.7.11"
"@webassemblyjs/ast@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.3.tgz#63a741bd715a6b6783f2ea5c6ab707516aa215eb"
integrity sha512-xy3m06+Iu4D32+6soz6zLnwznigXJRuFNTovBX2M4GqVqLb0dnyWLbPnpcXvUSdEN+9DVyDeaq2jyH1eIL2LZQ==
dependencies:
"@webassemblyjs/helper-module-context" "1.8.3"
"@webassemblyjs/helper-wasm-bytecode" "1.8.3"
"@webassemblyjs/wast-parser" "1.8.3"
"@webassemblyjs/ast@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359"
@ -2554,6 +2563,11 @@
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313"
"@webassemblyjs/floating-point-hex-parser@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.3.tgz#f198a2d203b3c50846a064f5addd6a133ef9bc0e"
integrity sha512-vq1TISG4sts4f0lDwMUM0f3kpe0on+G3YyV5P0IySHFeaLKRYZ++n2fCFfG4TcCMYkqFeTUYFxm75L3ddlk2xA==
"@webassemblyjs/floating-point-hex-parser@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721"
@ -2563,6 +2577,11 @@
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a"
"@webassemblyjs/helper-api-error@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.3.tgz#3b708f6926accd64dcbaa7ba5b63db5660ff4f66"
integrity sha512-BmWEynI4FnZbjk8CaYZXwcv9a6gIiu+rllRRouQUo73hglanXD3AGFJE7Q4JZCoVE0p5/jeX6kf5eKa3D4JxwQ==
"@webassemblyjs/helper-api-error@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7"
@ -2572,6 +2591,11 @@
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b"
"@webassemblyjs/helper-buffer@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.3.tgz#f3150a23ffaba68621e1f094c8a14bebfd53dd48"
integrity sha512-iVIMhWnNHoFB94+/2l7LpswfCsXeMRnWfExKtqsZ/E2NxZyUx9nTeKK/MEMKTQNEpyfznIUX06OchBHQ+VKi/Q==
"@webassemblyjs/helper-buffer@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204"
@ -2584,6 +2608,13 @@
dependencies:
"@webassemblyjs/wast-printer" "1.7.11"
"@webassemblyjs/helper-code-frame@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.3.tgz#f43ac605789b519d95784ef350fd2968aebdd3ef"
integrity sha512-K1UxoJML7GKr1QXR+BG7eXqQkvu+eEeTjlSl5wUFQ6W6vaOc5OwSxTcb3oE9x/3+w4NHhrIKD4JXXCZmLdL2cg==
dependencies:
"@webassemblyjs/wast-printer" "1.8.3"
"@webassemblyjs/helper-code-frame@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e"
@ -2595,6 +2626,11 @@
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181"
"@webassemblyjs/helper-fsm@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.3.tgz#46aaa03f41082a916850ebcb97e9fc198ef36a9c"
integrity sha512-387zipfrGyO77/qm7/SDUiZBjQ5KGk4qkrVIyuoubmRNIiqn3g+6ijY8BhnlGqsCCQX5bYKOnttJobT5xoyviA==
"@webassemblyjs/helper-fsm@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452"
@ -2604,6 +2640,14 @@
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209"
"@webassemblyjs/helper-module-context@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.3.tgz#150da405d90c8ea81ae0b0e1965b7b64e585634f"
integrity sha512-lPLFdQfaRssfnGEJit5Sk785kbBPPPK4ZS6rR5W/8hlUO/5v3F+rN8XuUcMj/Ny9iZiyKhhuinWGTUuYL4VKeQ==
dependencies:
"@webassemblyjs/ast" "1.8.3"
mamacro "^0.0.3"
"@webassemblyjs/helper-module-context@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245"
@ -2616,6 +2660,11 @@
version "1.7.11"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06"
"@webassemblyjs/helper-wasm-bytecode@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.3.tgz#12f55bbafbbc7ddf9d8059a072cb7b0c17987901"
integrity sha512-R1nJW7bjyJLjsJQR5t3K/9LJ0QWuZezl8fGa49DZq4IVaejgvkbNlKEQxLYTC579zgT4IIIVHb5JA59uBPHXyw==
"@webassemblyjs/helper-wasm-bytecode@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61"
@ -2631,6 +2680,16 @@
"@webassemblyjs/helper-wasm-bytecode" "1.7.11"
"@webassemblyjs/wasm-gen" "1.7.11"
"@webassemblyjs/helper-wasm-section@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.3.tgz#9e79456d9719e116f4f8998ee62ab54ba69a6cf3"
integrity sha512-P6F7D61SJY73Yz+fs49Q3+OzlYAZP86OfSpaSY448KzUy65NdfzDmo2NPVte+Rw4562MxEAacvq/mnDuvRWOcg==
dependencies:
"@webassemblyjs/ast" "1.8.3"
"@webassemblyjs/helper-buffer" "1.8.3"
"@webassemblyjs/helper-wasm-bytecode" "1.8.3"
"@webassemblyjs/wasm-gen" "1.8.3"
"@webassemblyjs/helper-wasm-section@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf"
@ -2648,6 +2707,13 @@
dependencies:
"@xtuc/ieee754" "^1.2.0"
"@webassemblyjs/ieee754@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.3.tgz#0a89355b1f6c9d08d0605c2acbc2a6fe3141f5b4"
integrity sha512-UD4HuLU99hjIvWz1pD68b52qsepWQlYCxDYVFJQfHh3BHyeAyAlBJ+QzLR1nnS5J6hAzjki3I3AoJeobNNSZlg==
dependencies:
"@xtuc/ieee754" "^1.2.0"
"@webassemblyjs/ieee754@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e"
@ -2662,6 +2728,13 @@
dependencies:
"@xtuc/long" "4.2.1"
"@webassemblyjs/leb128@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.3.tgz#b7fd9d7c039e34e375c4473bd4dc89ce8228b920"
integrity sha512-XXd3s1BmkC1gpGABuCRLqCGOD6D2L+Ma2BpwpjrQEHeQATKWAQtxAyU9Z14/z8Ryx6IG+L4/NDkIGHrccEhRUg==
dependencies:
"@xtuc/long" "4.2.2"
"@webassemblyjs/leb128@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10"
@ -2674,6 +2747,11 @@
resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82"
integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==
"@webassemblyjs/utf8@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.3.tgz#75712db52cfdda868731569ddfe11046f1f1e7a2"
integrity sha512-Wv/WH9Zo5h5ZMyfCNpUrjFsLZ3X1amdfEuwdb7MLdG3cPAjRS6yc6ElULlpjLiiBTuzvmLhr3ENsuGyJ3wyCgg==
"@webassemblyjs/utf8@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc"
@ -2693,6 +2771,20 @@
"@webassemblyjs/wasm-parser" "1.7.11"
"@webassemblyjs/wast-printer" "1.7.11"
"@webassemblyjs/wasm-edit@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.3.tgz#23c3c6206b096f9f6aa49623a5310a102ef0fb87"
integrity sha512-nB19eUx3Yhi1Vvv3yev5r+bqQixZprMtaoCs1brg9Efyl8Hto3tGaUoZ0Yb4Umn/gQCyoEGFfUxPLp1/8+Jvnw==
dependencies:
"@webassemblyjs/ast" "1.8.3"
"@webassemblyjs/helper-buffer" "1.8.3"
"@webassemblyjs/helper-wasm-bytecode" "1.8.3"
"@webassemblyjs/helper-wasm-section" "1.8.3"
"@webassemblyjs/wasm-gen" "1.8.3"
"@webassemblyjs/wasm-opt" "1.8.3"
"@webassemblyjs/wasm-parser" "1.8.3"
"@webassemblyjs/wast-printer" "1.8.3"
"@webassemblyjs/wasm-edit@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a"
@ -2718,6 +2810,17 @@
"@webassemblyjs/leb128" "1.7.11"
"@webassemblyjs/utf8" "1.7.11"
"@webassemblyjs/wasm-gen@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.3.tgz#1a433b8ab97e074e6ac2e25fcbc8cb6125400813"
integrity sha512-sDNmu2nLBJZ/huSzlJvd9IK8B1EjCsOl7VeMV9VJPmxKYgTJ47lbkSP+KAXMgZWGcArxmcrznqm7FrAPQ7vVGg==
dependencies:
"@webassemblyjs/ast" "1.8.3"
"@webassemblyjs/helper-wasm-bytecode" "1.8.3"
"@webassemblyjs/ieee754" "1.8.3"
"@webassemblyjs/leb128" "1.8.3"
"@webassemblyjs/utf8" "1.8.3"
"@webassemblyjs/wasm-gen@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc"
@ -2739,6 +2842,16 @@
"@webassemblyjs/wasm-gen" "1.7.11"
"@webassemblyjs/wasm-parser" "1.7.11"
"@webassemblyjs/wasm-opt@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.3.tgz#54754bcf88f88e92b909416a91125301cc81419c"
integrity sha512-j8lmQVFR+FR4/645VNgV4R/Jz8i50eaPAj93GZyd3EIJondVshE/D9pivpSDIXyaZt+IkCodlzOoZUE4LnQbeA==
dependencies:
"@webassemblyjs/ast" "1.8.3"
"@webassemblyjs/helper-buffer" "1.8.3"
"@webassemblyjs/wasm-gen" "1.8.3"
"@webassemblyjs/wasm-parser" "1.8.3"
"@webassemblyjs/wasm-opt@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264"
@ -2761,6 +2874,18 @@
"@webassemblyjs/leb128" "1.7.11"
"@webassemblyjs/utf8" "1.7.11"
"@webassemblyjs/wasm-parser@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.3.tgz#d12ed19d1b8e8667a7bee040d2245aaaf215340b"
integrity sha512-NBI3SNNtRoy4T/KBsRZCAWUzE9lI94RH2nneLwa1KKIrt/2zzcTavWg6oY05ArCbb/PZDk3OUi63CD1RYtN65w==
dependencies:
"@webassemblyjs/ast" "1.8.3"
"@webassemblyjs/helper-api-error" "1.8.3"
"@webassemblyjs/helper-wasm-bytecode" "1.8.3"
"@webassemblyjs/ieee754" "1.8.3"
"@webassemblyjs/leb128" "1.8.3"
"@webassemblyjs/utf8" "1.8.3"
"@webassemblyjs/wasm-parser@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d"
@ -2785,6 +2910,18 @@
"@webassemblyjs/helper-fsm" "1.7.11"
"@xtuc/long" "4.2.1"
"@webassemblyjs/wast-parser@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.3.tgz#44aa123e145503e995045dc3e5e2770069da117b"
integrity sha512-gZPst4CNcmGtKC1eYQmgCx6gwQvxk4h/nPjfPBbRoD+Raw3Hs+BS3yhrfgyRKtlYP+BJ8LcY9iFODEQofl2qbg==
dependencies:
"@webassemblyjs/ast" "1.8.3"
"@webassemblyjs/floating-point-hex-parser" "1.8.3"
"@webassemblyjs/helper-api-error" "1.8.3"
"@webassemblyjs/helper-code-frame" "1.8.3"
"@webassemblyjs/helper-fsm" "1.8.3"
"@xtuc/long" "4.2.2"
"@webassemblyjs/wast-parser@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c"
@ -2806,6 +2943,15 @@
"@webassemblyjs/wast-parser" "1.7.11"
"@xtuc/long" "4.2.1"
"@webassemblyjs/wast-printer@1.8.3":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.3.tgz#b1177780b266b1305f2eeba87c4d6aa732352060"
integrity sha512-DTA6kpXuHK4PHu16yAD9QVuT1WZQRT7079oIFFmFSjqjLWGXS909I/7kiLTn931mcj7wGsaUNungjwNQ2lGQ3Q==
dependencies:
"@webassemblyjs/ast" "1.8.3"
"@webassemblyjs/wast-parser" "1.8.3"
"@xtuc/long" "4.2.2"
"@webassemblyjs/wast-printer@1.8.5":
version "1.8.5"
resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc"
@ -3724,15 +3870,6 @@ babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-helper-builder-react-jsx@^6.24.1:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz#39ff8313b75c8b65dceff1f31d383e0ff2a408a0"
integrity sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=
dependencies:
babel-runtime "^6.26.0"
babel-types "^6.26.0"
esutils "^2.0.2"
babel-helper-call-delegate@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d"
@ -4162,27 +4299,17 @@ babel-plugin-require-context-hook@^1.0.0:
resolved "https://registry.yarnpkg.com/babel-plugin-require-context-hook/-/babel-plugin-require-context-hook-1.0.0.tgz#3f0e7cce87c338f53639b948632fd4e73834632d"
integrity sha512-EMZD1563QUqLhzrqcThk759RhuNVX/ZJdrtGK6drwzgvnR+ARjWyXIHPbu+tUNaMGtPz/gQeAM2M6VUw2UiUeA==
babel-plugin-syntax-async-functions@^6.13.0, babel-plugin-syntax-async-functions@^6.8.0:
babel-plugin-syntax-async-functions@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=
babel-plugin-syntax-class-properties@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
integrity sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=
babel-plugin-syntax-exponentiation-operator@^6.8.0:
version "6.13.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=
babel-plugin-syntax-flow@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d"
integrity sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=
babel-plugin-syntax-jsx@^6.18.0, babel-plugin-syntax-jsx@^6.3.13, babel-plugin-syntax-jsx@^6.8.0:
babel-plugin-syntax-jsx@^6.18.0:
version "6.18.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946"
integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=
@ -4211,16 +4338,6 @@ babel-plugin-transform-async-to-generator@^6.22.0:
babel-plugin-syntax-async-functions "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-class-properties@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
integrity sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=
dependencies:
babel-helper-function-name "^6.24.1"
babel-plugin-syntax-class-properties "^6.8.0"
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-plugin-transform-es2015-arrow-functions@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
@ -4420,14 +4537,6 @@ babel-plugin-transform-exponentiation-operator@^6.22.0:
babel-plugin-syntax-exponentiation-operator "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-flow-strip-types@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf"
integrity sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=
dependencies:
babel-plugin-syntax-flow "^6.18.0"
babel-runtime "^6.22.0"
babel-plugin-transform-inline-consecutive-adds@^0.4.3:
version "0.4.3"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz#323d47a3ea63a83a7ac3c811ae8e6941faf2b0d1"
@ -4448,7 +4557,7 @@ babel-plugin-transform-minify-booleans@^6.9.4:
resolved "https://registry.yarnpkg.com/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz#acbb3e56a3555dd23928e4b582d285162dd2b198"
integrity sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg=
babel-plugin-transform-object-rest-spread@^6.23.0, babel-plugin-transform-object-rest-spread@^6.26.0:
babel-plugin-transform-object-rest-spread@^6.26.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz#0f36692d50fef6b7e2d4b3ac1478137a963b7b06"
integrity sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=
@ -4463,44 +4572,12 @@ babel-plugin-transform-property-literals@^6.9.4:
dependencies:
esutils "^2.0.2"
babel-plugin-transform-react-display-name@^6.23.0:
version "6.25.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz#67e2bf1f1e9c93ab08db96792e05392bf2cc28d1"
integrity sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=
dependencies:
babel-runtime "^6.22.0"
babel-plugin-transform-react-jsx-self@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz#df6d80a9da2612a121e6ddd7558bcbecf06e636e"
integrity sha1-322AqdomEqEh5t3XVYvL7PBuY24=
dependencies:
babel-plugin-syntax-jsx "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-react-jsx-source@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz#66ac12153f5cd2d17b3c19268f4bf0197f44ecd6"
integrity sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=
dependencies:
babel-plugin-syntax-jsx "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-react-jsx@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz#840a028e7df460dfc3a2d29f0c0d91f6376e66a3"
integrity sha1-hAoCjn30YN/DotKfDA2R9jduZqM=
dependencies:
babel-helper-builder-react-jsx "^6.24.1"
babel-plugin-syntax-jsx "^6.8.0"
babel-runtime "^6.22.0"
babel-plugin-transform-react-remove-prop-types@0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a"
integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==
babel-plugin-transform-regenerator@^6.22.0, babel-plugin-transform-regenerator@^6.26.0:
babel-plugin-transform-regenerator@^6.22.0:
version "6.26.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f"
integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=
@ -4529,7 +4606,7 @@ babel-plugin-transform-remove-undefined@^0.5.0:
dependencies:
babel-helper-evaluate-path "^0.5.0"
babel-plugin-transform-runtime@6.23.0, babel-plugin-transform-runtime@^6.23.0:
babel-plugin-transform-runtime@6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee"
integrity sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=
@ -4639,13 +4716,6 @@ babel-preset-fbjs@^3.0.0, babel-preset-fbjs@^3.0.1:
"@babel/plugin-transform-template-literals" "^7.0.0"
babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0"
babel-preset-flow@^6.23.0:
version "6.23.0"
resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d"
integrity sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=
dependencies:
babel-plugin-transform-flow-strip-types "^6.22.0"
babel-preset-jest@^23.2.0:
version "23.2.0"
resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz#8ec7a03a138f001a1a8fb1e8113652bf1a55da46"
@ -4716,18 +4786,6 @@ babel-preset-react-app@^7.0.1, babel-preset-react-app@^7.0.2:
babel-plugin-macros "2.5.0"
babel-plugin-transform-react-remove-prop-types "0.4.24"
babel-preset-react@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-preset-react/-/babel-preset-react-6.24.1.tgz#ba69dfaea45fc3ec639b6a4ecea6e17702c91380"
integrity sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=
dependencies:
babel-plugin-syntax-jsx "^6.3.13"
babel-plugin-transform-react-display-name "^6.23.0"
babel-plugin-transform-react-jsx "^6.24.1"
babel-plugin-transform-react-jsx-self "^6.22.0"
babel-plugin-transform-react-jsx-source "^6.22.0"
babel-preset-flow "^6.23.0"
babel-preset-vue@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/babel-preset-vue/-/babel-preset-vue-2.0.2.tgz#cfadf1bd736125397481b5f8525ced0049a0c71f"
@ -18673,7 +18731,7 @@ react-docgen@^3.0.0:
node-dir "^0.1.10"
recast "^0.16.0"
react-dom@^16.8.3:
react-dom@^16.6.0, react-dom@^16.8.3:
version "16.8.3"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.3.tgz#ae236029e66210783ac81999d3015dfc475b9c32"
integrity sha512-ttMem9yJL4/lpItZAQ2NTFAbV7frotHk5DZEHXUOws2rMmrsvh1Na7ThGT0dTzUIl6pqTOi5tYREfL8AEna3lA==
@ -18805,7 +18863,7 @@ react-native-simple-markdown@^1.1.0:
lodash "^4.15.0"
simple-markdown "git://github.com/CharlesMangwa/simple-markdown.git"
react-native-swipe-gestures@^1.0.2:
react-native-swipe-gestures@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/react-native-swipe-gestures/-/react-native-swipe-gestures-1.0.3.tgz#4160f8d459627323f3a3d2770af4bcd82fd054f5"
integrity sha512-KOouRzPB2fHFjVombsSdRfYo8SFeNVa4Ho4B5il87DuuF26sPNOtb3je+qaT/xVptedOsCzRPJGbWFMsaBApgg==
@ -19042,7 +19100,7 @@ react-transition-group@^2.2.1:
prop-types "^15.6.2"
react-lifecycles-compat "^3.0.4"
react@^16.8.4:
react@^16.6.0, react@^16.8.4:
version "16.8.4"
resolved "https://registry.yarnpkg.com/react/-/react-16.8.4.tgz#fdf7bd9ae53f03a9c4cd1a371432c206be1c4768"
integrity sha512-0GQ6gFXfUH7aZcjGVymlPOASTuSjlQL4ZtVC5YKH+3JL6bBLCVO21DknzmaPlI90LN253ojj02nsapy+j7wIjg==
@ -20086,6 +20144,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1:
hash-base "^3.0.0"
inherits "^2.0.1"
rn-host-detect@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/rn-host-detect/-/rn-host-detect-1.1.5.tgz#fbecb982b73932f34529e97932b9a63e58d8deb6"
integrity sha512-ufk2dFT3QeP9HyZ/xTuMtW27KnFy815CYitJMqQm+pgG3ZAtHBsrU8nXizNKkqXGy3bQmhEoloVbrfbvMJMqkg==
rollup-pluginutils@^2.0.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.4.1.tgz#de43ab54965bbf47843599a7f3adceb723de38db"
@ -22816,7 +22879,7 @@ url-parse-lax@^1.0.0:
dependencies:
prepend-http "^1.0.1"
url-parse@^1.4.3, url-parse@^1.4.4:
url-parse@^1.4.3:
version "1.4.4"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8"
integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==
@ -23483,6 +23546,36 @@ webpack@4.29.0:
watchpack "^1.5.0"
webpack-sources "^1.3.0"
webpack@^4.23.1:
version "4.29.5"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.5.tgz#52b60a7b0838427c3a894cd801a11dc0836bc79f"
integrity sha512-DuWlYUT982c7XVHodrLO9quFbNpVq5FNxLrMUfYUTlgKW0+yPimynYf1kttSQpEneAL1FH3P3OLNgkyImx8qIQ==
dependencies:
"@webassemblyjs/ast" "1.8.3"
"@webassemblyjs/helper-module-context" "1.8.3"
"@webassemblyjs/wasm-edit" "1.8.3"
"@webassemblyjs/wasm-parser" "1.8.3"
acorn "^6.0.5"
acorn-dynamic-import "^4.0.0"
ajv "^6.1.0"
ajv-keywords "^3.1.0"
chrome-trace-event "^1.0.0"
enhanced-resolve "^4.1.0"
eslint-scope "^4.0.0"
json-parse-better-errors "^1.0.2"
loader-runner "^2.3.0"
loader-utils "^1.1.0"
memory-fs "~0.4.1"
micromatch "^3.1.8"
mkdirp "~0.5.0"
neo-async "^2.5.0"
node-libs-browser "^2.0.0"
schema-utils "^1.0.0"
tapable "^1.1.0"
terser-webpack-plugin "^1.1.0"
watchpack "^1.5.0"
webpack-sources "^1.3.0"
webpack@^4.29.6:
version "4.29.6"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.6.tgz#66bf0ec8beee4d469f8b598d3988ff9d8d90e955"
@ -23877,7 +23970,7 @@ ws@^5.2.0:
dependencies:
async-limiter "~1.0.0"
ws@^6.1.0, ws@^6.1.4, ws@~6.1.0:
ws@^6.1.0, ws@~6.1.0:
version "6.1.4"
resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9"
integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==