diff --git a/.circleci/config.yml b/.circleci/config.yml index 35c57f45a..7bb7f4160 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -111,6 +111,7 @@ jobs: paths: - packages/rndom-redbox/lib - packages/rndom-switch/lib + - packages/rndom-slider/lib build_rntester: <<: *container_config diff --git a/.flowconfig b/.flowconfig index f9805d50c..dcef71142 100644 --- a/.flowconfig +++ b/.flowconfig @@ -20,6 +20,7 @@ [include] ./packages/rndom-redbox/ ./packages/rndom-switch/ +./packages/rndom-slider/ ./packages/rnpm-plugin-dom/ [libs] diff --git a/packages/react-native-dom/Libraries/Components/Slider/Slider.dom.js b/packages/react-native-dom/Libraries/Components/Slider/Slider.dom.js index 67a189de7..2a183aa20 100644 --- a/packages/react-native-dom/Libraries/Components/Slider/Slider.dom.js +++ b/packages/react-native-dom/Libraries/Components/Slider/Slider.dom.js @@ -1,15 +1,284 @@ /** * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. * * @providesModule Slider * @flow */ - "use strict"; -module.exports = require("UnimplementedView"); +const Image = require("Image"); +const ColorPropType = require("ColorPropType"); +const NativeMethodsMixin = require("NativeMethodsMixin"); +const ReactNativeViewAttributes = require("ReactNativeViewAttributes"); +const Platform = require("Platform"); +const React = require("React"); +const PropTypes = require("prop-types"); +const StyleSheet = require("StyleSheet"); +const ViewPropTypes = require("ViewPropTypes"); + +const createReactClass = require("create-react-class"); +const requireNativeComponent = require("requireNativeComponent"); + +type Event = Object; + +/** + * A component used to select a single value from a range of values. + * + * ### Usage + * + * The example below shows how to use `Slider` to change + * a value used by `Text`. The value is stored using + * the state of the root component (`App`). The same component + * subscribes to the `onValueChange` of `Slider` and changes + * the value using `setState`. + * + *``` + * import React from 'react'; + * import { StyleSheet, Text, View, Slider } from 'react-native'; + * + * export default class App extends React.Component { + * constructor(props) { + * super(props); + * this.state = { + * value: 50 + * } + * } + * + * change(value) { + * this.setState(() => { + * return { + * value: parseFloat(value) + * }; + * }); + * } + * + * render() { + * const {value} = this.state; + * return ( + * + * {String(value)} + * + * + * ); + * } + * } + * + * const styles = StyleSheet.create({ + * container: { + * flex: 1, + * flexDirection: 'column', + * justifyContent: 'center' + * }, + * text: { + * fontSize: 50, + * textAlign: 'center' + * } + * }); + *``` + * + */ +const Slider = createReactClass({ + displayName: "Slider", + mixins: [NativeMethodsMixin], + + propTypes: { + ...ViewPropTypes, + + /** + * Used to style and layout the `Slider`. See `StyleSheet.js` and + * `ViewStylePropTypes.js` for more info. + */ + style: ViewPropTypes.style, + + /** + * Initial value of the slider. The value should be between minimumValue + * and maximumValue, which default to 0 and 1 respectively. + * Default value is 0. + * + * *This is not a controlled component*, you don't need to update the + * value during dragging. + */ + value: PropTypes.number, + + /** + * Step value of the slider. The value should be + * between 0 and (maximumValue - minimumValue). + * Default value is 0. + */ + step: PropTypes.number, + + /** + * Initial minimum value of the slider. Default value is 0. + */ + minimumValue: PropTypes.number, + + /** + * Initial maximum value of the slider. Default value is 1. + */ + maximumValue: PropTypes.number, + + /** + * The color used for the track to the left of the button. + * Overrides the default blue gradient image on iOS. + */ + minimumTrackTintColor: ColorPropType, + + /** + * The color used for the track to the right of the button. + * Overrides the default blue gradient image on iOS. + */ + maximumTrackTintColor: ColorPropType, + + /** + * If true the user won't be able to move the slider. + * Default value is false. + */ + disabled: PropTypes.bool, + + /** + * Assigns a single image for the track. Only static images are supported. + * The center pixel of the image will be stretched to fill the track. + * @platform ios + */ + trackImage: Image.propTypes.source, + + /** + * Assigns a minimum track image. Only static images are supported. The + * rightmost pixel of the image will be stretched to fill the track. + * @platform ios + */ + minimumTrackImage: Image.propTypes.source, + + /** + * Assigns a maximum track image. Only static images are supported. The + * leftmost pixel of the image will be stretched to fill the track. + * @platform ios + */ + maximumTrackImage: Image.propTypes.source, + + /** + * Sets an image for the thumb. Only static images are supported. + * @platform ios + */ + thumbImage: Image.propTypes.source, + + /** + * Color of the foreground switch grip. + * @platform android + */ + thumbTintColor: ColorPropType, + + /** + * Callback continuously called while the user is dragging the slider. + */ + onValueChange: PropTypes.func, + + /** + * Callback that is called when the user releases the slider, + * regardless if the value has changed. The current value is passed + * as an argument to the callback handler. + */ + onSlidingComplete: PropTypes.func, + + /** + * Used to locate this view in UI automation tests. + */ + testID: PropTypes.string + }, + + getDefaultProps: function(): any { + return { + disabled: false, + value: 0, + minimumValue: 0, + maximumValue: 1, + step: 0 + }; + }, + + viewConfig: { + uiViewClassName: "RCTSlider", + validAttributes: { + ...ReactNativeViewAttributes.RCTView, + value: true + } + }, + + render: function() { + const { style, onValueChange, onSlidingComplete, ...props } = this.props; + /* $FlowFixMe(>=0.54.0 site=react_native_fb,react_native_oss) This comment + * suppresses an error found when Flow v0.54 was deployed. To see the error + * delete this comment and run Flow. */ + props.style = [styles.slider, style]; + + /* $FlowFixMe(>=0.54.0 site=react_native_fb,react_native_oss) This comment + * suppresses an error found when Flow v0.54 was deployed. To see the error + * delete this comment and run Flow. */ + props.onValueChange = + onValueChange && + ((event: Event) => { + let userEvent = true; + if (Platform.OS === "android") { + // On Android there's a special flag telling us the user is + // dragging the slider. + userEvent = event.nativeEvent.fromUser; + } + onValueChange && userEvent && onValueChange(event.nativeEvent.value); + }); + + /* $FlowFixMe(>=0.54.0 site=react_native_fb,react_native_oss) This comment + * suppresses an error found when Flow v0.54 was deployed. To see the error + * delete this comment and run Flow. */ + props.onChange = props.onValueChange; + + /* $FlowFixMe(>=0.54.0 site=react_native_fb,react_native_oss) This comment + * suppresses an error found when Flow v0.54 was deployed. To see the error + * delete this comment and run Flow. */ + props.onSlidingComplete = + onSlidingComplete && + ((event: Event) => { + onSlidingComplete && onSlidingComplete(event.nativeEvent.value); + }); + + return ( + true} + onResponderTerminationRequest={() => false} + /> + ); + } +}); + +let styles; +if (Platform.OS === "ios" || Platform.OS === "dom") { + styles = StyleSheet.create({ + slider: { + height: 40 + } + }); +} else { + styles = StyleSheet.create({ + slider: {} + }); +} + +let options = {}; +if (Platform.OS === "android") { + options = { + nativeOnly: { + enabled: true + } + }; +} +const RCTSlider = requireNativeComponent("RCTSlider", Slider, options); + +module.exports = Slider; diff --git a/packages/react-native-dom/ReactDom/index.js b/packages/react-native-dom/ReactDom/index.js index 5ce811220..855f50c51 100644 --- a/packages/react-native-dom/ReactDom/index.js +++ b/packages/react-native-dom/ReactDom/index.js @@ -75,6 +75,7 @@ const builtInNativeModules: any[] = [ import("RCTWebSocketModule"), import("RCTAppState"), import("RCTSafeAreaViewManager"), + import("RCTSliderManager"), import("RCTSwitchManager"), import("RCTStatusBarManager"), import("RCTDeviceEventManager"), diff --git a/packages/react-native-dom/ReactDom/views/Slider/RCTSlider.js b/packages/react-native-dom/ReactDom/views/Slider/RCTSlider.js new file mode 100644 index 000000000..1c3ddea01 --- /dev/null +++ b/packages/react-native-dom/ReactDom/views/Slider/RCTSlider.js @@ -0,0 +1,128 @@ +/** + * @providesModule RCTSlider + * @flow + */ + +import type { Frame } from "InternalLib"; +import RCTView from "RCTView"; +import type RCTBridge from "RCTBridge"; +import CustomElement from "CustomElement"; +import ColorArrayFromHexARGB from "ColorArrayFromHexARGB"; +import Slider from "rndom-slider"; + +@CustomElement("rct-slider") +class RCTSlider extends RCTView { + bridge: RCTBridge; + onValueChange: ?(payload: { value: boolean }) => void; + onSlidingComplete: ?(payload: { value: boolean }) => void; + childShadowRoot: ShadowRoot; + platformSlider: Slider; + + constructor(bridge: RCTBridge) { + super(bridge); + + this.style.contain = "size layout style"; + + this.platformSlider = new Slider(); + this.platformSlider.addEventListener( + "valueChange", + this.handleValueChange.bind(this) + ); + this.platformSlider.addEventListener( + "slidingComplete", + this.handleSlidingComplete.bind(this) + ); + + this.childShadowRoot = this.childContainer.attachShadow({ mode: "open" }); + this.childShadowRoot.appendChild(this.platformSlider); + } + + handleValueChange(event: { + preventDefault: Function, + detail: { value: boolean } + }) { + const { + detail: { value } + } = event; + event.preventDefault(); + if (this.onValueChange) { + this.onValueChange({ value }); + } + } + + handleSlidingComplete(event: { + preventDefault: Function, + detail: { value: boolean } + }) { + const { + detail: { value } + } = event; + event.preventDefault(); + if (this.onSlidingComplete) { + this.onSlidingComplete({ value }); + } + } + + get frame(): Frame { + return super.frame; + } + + set frame(value: Frame) { + super.frame = value; + + const { width, height } = value; + this.platformSlider.width = width; + this.platformSlider.height = height; + } + + set disabled(value: boolean = false) { + super.disabled = value; + this.platformSlider.disabled = value; + } + + set value(value: number = 0) { + this.platformSlider.value = value; + } + + set step(value: number = 0) { + this.platformSlider.step = value; + } + + set trackImage(value: mixed) { + this.platformSlider.trackImage = value; + } + + set minimumTrackImage(value: mixed) { + this.platformSlider.minimumTrackImage = value; + } + + set maximumTrackImage(value: mixed) { + this.platformSlider.maximumTrackImage = value; + } + + set minimumValue(value: number) { + this.platformSlider.minimumValue = value; + } + + set maximumValue(value: number) { + this.platformSlider.maximumValue = value; + } + + set minimumTrackTintColor(value: string) { + this.platformSlider.minimumTrackTintColor = value; + } + + set maximumTrackTintColor(value: string) { + this.platformSlider.maximumTrackTintColor = value; + } + + set thumbImage(value: mixed) { + this.platformSlider.thumbImage = value; + } + + set thumbTintColor(value: string) { + this.platformSlider.thumbTintColor = value; + } +} + +export default RCTSlider; diff --git a/packages/react-native-dom/ReactDom/views/Slider/RCTSliderManager.js b/packages/react-native-dom/ReactDom/views/Slider/RCTSliderManager.js new file mode 100644 index 000000000..44dcbad5f --- /dev/null +++ b/packages/react-native-dom/ReactDom/views/Slider/RCTSliderManager.js @@ -0,0 +1,97 @@ +/** + * @providesModule RCTSliderManager + * @flow + */ + +import RCTBridge, { + RCTFunctionTypeNormal, + RCT_EXPORT_METHOD, + RCT_EXPORT_MODULE +} from "RCTBridge"; +import RCTSlider from "RCTSlider"; +import type UIView from "UIView"; +import _RCTViewManager from "RCTViewManager"; + +module.exports = (async () => { + const RCTViewManager = await _RCTViewManager; + const { RCT_EXPORT_VIEW_PROP, RCT_EXPORT_DIRECT_VIEW_PROPS } = RCTViewManager; + + @RCT_EXPORT_MODULE("RCTSliderManager") + class RCTSliderManager extends RCTViewManager { + view(): UIView { + return new RCTSlider(this.bridge); + } + + @RCT_EXPORT_VIEW_PROP("value", "number") + setValue(view: RCTSlider, value: number) { + view.value = value; + } + + @RCT_EXPORT_VIEW_PROP("step", "number") + setStep(view: RCTSlider, value: number) { + view.step = value; + } + + @RCT_EXPORT_VIEW_PROP("trackImage", "UIImage") + setTrackImage(view: RCTSlider, value: mixed) { + view.trackImage = value; + } + + @RCT_EXPORT_VIEW_PROP("minimumTrackImage", "UIImage") + setMinimumTrackImage(view: RCTSlider, value: mixed) { + view.minimumTrackImage = value; + } + + @RCT_EXPORT_VIEW_PROP("maximumTrackImage", "UIImage") + setMaximumTrackImage(view: RCTSlider, value: mixed) { + view.maximumTrackImage = value; + } + + @RCT_EXPORT_VIEW_PROP("minimumValue", "number") + setMinimumValue(view: RCTSlider, value: number) { + view.minimumValue = value; + } + + @RCT_EXPORT_VIEW_PROP("maximumValue", "number") + setMaximumValue(view: RCTSlider, value: number) { + view.maximumValue = value; + } + + @RCT_EXPORT_VIEW_PROP("minimumTrackTintColor", "color") + setMinimumTrackTintColor(view: RCTSlider, value: string) { + view.minimumTrackTintColor = value; + } + + @RCT_EXPORT_VIEW_PROP("maximumTrackTintColor", "color") + setMaximumTrackTintColor(view: RCTSlider, value: string) { + view.maximumTrackTintColor = value; + } + + @RCT_EXPORT_VIEW_PROP("onValueChange", "RCTBubblingEventBlock") + setOnValueChange(view: RCTSlider, value: Function) { + view.onValueChange = value; + } + + @RCT_EXPORT_VIEW_PROP("onSlidingComplete", "RCTBubblingEventBlock") + setOnSlidingComplete(view: RCTSlider, value: Function) { + view.onSlidingComplete = value; + } + + @RCT_EXPORT_VIEW_PROP("thumbImage", "UIImage") + setThumbImage(view: RCTSlider, value: mixed) { + view.thumbImage = value; + } + + @RCT_EXPORT_VIEW_PROP("disabled", "boolean") + setDisabled(view: RCTSlider, value: boolean) { + view.disabled = value; + } + + @RCT_EXPORT_VIEW_PROP("thumbTintColor", "color") + setThumbTintColor(view: RCTSlider, value: string) { + view.thumbTintColor = value; + } + } + + return RCTSliderManager; +})(); diff --git a/packages/react-native-dom/flow-typed/npm/rndom-slider.js b/packages/react-native-dom/flow-typed/npm/rndom-slider.js new file mode 100644 index 000000000..9b0b0509f --- /dev/null +++ b/packages/react-native-dom/flow-typed/npm/rndom-slider.js @@ -0,0 +1,29 @@ +declare module "rndom-slider" { + declare type RNDomSliderEventListener = { handleEvent: Function } | Function; + + declare class RNDomSlider extends HTMLElement { + disabled: boolean; + value: number; + maximumValue: number; + minimumValue: number; + step: number; + trackImage: mixed; + minimumTrackImage: mixed; + maximumTrackImage: mixed; + minimumTrackTintColor: string; + maximumTrackTintColor: string; + thumbImage: mixed; + thumbTintColor: string; + width: number; + height: number; + + addEventListener( + type: string, + listener: RNDomSliderEventListener, + optionsOrUseCapture?: EventListenerOptionsOrUseCapture + ): void; + } + + declare export default typeof RNDomSlider; + } + \ No newline at end of file diff --git a/packages/react-native-dom/package.json b/packages/react-native-dom/package.json index b6af6907c..6d7a11e1b 100644 --- a/packages/react-native-dom/package.json +++ b/packages/react-native-dom/package.json @@ -72,6 +72,7 @@ "pepjs": "^0.4.3", "resize-observer-polyfill": "^1.5.0", "rndom-redbox": "0.1.1", + "rndom-slider": "0.1.1", "rndom-switch": "0.1.1", "tinycolor2": "^1.4.1", "wait-port": "^0.2.2", diff --git a/packages/rndom-slider/.babelrc b/packages/rndom-slider/.babelrc new file mode 100644 index 000000000..930a0b831 --- /dev/null +++ b/packages/rndom-slider/.babelrc @@ -0,0 +1,19 @@ +{ + "plugins": [ + [ + "babel-plugin-transform-builtin-classes", + { + "globals": ["HTMLElement"] + } + ], + "external-helpers" + ], + "presets": [ + [ + "env", + { + "modules": false + } + ] + ] +} diff --git a/packages/rndom-slider/.gitignore b/packages/rndom-slider/.gitignore new file mode 100644 index 000000000..25b80d3d2 --- /dev/null +++ b/packages/rndom-slider/.gitignore @@ -0,0 +1,6 @@ +.DS_Store +node_modules +public/bundle.* +lib +package-lock.json +yarn.lock \ No newline at end of file diff --git a/packages/rndom-slider/.npmignore b/packages/rndom-slider/.npmignore new file mode 100644 index 000000000..99f9a9589 --- /dev/null +++ b/packages/rndom-slider/.npmignore @@ -0,0 +1 @@ +.babelrc \ No newline at end of file diff --git a/packages/rndom-slider/README.md b/packages/rndom-slider/README.md new file mode 100644 index 000000000..68e5b2bb5 --- /dev/null +++ b/packages/rndom-slider/README.md @@ -0,0 +1 @@ +# React Native DOM Slider diff --git a/packages/rndom-slider/package.json b/packages/rndom-slider/package.json new file mode 100644 index 000000000..37943f1cd --- /dev/null +++ b/packages/rndom-slider/package.json @@ -0,0 +1,39 @@ +{ + "name": "rndom-slider", + "version": "0.1.1", + "license": "MIT", + "author": { + "name": "Vincent Riemer", + "email": "vincentriemer+rndom@gmail.com", + "url": "https://vincentriemer.com" + }, + "files": ["lib"], + "main": "lib/rndom-slider.js", + "module": "lib/rndom-slider.m.js", + "scripts": { + "precompile": "shx rm -rf lib", + "compile": "rollup -c", + "dev": "serve public & rollup -c -w", + "prepublishOnly": "yarn compile", + "start": "serve public", + "test": "shx echo 'no tests written :('" + }, + "devDependencies": { + "babel-core": "^6.26.3", + "babel-plugin-external-helpers": "^6.22.0", + "babel-plugin-transform-builtin-classes": "^0.6.1", + "babel-preset-env": "^1.6.1", + "color": "^3.0.0", + "less": "^3.0.4", + "rollup": "^0.58.1", + "rollup-plugin-babel": "^3.0.4", + "rollup-plugin-buble": "^0.19.2", + "rollup-plugin-commonjs": "^9.1.0", + "rollup-plugin-node-resolve": "^3.0.3", + "rollup-plugin-svelte": "^4.0.0", + "rollup-plugin-uglify": "^3.0.0", + "serve": "^6.5.1", + "svelte": "^2.0.0" + }, + "umd:main": "lib/rndom-slider.umd.js" +} diff --git a/packages/rndom-slider/public/global.css b/packages/rndom-slider/public/global.css new file mode 100644 index 000000000..e695a2647 --- /dev/null +++ b/packages/rndom-slider/public/global.css @@ -0,0 +1,66 @@ +html, +body { + position: relative; + width: 100%; + height: 100%; +} + +body { + color: #333; + margin: 0; + padding: 8px; + box-sizing: border-box; + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, + Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif; +} + +a { + color: rgb(0, 100, 200); + text-decoration: none; +} + +a:hover { + text-decoration: underline; +} + +a:visited { + color: rgb(0, 80, 160); +} + +label { + display: block; +} + +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + padding: 0.4em; + margin: 0 0 0.5em 0; + box-sizing: border-box; + border: 1px solid #ccc; + border-radius: 2px; +} + +input:disabled { + color: #ccc; +} + +input[type="range"] { + height: 0; +} + +button { + background-color: #f4f4f4; + outline: none; +} + +button:active { + background-color: #ddd; +} + +button:focus { + border-color: #666; +} diff --git a/packages/rndom-slider/public/index.html b/packages/rndom-slider/public/index.html new file mode 100644 index 000000000..48184347a --- /dev/null +++ b/packages/rndom-slider/public/index.html @@ -0,0 +1,17 @@ + + + + + + + RNDom Slider + + + + + + + + + + \ No newline at end of file diff --git a/packages/rndom-slider/rollup.config.js b/packages/rndom-slider/rollup.config.js new file mode 100644 index 000000000..3431b79f2 --- /dev/null +++ b/packages/rndom-slider/rollup.config.js @@ -0,0 +1,80 @@ +import svelte from "rollup-plugin-svelte"; +import resolve from "rollup-plugin-node-resolve"; +import commonjs from "rollup-plugin-commonjs"; +import babel from "rollup-plugin-babel"; +import uglify from "rollup-plugin-uglify"; +import less from "less"; + +import pjson from "./package.json"; + +const production = true; //!process.env.ROLLUP_WATCH; + +const baseConfig = { + input: "src/index.svelte", + plugins: [ + svelte({ + // enable run-time checks when not in production + dev: !production, + customElement: true, + preprocess: { + style: ({ filename, content, attributes }) => { + if (attributes.type !== "text/less") { + return null; + } + + return less + .render(content, { + filename, + sourceMap: {} + }) + .then(({ css, map }) => ({ code: css, map })); + } + } + }), + + // If you have external dependencies installed from + // npm, you'll most likely need these plugins. In + // some cases you'll need additional configuration — + // consult the documentation for details: + // https://github.com/rollup/rollup-plugin-commonjs + resolve(), + commonjs(), + + // If we're building for production (npm run build + // instead of npm run dev), transpile and minify + production && babel({ exclude: "node_modules/**" }), + production && uglify() + ] +}; + +const baseOutput = { + sourcemap: true, + name: "RNDomSlider" +}; + +const entryPoints = ["main", "umd:main", "module"]; + +const formats = { + main: "cjs", + "umd:main": "umd", + module: "es" +}; + +const createConfig = (format, file) => ({ + ...baseConfig, + output: { + ...baseOutput, + format, + file + } +}); + +export default entryPoints + .map((entry) => { + const path = pjson[entry]; + if (path) { + return createConfig(formats[entry], path); + } + return null; + }) + .concat([createConfig("iife", "public/bundle.js")]); diff --git a/packages/rndom-slider/src/index.svelte b/packages/rndom-slider/src/index.svelte new file mode 100644 index 000000000..fa499bc22 --- /dev/null +++ b/packages/rndom-slider/src/index.svelte @@ -0,0 +1,238 @@ + + + + + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 4d9928fc3..bb2b9edc3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2281,7 +2281,7 @@ color-convert@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" -color-convert@^1.9.0: +color-convert@^1.9.0, color-convert@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" dependencies: @@ -2297,6 +2297,13 @@ color-string@^0.3.0: dependencies: color-name "^1.0.0" +color-string@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.2.tgz#26e45814bc3c9a7cbd6751648a41434514a773a9" + dependencies: + color-name "^1.0.0" + simple-swizzle "^0.2.2" + color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" @@ -2308,6 +2315,13 @@ color@0.8.x: color-convert "^0.5.0" color-string "^0.3.0" +color@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" + dependencies: + color-convert "^1.9.1" + color-string "^1.5.2" + colornames@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/colornames/-/colornames-0.0.2.tgz#d811fd6c84f59029499a8ac4436202935b92be31" @@ -3201,7 +3215,7 @@ envinfo@^3.0.0: os-name "^2.0.1" which "^1.2.14" -errno@~0.1.7: +errno@^0.1.1, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" dependencies: @@ -4505,6 +4519,10 @@ image-size@^0.6.0: version "0.6.2" resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.6.2.tgz#8ee316d4298b028b965091b673d5f1537adee5b4" +image-size@~0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -4660,6 +4678,10 @@ is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" +is-arrayish@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.1.tgz#c2dfc386abaa0c3e33c48db3fe87059e69065efd" + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" @@ -5541,6 +5563,19 @@ lerna@^2.4.0: write-pkg "^3.1.0" yargs "^8.0.2" +less@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/less/-/less-3.0.4.tgz#d27dcedbac96031c9e7b76f1da1e4b7d83760814" + optionalDependencies: + errno "^0.1.1" + graceful-fs "^4.1.2" + image-size "~0.5.0" + mime "^1.4.1" + mkdirp "^0.5.0" + promise "^7.1.1" + request "^2.83.0" + source-map "~0.6.0" + leven@2.1.0, leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" @@ -6202,7 +6237,7 @@ mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" -mime@^1.2.11, mime@^1.3.4: +mime@^1.2.11, mime@^1.3.4, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" @@ -7406,7 +7441,7 @@ replace-ext@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" -request@2.x.x, request@^2.72.0, request@^2.79.0: +request@2.x.x, request@^2.72.0, request@^2.79.0, request@^2.83.0: version "2.87.0" resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" dependencies: @@ -7849,6 +7884,12 @@ simple-plist@^0.2.1: bplist-parser "0.1.1" plist "2.0.1" +simple-swizzle@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + dependencies: + is-arrayish "^0.3.1" + sinon@^1.9.1: version "1.17.7" resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" @@ -7956,7 +7997,7 @@ source-map@~0.2.0: dependencies: amdefine ">=0.0.4" -source-map@~0.6.1: +source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"