Browse Source

Add android tests

master
Henning Hall 5 years ago
parent
commit
30b3bb3bd8
52 changed files with 12340 additions and 95 deletions
  1. +61
    -0
      .github/workflows/android.yml
  2. +1
    -0
      .watchmanconfig
  3. +1
    -10
      README.md
  4. +2
    -2
      android/build.gradle
  5. +18
    -4
      android/src/main/java/com/henninghall/date_picker/DatePickerManager.java
  6. +12
    -2
      android/src/main/java/com/henninghall/date_picker/PickerView.java
  7. +0
    -2
      android/src/main/java/com/henninghall/date_picker/Style.java
  8. +2
    -2
      android/src/main/java/com/henninghall/date_picker/WheelOrder.java
  9. +7
    -0
      android/src/main/res/layout/datepicker_view.xml
  10. +2
    -2
      examples/detox/android/app/build.gradle
  11. +3
    -0
      examples/detox/android/build.gradle
  12. +1
    -1
      examples/detox/android/settings.gradle
  13. +4
    -2
      examples/detox/e2e/init.js
  14. +1
    -1
      examples/detox/e2e/mocha.opts
  15. +28
    -0
      examples/detox/e2e/tests/24h-mode/hourWheel.spec.js
  16. +49
    -0
      examples/detox/e2e/tests/24h-mode/mode.spec.js
  17. +131
    -0
      examples/detox/e2e/tests/maximumDate.spec.js
  18. +134
    -0
      examples/detox/e2e/tests/minimumDate.spec.js
  19. +34
    -0
      examples/detox/e2e/tests/minuteInterval.spec.js
  20. +49
    -0
      examples/detox/e2e/tests/mode.spec.js
  21. +45
    -0
      examples/detox/e2e/tests/scrollAround.spec.js
  22. +95
    -0
      examples/detox/e2e/tests/wheelOrder.spec.js
  23. +39
    -0
      examples/detox/e2e/utils.js
  24. +1
    -1
      examples/detox/index.android.js
  25. +1
    -1
      examples/detox/index.js
  26. +29
    -19
      examples/detox/ios/example.xcodeproj/project.pbxproj
  27. +29
    -0
      examples/detox/metro.config.js
  28. +23
    -31
      examples/detox/package.json
  29. +84
    -0
      examples/detox/src/App.js
  30. +49
    -0
      examples/detox/src/CustomPropValue.js
  31. +6
    -0
      examples/detox/src/PropButton.js
  32. +64
    -0
      examples/detox/src/PropSlider.js
  33. +6
    -0
      examples/detox/src/exampleKeys.js
  34. +25
    -0
      examples/detox/src/examples.js
  35. +225
    -0
      examples/detox/src/examples/Advanced.js
  36. +14
    -0
      examples/detox/src/examples/DateMode.js
  37. +13
    -0
      examples/detox/src/examples/Minimal.js
  38. +14
    -0
      examples/detox/src/examples/TimeMode.js
  39. +212
    -0
      examples/detox/src/locales.js
  40. +45
    -0
      examples/detox/src/propPickers/DateChange.js
  41. +8
    -0
      examples/detox/src/propPickers/FadeToColor.js
  42. +39
    -0
      examples/detox/src/propPickers/LocalePicker.js
  43. +55
    -0
      examples/detox/src/propPickers/MinMaxDateChange.js
  44. +18
    -0
      examples/detox/src/propPickers/MinuteInterval.js
  45. +18
    -0
      examples/detox/src/propPickers/ModePicker.js
  46. +40
    -0
      examples/detox/src/propPickers/Scroll.js
  47. +8
    -0
      examples/detox/src/propPickers/TextColor.js
  48. +20
    -0
      examples/detox/src/propPickers/TimeZoneOffsetInMinutes.js
  49. +341
    -14
      examples/detox/yarn.lock
  50. +5785
    -0
      package-lock.json
  51. +1
    -1
      package.json
  52. +4448
    -0
      yarn.lock

+ 61
- 0
.github/workflows/android.yml View File

@ -0,0 +1,61 @@
name: "Android: build & test"
on: [push, pull_request]
jobs:
build_and_test:
name: Build & test
runs-on: macos-latest
timeout-minutes: 30
steps:
- name: Checkout
uses: actions/checkout@v1
with:
fetch-depth: 1
- name: Node
uses: actions/setup-node@v1
- name: Use specific Java version for sdkmanager to work
uses: joschi/setup-jdk@v1
with:
java-version: 'openjdk8'
architecture: 'x64'
- name: Download Android Emulator Image
run: |
echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install "system-images;android-29;google_apis;x86"
echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd --force --name emu --device "Nexus 5X" -k 'system-images;android-29;google_apis;x86'
$ANDROID_HOME/emulator/emulator -list-avds
- name: Install npm dependencies
working-directory: ./examples/detox
run: |
yarn install --frozen-lockfile
- name: Build
working-directory: ./examples/detox
run: |
yarn build:android-ci
- name: Start android emulator
working-directory: ./examples/detox
continue-on-error: true
run: |
echo "Starting emulator"
nohup $ANDROID_HOME/emulator/emulator -avd emu -no-audio -no-snapshot -no-window &
$ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82'
$ANDROID_HOME/platform-tools/adb devices
echo "Emulator started"
- name: Run tests
working-directory: ./examples/detox
run: yarn start & yarn test:android-ci
- name: Upload artifacts
uses: actions/upload-artifact@v1
if: failure()
with:
name: Failing tests
path: ./examples/detox/artifacts

+ 1
- 0
.watchmanconfig View File

@ -0,0 +1 @@
{}

+ 1
- 10
README.md View File

@ -1,10 +1,5 @@
# React Native Date Picker [![npm](https://img.shields.io/npm/v/react-native-date-picker.svg)](https://www.npmjs.com/package/react-native-date-picker) <!--[![Build status](https://img.shields.io/bitrise/288d828c2f6731e6/master.svg?token=mGBI2QhCJBx18ffiS-MfpA&label=build)](https://app.bitrise.io/app/288d828c2f6731e6#/builds)--> [![npm](https://img.shields.io/npm/dm/react-native-date-picker.svg)](https://www.npmjs.com/package/react-native-date-picker)
# React Native Date Picker [![npm](https://img.shields.io/npm/v/react-native-date-picker.svg)](https://www.npmjs.com/package/react-native-date-picker) [![Build status](https://img.shields.io/github/workflow/status/henninghall/react-native-date-picker/Android:%20build%20&%20test?label=tests)](https://github.com/henninghall/react-native-date-picker/actions) [![npm](https://img.shields.io/npm/dm/react-native-date-picker.svg)](https://www.npmjs.com/package/react-native-date-picker)
<!--
[![Foo](https://7pjewxutn7.execute-api.us-east-1.amazonaws.com/default/date-picker-badge)](https://app.bitrise.io/app/288d828c2f6731e6#/builds)
[![Foo](https://app.bitrise.io/app/288d828c2f6731e6/status.svg?token=mGBI2QhCJBx18ffiS-MfpA&branch=master)](https://app.bitrise.io/app/288d828c2f6731e6#/builds)
-->
This is a React Native Date Picker with following main features:
@ -13,10 +8,6 @@ This is a React Native Date Picker with following main features:
🌍 Multiple languages<br>
🎨 Customizable<br>
<!--
[![Monthly download](https://img.shields.io/npm/dm/react-native-date-picker.svg)](https://img.shields.io/npm/dm/react-native-date-picker.svg)
[![Total downloads](https://img.shields.io/npm/dt/react-native-date-picker.svg)](https://img.shields.io/npm/dt/react-native-date- picker.svg) -->
<table>
<tr>
<td align="center"><b>iOS</b></td>

+ 2
- 2
android/build.gradle View File

@ -25,7 +25,7 @@ android {
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.facebook.react:react-native:+'
implementation 'com.henninghall.android:NumberPickerView:1.1.1'
implementation 'org.apache.commons:commons-lang3:3.6'
implementation 'com.henninghall.android:NumberPickerView:1.1.2'
implementation 'org.apache.commons:commons-lang3:3.7'
implementation group: 'net.time4j', name: 'time4j-android', version: '4.2-2018i'
}

+ 18
- 4
android/src/main/java/com/henninghall/date_picker/DatePickerManager.java View File

@ -1,9 +1,6 @@
package com.henninghall.date_picker;
import android.content.res.Resources;
import android.util.Log;
import android.util.TypedValue;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext;
@ -19,6 +16,8 @@ import java.util.TimeZone;
public class DatePickerManager extends SimpleViewManager<PickerView> {
public static final String REACT_CLASS = "DatePickerManager";
private static final int SCROLL = 1;
public static ThemedReactContext context;
private String date;
@ -92,6 +91,21 @@ public class DatePickerManager extends SimpleViewManager {
if(index == 0) view.style.setHeight(style);
}
@Override
public Map<String, Integer> getCommandsMap() {
return MapBuilder.of(
"scroll", SCROLL
);
}
public void receiveCommand(final PickerView view, int command, final ReadableArray args) {
if (command == SCROLL) {
int wheelIndex = args.getInt(0);
int scrollTimes = args.getInt(1);
view.scroll(wheelIndex, scrollTimes);
}
}
@Override
protected void onAfterUpdateTransaction(PickerView view) {
super.onAfterUpdateTransaction(view);

+ 12
- 2
android/src/main/java/com/henninghall/date_picker/PickerView.java View File

@ -23,7 +23,6 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
@ -130,7 +129,7 @@ public class PickerView extends RelativeLayout {
}
// Rounding cal to closest minute interval
public Calendar getInitialDate() {
public Calendar getInitialDate() {
Calendar cal = Calendar.getInstance();
if(minuteInterval <= 1) return cal;
int exactMinute = Integer.valueOf(minutesWheel.format.format(cal.getTime()));
@ -232,4 +231,15 @@ public class PickerView extends RelativeLayout {
return new SimpleDateFormat(getFormatPattern(), locale);
}
public void scroll(int wheelIndex, int scrollTimes) {
NumberPickerView picker = wheelOrder.getVisibleWheel(wheelIndex).picker;
int currentIndex = picker.getValue();
int maxValue = picker.getMaxValue();
boolean isWrapping = picker.getWrapSelectorWheel();
int nextValue = currentIndex + scrollTimes;
if(nextValue <= maxValue || isWrapping) {
picker.smoothScrollToValue(nextValue % (maxValue + 1));
}
}
}

+ 0
- 2
android/src/main/java/com/henninghall/date_picker/Style.java View File

@ -2,8 +2,6 @@ package com.henninghall.date_picker;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import com.henninghall.date_picker.wheelFunctions.SetShowCount;
import com.henninghall.date_picker.wheelFunctions.TextColor;

+ 2
- 2
android/src/main/java/com/henninghall/date_picker/WheelOrder.java View File

@ -27,7 +27,7 @@ public class WheelOrder
}};
}
private void updateValueWheels(final Locale locale) {
private void updateAllWheels(final Locale locale) {
try {
this.orderedWheels = getOrderedWheels(locale);
pickerView.wheelsWrapper.removeAllViews();
@ -45,7 +45,7 @@ public class WheelOrder
void update(final Locale locale) {
updateValueWheels(locale);
updateAllWheels(locale);
pickerView.emptyWheelUpdater.update();
}

+ 7
- 0
android/src/main/res/layout/datepicker_view.xml View File

@ -29,6 +29,7 @@
/>
<cn.carbswang.android.numberpickerview.library.NumberPickerView
android:id="@+id/year"
android:tag="year"
android:layout_width="wrap_content"
android:layout_height="match_parent"
custom:npv_ShownCount="5"
@ -58,6 +59,7 @@
/>
<cn.carbswang.android.numberpickerview.library.NumberPickerView
android:id="@+id/month"
android:tag="month"
android:layout_width="wrap_content"
android:layout_height="match_parent"
custom:npv_ShownCount="5"
@ -87,6 +89,7 @@
/>
<cn.carbswang.android.numberpickerview.library.NumberPickerView
android:id="@+id/date"
android:tag="date"
android:layout_width="wrap_content"
android:layout_height="match_parent"
custom:npv_ShownCount="5"
@ -116,6 +119,7 @@
/>
<cn.carbswang.android.numberpickerview.library.NumberPickerView
android:id="@+id/day"
android:tag="day"
android:layout_height="match_parent"
android:layout_width="wrap_content"
custom:npv_ShownCount="5"
@ -130,6 +134,7 @@
/>
<cn.carbswang.android.numberpickerview.library.NumberPickerView
android:id="@+id/hour"
android:tag="hour"
android:layout_height="match_parent"
android:layout_width="wrap_content"
custom:npv_DividerColor="#cccccc"
@ -145,6 +150,7 @@
<cn.carbswang.android.numberpickerview.library.NumberPickerView
android:id="@+id/minutes"
android:tag="minutes"
android:layout_width="wrap_content"
android:layout_height="match_parent"
custom:npv_DividerColor="#cccccc"
@ -160,6 +166,7 @@
<cn.carbswang.android.numberpickerview.library.NumberPickerView
android:id="@+id/ampm"
android:tag="ampm"
android:layout_width="wrap_content"
android:layout_height="match_parent"
custom:npv_DividerColor="#cccccc"

+ 2
- 2
examples/detox/android/app/build.gradle View File

@ -5,8 +5,8 @@ import com.android.build.OutputFile
apply from: "../../node_modules/react-native/react.gradle"
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.detox.rn.example"

+ 3
- 0
examples/detox/android/build.gradle View File

@ -1,5 +1,8 @@
buildscript {
ext.kotlinVersion = '1.3.0'
ext.compileSdkVersion = 28
ext.buildToolsVersion = '28.0.3'
ext.detoxKotlinVersion = ext.kotlinVersion
repositories {

+ 1
- 1
examples/detox/android/settings.gradle View File

@ -1,5 +1,5 @@
rootProject.name = 'DetoxRNExample'
include ':react-native-date-picker'
project(':react-native-date-picker').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-date-picker/android')
project(':react-native-date-picker').projectDir = new File(rootProject.projectDir, '../../../android')
include ':app'

+ 4
- 2
examples/detox/e2e/init.js View File

@ -1,16 +1,18 @@
const detox = require('detox')
const config = require('../package.json').detox
const adapter = require('detox/runners/mocha/adapter')
const { reset } = require("./utils")
before(async () => {
await detox.init(config)
})
beforeEach(async function() {
beforeEach(async function () {
await reset()
await adapter.beforeEach(this)
})
afterEach(async function() {
afterEach(async function () {
await adapter.afterEach(this)
})

+ 1
- 1
examples/detox/e2e/mocha.opts View File

@ -1,4 +1,4 @@
--recursive
--timeout 300000
--bail
--file e2e/init.js
--slow 30000

+ 28
- 0
examples/detox/e2e/tests/24h-mode/hourWheel.spec.js View File

@ -0,0 +1,28 @@
const { scrollWheel, expectDate } = require("../../utils")
describe('Hour wheel', () => {
before(async () => {
await device.reloadReactNative()
await element(by.text('Advanced')).tap()
})
it('should have 24 hours', async () => {
await scroll3HoursAndExpect("2000-01-01 03:00:00")
await scroll3HoursAndExpect("2000-01-01 06:00:00")
await scroll3HoursAndExpect("2000-01-01 09:00:00")
await scroll3HoursAndExpect("2000-01-01 12:00:00")
await scroll3HoursAndExpect("2000-01-01 15:00:00")
await scroll3HoursAndExpect("2000-01-01 18:00:00")
await scroll3HoursAndExpect("2000-01-01 21:00:00")
await scroll3HoursAndExpect("2000-01-01 00:00:00")
})
const scroll3HoursAndExpect = async (date) => {
await scrollWheel(1, 3)
await expectDate(date)
}
})

+ 49
- 0
examples/detox/e2e/tests/24h-mode/mode.spec.js View File

@ -0,0 +1,49 @@
const { setMode } = require("../../utils")
describe('Modes - 24h', () => {
before(async () => {
await device.reloadReactNative()
await element(by.text('Advanced')).tap()
})
it('datetime', async () => {
await setMode("datetime")
await expect(element(by.id('day'))).toBeVisible()
await expect(element(by.id('minutes'))).toBeVisible()
await expect(element(by.id('hour'))).toBeVisible()
await expect(element(by.id('ampm'))).toNotExist()
await expect(element(by.id('month'))).toNotExist()
await expect(element(by.id('date'))).toNotExist()
await expect(element(by.id('year'))).toNotExist()
})
it('date', async () => {
await setMode("date")
await expect(element(by.id('month'))).toBeVisible()
await expect(element(by.id('date'))).toBeVisible()
await expect(element(by.id('year'))).toBeVisible()
await expect(element(by.id('day'))).toNotExist()
await expect(element(by.id('minutes'))).toNotExist()
await expect(element(by.id('hour'))).toNotExist()
await expect(element(by.id('ampm'))).toNotExist()
})
it('time', async () => {
await setMode("time")
await expect(element(by.id('minutes'))).toBeVisible()
await expect(element(by.id('hour'))).toBeVisible()
await expect(element(by.id('ampm'))).toNotExist()
await expect(element(by.id('day'))).toNotExist()
await expect(element(by.id('month'))).toNotExist()
await expect(element(by.id('date'))).toNotExist()
await expect(element(by.id('year'))).toNotExist()
})
})

+ 131
- 0
examples/detox/e2e/tests/maximumDate.spec.js View File

@ -0,0 +1,131 @@
const { scrollWheel, expectDate, setMaximumDate, setMode } = require("../utils")
const initialDate = new Date(2000, 0, 1, 0, 0);
const secondOfJanuary = new Date(2000, 0, 2, 0, 0);
const secondOfJanuary2001 = new Date(2001, 0, 2, 0, 0);
describe('Maximum date', () => {
before(async () => {
await device.reloadReactNative()
await element(by.text('Advanced')).tap()
})
describe('cannot pass max date - datetime mode', () => {
before(async () => {
await setMode("datetime")
await setMaximumDate(initialDate)
})
it('day wheel', async () => {
await scrollWheel(0, 2)
await expectDate("2000-01-01 00:00:00")
})
it('hour wheel', async () => {
await scrollWheel(1, 1)
await expectDate("2000-01-01 00:00:00")
})
it('minute wheel', async () => {
await scrollWheel(2, 1)
await expectDate("2000-01-01 00:00:00")
})
})
describe('cannot pass max date - date mode', () => {
before(async () => {
await setMode("date")
await setMaximumDate(initialDate)
})
it('month wheel', async () => {
await scrollWheel(0, 1)
await expectDate("2000-01-01 00:00:00")
})
it('date wheel', async () => {
await scrollWheel(1, 1)
await expectDate("2000-01-01 00:00:00")
})
it('year wheel', async () => {
await scrollWheel(2, 1)
await expectDate("2000-01-01 00:00:00")
})
})
describe('overshooting max date', () => {
before(async () => {
await setMaximumDate(secondOfJanuary)
})
it('day wheel should not be possible to overshoot since it is not wrapping (no invalid dates exists)', async () => {
await setMode("datetime")
await scrollWheel(0, 1)
await expectDate("2000-01-02 00:00:00")
await scrollWheel(0, 1)
await expectDate("2000-01-02 00:00:00")
})
describe('date mode', () => {
before(async () => {
await setMode("date")
await setMaximumDate(secondOfJanuary)
})
it('overshooting month wheel should set all other wheels to maximum possible date', async () => {
await scrollWheel(0, 1)
await expectDate("2000-01-02 00:00:00")
})
it('overshooting date wheel should reverse to highest possible date', async () => {
await scrollWheel(1, 5)
await expectDate("2000-01-02 00:00:00")
})
it('overshooting year wheel should set all other wheels to maximum possible date', async () => {
await setMaximumDate(secondOfJanuary2001)
await scrollWheel(0, 1) // set month to feb
await scrollWheel(2, 1)
await expectDate("2001-01-02 00:00:00")
})
})
describe('time mode', () => {
before(async () => {
await setMode("time")
await setMaximumDate(initialDate)
})
it('overshooting hour wheel should reverse to highest possible time', async () => {
await scrollWheel(0, 5)
await expectDate("2000-01-01 00:00:00")
})
it('overshooting minute wheel should reverse to highest possible time', async () => {
await scrollWheel(1, 5)
await expectDate("2000-01-01 00:00:00")
})
it('overshooting am/pm wheel should reverse to highest possible time', async () => {
await scrollWheel(2, 1)
await expectDate("2000-01-01 00:00:00")
})
})
})
})

+ 134
- 0
examples/detox/e2e/tests/minimumDate.spec.js View File

@ -0,0 +1,134 @@
const { setDate, scrollWheel, expectDate, setMinimumDate, setMode } = require("../utils")
const oneMinuteBeforeJanuary2 = new Date(2000, 0, 1, 23, 59, 0);
describe('Minimum date', () => {
before(async () => {
await device.reloadReactNative()
await element(by.text('Advanced')).tap()
})
beforeEach(async () => {
await setDate(oneMinuteBeforeJanuary2.toISOString())
})
describe('cannot pass min date - mode: ', () => {
describe('datetime', () => {
before(async () => {
await setMode("datetime")
await setMinimumDate(oneMinuteBeforeJanuary2)
})
it('day wheel', async () => {
await scrollWheel(0, -2)
await expectDate("2000-01-01 23:59:00")
})
it('hour wheel', async () => {
await scrollWheel(1, -1)
await expectDate("2000-01-01 23:59:00")
})
it('minute wheel', async () => {
await scrollWheel(2, -1)
await expectDate("2000-01-01 23:59:00")
})
})
describe('date', () => {
before(async () => {
await setMode("date")
await setMinimumDate(oneMinuteBeforeJanuary2)
})
it('month wheel', async () => {
await scrollWheel(0, -1)
await expectDate("2000-01-01 23:59:00")
})
it('date wheel', async () => {
await scrollWheel(1, -1)
await expectDate("2000-01-01 23:59:00")
})
it('year wheel', async () => {
await scrollWheel(2, -1)
await expectDate("2000-01-01 23:59:00")
})
})
})
describe('overshooting min date - mode:', () => {
before(async () => {
await setMinimumDate(oneMinuteBeforeJanuary2)
})
describe('datetime', () => {
before(async () => {
await setMode("datetime")
})
it('day wheel should not be possible to overshoot since it is not wrapping (no invalid dates exists)', async () => {
await scrollWheel(0, -1)
await expectDate("2000-01-01 23:59:00")
await scrollWheel(0, -1)
await expectDate("2000-01-01 23:59:00")
})
})
describe('date', () => {
before(async () => {
await setMode("date")
})
it('overshooting month wheel should set all other wheels to minimum possible date', async () => {
await scrollWheel(0, -1)
await expectDate("2000-01-01 23:59:00")
})
it('overshooting date wheel should reverse to minimum possible date', async () => {
await scrollWheel(1, -5)
await expectDate("2000-01-01 23:59:00")
})
})
describe('time mode', () => {
before(async () => {
await setMode("time")
await setMinimumDate(oneMinuteBeforeJanuary2)
})
it('overshooting hour wheel should reverse to minimum possible time', async () => {
await scrollWheel(0, -5)
await expectDate("2000-01-01 23:59:00")
})
it('overshooting minute wheel should reverse to minimum possible time', async () => {
await scrollWheel(1, -5)
await expectDate("2000-01-01 23:59:00")
})
it('overshooting am/pm wheel should reverse to minimum possible time', async () => {
await scrollWheel(2, -1)
await expectDate("2000-01-01 23:59:00")
})
})
})
})

+ 34
- 0
examples/detox/e2e/tests/minuteInterval.spec.js View File

@ -0,0 +1,34 @@
const { scrollWheel, expectDate, setMinuteInterval } = require("../utils")
const scrollMinuteWheel = () => scrollWheel(2, 1)
describe('Minute interval', () => {
before(async () => {
await device.reloadReactNative()
await element(by.text('Advanced')).tap()
})
it('1 minute (default)', async () => {
await setMinuteInterval(1)
await scrollMinuteWheel()
await expectDate("2000-01-01 00:01:00")
})
it('5 minutes', async () => {
await setMinuteInterval(5)
await scrollMinuteWheel()
await expectDate("2000-01-01 00:05:00")
})
it('15 minutes', async () => {
await setMinuteInterval(15)
await scrollMinuteWheel()
await expectDate("2000-01-01 00:15:00")
await scrollMinuteWheel()
await expectDate("2000-01-01 00:30:00")
await scrollMinuteWheel()
await expectDate("2000-01-01 00:45:00")
})
})

+ 49
- 0
examples/detox/e2e/tests/mode.spec.js View File

@ -0,0 +1,49 @@
const { setMode } = require("../utils")
describe('Modes', () => {
before(async () => {
await device.reloadReactNative()
await element(by.text('Advanced')).tap()
})
it('datetime', async () => {
await setMode("datetime")
await expect(element(by.id('day'))).toBeVisible()
await expect(element(by.id('minutes'))).toBeVisible()
await expect(element(by.id('hour'))).toBeVisible()
await expect(element(by.id('ampm'))).toBeVisible()
await expect(element(by.id('month'))).toNotExist()
await expect(element(by.id('date'))).toNotExist()
await expect(element(by.id('year'))).toNotExist()
})
it('date', async () => {
await setMode("date")
await expect(element(by.id('month'))).toBeVisible()
await expect(element(by.id('date'))).toBeVisible()
await expect(element(by.id('year'))).toBeVisible()
await expect(element(by.id('day'))).toNotExist()
await expect(element(by.id('minutes'))).toNotExist()
await expect(element(by.id('hour'))).toNotExist()
await expect(element(by.id('ampm'))).toNotExist()
})
it('time', async () => {
await setMode("time")
await expect(element(by.id('minutes'))).toBeVisible()
await expect(element(by.id('hour'))).toBeVisible()
await expect(element(by.id('ampm'))).toBeVisible()
await expect(element(by.id('day'))).toNotExist()
await expect(element(by.id('month'))).toNotExist()
await expect(element(by.id('date'))).toNotExist()
await expect(element(by.id('year'))).toNotExist()
})
})

+ 45
- 0
examples/detox/e2e/tests/scrollAround.spec.js View File

@ -0,0 +1,45 @@
const { scrollWheel, expectDate } = require("../utils")
describe('Scroll around', () => {
before(async () => {
await device.reloadReactNative()
await element(by.text('Advanced')).tap()
})
it.skip('Hour wheel should scroll all way around and switch AM/PM when passing 12', async () => {
await scroll3HoursAndExpect("2000-01-01 03:00:00")
await scroll3HoursAndExpect("2000-01-01 06:00:00")
await scroll3HoursAndExpect("2000-01-01 09:00:00")
await scrollWheel(1, 2)
await expectDate("2000-01-01 11:00:00")
await scrollWheel(1, 2)
await expectDate("2000-01-01 13:00:00")
await scroll3HoursAndExpect("2000-01-01 16:00:00")
await scroll3HoursAndExpect("2000-01-01 19:00:00")
await scroll3HoursAndExpect("2000-01-01 22:00:00")
await scroll3HoursAndExpect("2000-01-01 01:00:00")
})
it('Minute wheel should be possible to scroll all way around', async () => {
await scrollWheel(2, 55)
await expectDate("2000-01-01 00:55:00")
await scrollWheel(2, 10)
await expectDate("2000-01-01 00:05:00")
})
it('Day wheel should change year when passing new year', async () => {
await scrollWheel(0, -1)
await expectDate("1999-12-31 00:00:00")
await scrollWheel(0, 1)
await expectDate("2000-01-01 00:00:00")
})
const scroll3HoursAndExpect = async (date) => {
await scrollWheel(1, 3)
await expectDate(date)
}
})

+ 95
- 0
examples/detox/e2e/tests/wheelOrder.spec.js View File

@ -0,0 +1,95 @@
const { scrollWheelWithIndexAndExpectDate, setMode, setLocale, setMaximumDate } = require("../utils")
describe('Wheel order', () => {
before(async () => {
await device.reloadReactNative()
await element(by.text('Advanced')).tap()
await setMaximumDate("undefined")
})
describe('datetime', () => {
before(async () => {
await setMode("datetime")
})
it('US', async () => {
await setLocale("en-US")
await scrollWheelWithIndexAndExpectDate(0, "2000-01-02 00:00:00")
await scrollWheelWithIndexAndExpectDate(1, "2000-01-01 01:00:00")
await scrollWheelWithIndexAndExpectDate(2, "2000-01-01 00:01:00")
await scrollWheelWithIndexAndExpectDate(3, "2000-01-01 12:00:00")
})
it('Korean', async () => {
await setLocale("ko-KR")
await scrollWheelWithIndexAndExpectDate(0, "2000-01-02 00:00:00")
await scrollWheelWithIndexAndExpectDate(1, "2000-01-01 12:00:00")
await scrollWheelWithIndexAndExpectDate(2, "2000-01-01 01:00:00")
await scrollWheelWithIndexAndExpectDate(3, "2000-01-01 00:01:00")
})
})
describe('date', () => {
before(async () => {
await setMode("date")
})
it('US', async () => {
await setLocale("en-US")
await scrollWheelWithIndexAndExpectDate(0, "2000-02-01 00:00:00")
await scrollWheelWithIndexAndExpectDate(1, "2000-01-02 00:00:00")
await scrollWheelWithIndexAndExpectDate(2, "2001-01-01 00:00:00")
})
it('UK', async () => {
await setLocale("en-GB")
await scrollWheelWithIndexAndExpectDate(0, "2000-01-02 00:00:00")
await scrollWheelWithIndexAndExpectDate(1, "2000-02-01 00:00:00")
await scrollWheelWithIndexAndExpectDate(2, "2001-01-01 00:00:00")
})
it('Korean', async () => {
await setLocale("ko-KR")
await scrollWheelWithIndexAndExpectDate(0, "2001-01-01 00:00:00")
await scrollWheelWithIndexAndExpectDate(1, "2000-02-01 00:00:00")
await scrollWheelWithIndexAndExpectDate(2, "2000-01-02 00:00:00")
})
})
describe('time', () => {
before(async () => {
await setMode("time")
})
it('US', async () => {
await setLocale("en-US")
await scrollWheelWithIndexAndExpectDate(0, "2000-01-01 01:00:00")
await scrollWheelWithIndexAndExpectDate(1, "2000-01-01 00:01:00")
await scrollWheelWithIndexAndExpectDate(2, "2000-01-01 12:00:00")
})
it('UK', async () => {
await setLocale("en-GB")
await scrollWheelWithIndexAndExpectDate(0, "2000-01-01 01:00:00")
await scrollWheelWithIndexAndExpectDate(1, "2000-01-01 00:01:00")
await scrollWheelWithIndexAndExpectDate(2, "2000-01-01 12:00:00")
})
it('Korean', async () => {
await setLocale("ko-KR")
await scrollWheelWithIndexAndExpectDate(0, "2000-01-01 12:00:00")
await scrollWheelWithIndexAndExpectDate(1, "2000-01-01 01:00:00")
await scrollWheelWithIndexAndExpectDate(2, "2000-01-01 00:01:00")
})
})
})

+ 39
- 0
examples/detox/e2e/utils.js View File

@ -0,0 +1,39 @@
const expectDate = async (date) => {
await expect(element(by.id('dateOutput'))).toHaveText(date)
}
const reset = async () => {
await element(by.id('props/scroll')).tap()
await element(by.id('reset')).tap()
}
const scrollWheel = async (index, times) => {
await element(by.id('props/scroll')).tap()
await element(by.id('wheelIndex')).replaceText(`${index}`)
await element(by.id('scrollTimes')).replaceText(`${times}`)
await element(by.id('doScroll')).tap()
}
const changeProp = name => async value => {
await element(by.id('propName')).replaceText(name)
await element(by.id('propValue')).replaceText(`${value}`)
await element(by.id('changeProp')).tap()
}
const scrollWheelWithIndexAndExpectDate = async (index, expectedDate) => {
await scrollWheel(index, 1)
await expectDate(expectedDate)
await reset()
}
exports.setDate = changeProp("date")
exports.setLocale = changeProp("locale")
exports.setMinimumDate = changeProp("minimumDate")
exports.setMaximumDate = changeProp("maximumDate")
exports.setMinuteInterval = changeProp("minuteInterval")
exports.setMode = changeProp("mode")
exports.scrollWheel = scrollWheel
exports.expectDate = expectDate
exports.scrollWheelWithIndexAndExpectDate = scrollWheelWithIndexAndExpectDate
exports.reset = reset

+ 1
- 1
examples/detox/index.android.js View File

@ -1 +1 @@
require('./app')
require('./src/App')

+ 1
- 1
examples/detox/index.js View File

@ -1 +1 @@
require('./app')
require('./src/App')

+ 29
- 19
examples/detox/ios/example.xcodeproj/project.pbxproj View File

@ -5,6 +5,7 @@
};
objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; };
00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; };
@ -20,8 +21,8 @@
13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; };
3953CBBA229AA464005DD98C /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3953CBB9229AA464005DD98C /* JavaScriptCore.framework */; };
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
3A75CD301B1543908E566531 /* libRNDatePicker.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A630BBD6C5F543E09245F95D /* libRNDatePicker.a */; };
832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@ -308,8 +309,8 @@
46EE185A2047463E00FAAB0E /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = "<group>"; };
78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = "<group>"; };
832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = "<group>"; };
E9E57B22E2C74DE5846A9803 /* RNDatePicker.xcodeproj */ = {isa = PBXFileReference; name = "RNDatePicker.xcodeproj"; path = "../node_modules/react-native-date-picker/ios/RNDatePicker.xcodeproj"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; };
A630BBD6C5F543E09245F95D /* libRNDatePicker.a */ = {isa = PBXFileReference; name = "libRNDatePicker.a"; path = "libRNDatePicker.a"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
A630BBD6C5F543E09245F95D /* libRNDatePicker.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNDatePicker.a; sourceTree = "<group>"; };
E9E57B22E2C74DE5846A9803 /* RNDatePicker.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNDatePicker.xcodeproj; path = "../node_modules/react-native-date-picker/ios/RNDatePicker.xcodeproj"; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@ -460,6 +461,14 @@
name = Products;
sourceTree = "<group>";
};
5B8247D323EAED56002A0C87 /* Recovered References */ = {
isa = PBXGroup;
children = (
A630BBD6C5F543E09245F95D /* libRNDatePicker.a */,
);
name = "Recovered References";
sourceTree = "<group>";
};
78C398B11ACF4ADC00677621 /* Products */ = {
isa = PBXGroup;
children = (
@ -505,6 +514,7 @@
832341AE1AAA6A7D00B99B32 /* Libraries */,
00E356EF1AD99517003FC87E /* exampleTests */,
83CBBA001A601CBA00E9B192 /* Products */,
5B8247D323EAED56002A0C87 /* Recovered References */,
);
indentWidth = 2;
sourceTree = "<group>";
@ -944,23 +954,23 @@
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
DEAD_CODE_STRIPPING = NO;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/react-native-date-picker/ios/RNDatePicker",
);
INFOPLIST_FILE = example/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/example\"",
);
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = com.wix.demo.react.native;
PRODUCT_NAME = example;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/example\"",
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/react-native-date-picker/ios/RNDatePicker",
);
};
name = Debug;
};
@ -968,23 +978,23 @@
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/react-native-date-picker/ios/RNDatePicker",
);
INFOPLIST_FILE = example/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 8.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/example\"",
);
OTHER_LDFLAGS = (
"-ObjC",
"-lc++",
);
PRODUCT_BUNDLE_IDENTIFIER = com.wix.demo.react.native;
PRODUCT_NAME = example;
LIBRARY_SEARCH_PATHS = (
"$(inherited)",
"\"$(SRCROOT)/example\"",
);
HEADER_SEARCH_PATHS = (
"$(inherited)",
"$(SRCROOT)/../node_modules/react-native-date-picker/ios/RNDatePicker",
);
};
name = Release;
};

+ 29
- 0
examples/detox/metro.config.js View File

@ -0,0 +1,29 @@
/**
* Metro configuration for React Native
* https://github.com/facebook/react-native
*
* @format
*/
const path = require('path')
const blacklist = require('metro-config/src/defaults/blacklist')
const reactNativeLib = path.resolve(__dirname, '../..')
module.exports = {
watchFolders: [path.resolve(__dirname, 'node_modules'), reactNativeLib],
resolver: {
blacklistRE: blacklist([
new RegExp(`${reactNativeLib}/node_modules/react-native/.*`),
]),
},
transformer: {
getTransformOptions: async () => ({
transform: {
experimentalImportSupport: false,
inlineRequires: false,
},
}),
},
maxWorkers: 2,
}

+ 23
- 31
examples/detox/package.json View File

@ -4,21 +4,23 @@
"private": true,
"scripts": {
"start": "react-native start",
"build:ios": "detox build --configuration ios.sim.debug",
"build:android-debug": "detox build --configuration android.emu.debug",
"build:android-release": "detox build --configuration android.emu.release",
"test:ios": "detox test --configuration ios.sim.debug",
"test:android-debug": "detox test --configuration android.emu.debug -l verbose",
"test:android-release": "detox test --configuration android.emu.release -l verbose",
"test:android-explicit-require": "detox test e2eExplicitRequire -c android.emu.release -l verbose --runner-config e2eExplicitRequire/mocha.opts",
"e2e:ios": "npm run build:ios && npm run test:ios",
"e2e:android-debug": "npm run build:android-debug && npm run test:android-debug",
"e2e:android-release": "npm run build:android-release && npm run test:android-release"
"postinstall": "yarn make-example-runnable",
"make-example-runnable": "(cd ../../ && npm i react react-native --no-save)",
"build:ios": "detox build --configuration ios.debug",
"build:android-debug": "detox build --configuration android.debug",
"build:android-ci": "detox build --configuration android.ci",
"test:ios": "detox test --configuration ios.debug",
"set-time-format": "adb shell settings put system time_12_24",
"test:android-24h-mode": "yarn set-time-format 24 && detox test --configuration android.debug e2e/tests/24h-mode/*.spec.js",
"test:android-24h-mode-ci": "yarn set-time-format 24 && detox test --configuration android.ci e2e/tests/24h-mode/*.spec.js --record-logs failing --record-videos failing --take-screenshots failing",
"test:android-12h-mode": "yarn set-time-format 12 && detox test --configuration android.debug e2e/tests/*.spec.js",
"test:android-12h-mode-ci": "yarn set-time-format 12 && detox test --configuration android.ci e2e/tests/*.spec.js --record-logs failing --record-videos failing --take-screenshots failing",
"test:android": "yarn test:android-12h-mode && yarn test:android-24h-mode",
"test:android-ci": "yarn test:android-12h-mode-ci && yarn test:android-24h-mode-ci"
},
"dependencies": {
"react": "16.8.3",
"react-native": "0.59.9",
"react-native-date-picker": "^2.6.1"
"react-native": "0.59.9"
},
"devDependencies": {
"detox": "^14.0.1",
@ -28,40 +30,30 @@
"test-runner": "mocha",
"runner-config": "e2e/mocha.opts",
"configurations": {
"ios.sim.release": {
"ios.release": {
"binaryPath": "ios/build/Build/Products/Release-iphonesimulator/example.app",
"build": "export RCT_NO_LAUNCH_PACKAGER=true && xcodebuild -project ios/example.xcodeproj -UseNewBuildSystem=NO -scheme example -configuration Release -sdk iphonesimulator -derivedDataPath ios/build -quiet",
"type": "ios.simulator",
"name": "iPhone X"
},
"ios.sim.debug": {
"ios.debug": {
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/example.app",
"build": "xcodebuild -project ios/example.xcodeproj -UseNewBuildSystem=NO -scheme example -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build",
"type": "ios.simulator",
"name": "iPhone X"
},
"ios.none": {
"binaryPath": "ios/build/Build/Products/Debug-iphonesimulator/example.app",
"build": "xcodebuild -project ios/example.xcodeproj -UseNewBuildSystem=NO -scheme example -configuration Debug -sdk iphonesimulator -derivedDataPath ios/build",
"type": "ios.none",
"name": "iPhone X",
"session": {
"server": "ws://localhost:8099",
"sessionId": "com.wix.demo.react.native"
}
},
"android.emu.debug": {
"android.ci": {
"binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk",
"build": "cd android ; ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug ; cd -",
"type": "android.emulator",
"name": "Nexus_4_API_28"
"name": "emu"
},
"android.emu.release": {
"binaryPath": "android/app/build/outputs/apk/release/app-release.apk",
"build": "cd android ; ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release ; cd -",
"android.debug": {
"binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk",
"build": "cd android ; ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug ; cd -",
"type": "android.emulator",
"name": "Nexus_4_API_28"
"name": "Pixel_2_API_29"
}
}
}
}
}

+ 84
- 0
examples/detox/src/App.js View File

@ -0,0 +1,84 @@
import React, { Component } from 'react'
import { ScrollView, AppRegistry, StyleSheet, Text, TouchableOpacity } from 'react-native'
import examples from './examples'
class App extends Component {
state = {
picker: undefined,
backgroundColor: '#ffffff',
}
render() {
return (
<ScrollView
style={[
styles.container,
{ backgroundColor: this.state.backgroundColor },
]}
contentContainerStyle={styles.content}
>
<Text style={styles.header}>{!this.state.picker && 'Examples'}</Text>
{!this.state.picker && this.renderButtons()}
{!!this.state.picker && this.renderBackButton()}
{!!this.state.picker && this.renderPicker()}
</ScrollView>
)
}
setBackgroundColor = backgroundColor => this.setState({ backgroundColor })
renderPicker = () => {
const Picker = examples[this.state.picker].component
return (
<Picker
backgroundColor={this.state.backgroundColor}
setBackground={this.setBackgroundColor}
/>
)
}
renderButtons = () =>
Object.keys(examples)
.filter(key => key !== this.state.picker)
.map(this.renderButton)
renderButton = key => (
<TouchableOpacity
key={key}
onPress={() => this.setState({ picker: key })}
style={{ margin: 10 }}
>
<Text style={styles.text}>{examples[key].buttonTitle}</Text>
</TouchableOpacity>
)
renderBackButton = key => (
<TouchableOpacity
onPress={() => this.setState({ picker: undefined })}
style={{ margin: 10, position: 'absolute', top: 0, left: 10 }}
>
<Text style={styles.text}>Back</Text>
</TouchableOpacity>
)
}
const styles = StyleSheet.create({
container: {
paddingTop: 15,
borderWidth: 1,
},
content: {
alignItems: 'center',
},
text: {
color: 'dodgerblue',
fontSize: 16,
},
header: {
color: 'black',
fontSize: 22,
margin: 20,
},
})
AppRegistry.registerComponent('example', () => App)

+ 49
- 0
examples/detox/src/CustomPropValue.js View File

@ -0,0 +1,49 @@
import React, { useState } from 'react'
import { Button, TextInput, Text, View, TouchableOpacity } from 'react-native'
export default function CustomPropValue(props) {
const [propName, setPropName] = useState("")
const [propValue, setPropValue] = useState("")
const getPropValue = () => {
if (propValue === "undefined") return undefined
if (propName === "minuteInterval") return parseInt(propValue)
if (["date", "maximumDate", "minimumDate"].includes(propName)) return new Date(propValue)
return propValue
}
return (
<View style={{ marginBottom: 15, alignItems: "center" }}>
<View style={{ flexDirection: 'row' }}>
<Text>Prop name</Text>
<TextInput
testID="propName"
style={input}
onChangeText={setPropName}
value={propName}
/>
<Text>Prop value</Text>
<TextInput
testID="propValue"
style={input}
onChangeText={setPropValue}
value={propValue}
/>
</View>
<TouchableOpacity
testID={"changeProp"}
onPress={() => props.changeProp({ propName, propValue: getPropValue() })}
><Text style={{ color: "blue" }}>Change</Text></TouchableOpacity>
</View>
)
}
const input = {
height: 30,
borderColor: 'gray',
borderWidth: 0.5,
margin: 2,
padding: 0,
alignItems: "center",
textAlign: "center"
}

+ 6
- 0
examples/detox/src/PropButton.js View File

@ -0,0 +1,6 @@
import React, { Component } from 'react'
import { Button } from 'react-native'
export const PropButton = ({ title, value, onChange }) => (
<Button title={title} onPress={() => onChange(value)} />
)

+ 64
- 0
examples/detox/src/PropSlider.js View File

@ -0,0 +1,64 @@
import React, { Component } from 'react'
import {
Dimensions,
FlatList,
StyleSheet,
Text,
TouchableOpacity,
} from 'react-native'
const { width, height } = Dimensions.get('screen')
export default class PropSlider extends Component {
render() {
return (
<FlatList
horizontal
style={styles.list}
data={this.data()}
renderItem={this.renderItem}
contentContainerStyle={styles.content}
keyExtractor={item => item.name}
/>
)
}
data = () =>
this.props.data.map(
prop => ((prop.selected = this.props.selectedProp === prop.name), prop)
)
onPress = index => () => this.props.onSelect(this.props.data[index].name)
renderItem = ({ item, index }) => (
<TouchableOpacity
testID={`${this.props.testID}/${item.name}`}
key={item.name}
style={[styles.item, this.getStyle(item)]}
onPress={this.onPress(index)}
>
<Text key={item.name}>{item.name}</Text>
</TouchableOpacity>
)
getStyle = item => ({
backgroundColor: item.selected ? '#82e584' : '#abcdef',
width: this.props.width ? this.props.width : 100,
height: 30,
})
}
const styles = StyleSheet.create({
list: {
width,
},
content: {
padding: 20,
},
item: {
justifyContent: 'center',
alignItems: 'center',
marginHorizontal: 5,
borderRadius: 10,
},
})

+ 6
- 0
examples/detox/src/exampleKeys.js View File

@ -0,0 +1,6 @@
export const EXAMPLE_KEYS = {
MINIMAL: 'MINIMAL',
ADVANCED: 'ADVANCED',
TIME_MODE: 'TIME_MODE',
DATE_MODE: 'DATE_MODE',
}

+ 25
- 0
examples/detox/src/examples.js View File

@ -0,0 +1,25 @@
import React, { Component } from 'react'
import Minimal from './examples/Minimal'
import Advanced from './examples/Advanced'
import TimeMode from './examples/TimeMode'
import { EXAMPLE_KEYS } from './exampleKeys'
import DateMode from './examples/DateMode'
export default {
[EXAMPLE_KEYS.MINIMAL]: {
buttonTitle: 'Minimal',
component: Minimal,
},
[EXAMPLE_KEYS.ADVANCED]: {
buttonTitle: 'Advanced',
component: Advanced,
},
[EXAMPLE_KEYS.TIME_MODE]: {
buttonTitle: 'Time mode',
component: TimeMode,
},
[EXAMPLE_KEYS.DATE_MODE]: {
buttonTitle: 'Date mode',
component: DateMode,
},
}

+ 225
- 0
examples/detox/src/examples/Advanced.js View File

@ -0,0 +1,225 @@
import React, { Component } from 'react'
import { StyleSheet, Text, View, UIManager, findNodeHandle } from 'react-native'
import DatePicker from 'react-native-date-picker'
import DateChange from '../propPickers/DateChange'
import FadeToColor from '../propPickers/FadeToColor'
import LocalePicker from '../propPickers/LocalePicker'
import MinMaxDateChange from '../propPickers/MinMaxDateChange'
import ModePicker from '../propPickers/ModePicker'
import TextColor from '../propPickers/TextColor'
import TimeZoneOffsetInMinutes from '../propPickers/TimeZoneOffsetInMinutes'
import PropSlider from '../PropSlider'
import MinuteInterval from '../propPickers/MinuteInterval'
import Scroll from '../propPickers/Scroll'
import CustomPropValue from '../CustomPropValue'
Date.prototype.addHours = function (h) {
this.setTime(this.getTime() + h * 60 * 60 * 1000)
return this
}
const getInitialDate = () => new Date(2000, 0, 1, 0, 0);
export const defaultMinDate = getInitialDate().addHours(-24 * 5)
export const defaultMaxDate = getInitialDate().addHours(24 * 5)
export const readableUtcDate = date =>
date
? date
.toISOString()
.substr(0, 19)
.replace('T', ' ')
: 'undefined'
export const readableDate = (d) => {
if (!d) return undefined
return `${d.getFullYear()}-${pad2(d.getMonth() + 1)}-${pad2(d.getDate())} ${pad2(d.getHours())}:${pad2(d.getMinutes())}:${pad2(d.getSeconds())}`
}
function pad2(string) {
return (`0${string}`).slice(-2)
}
export default class Advanced extends Component {
state = {
date: getInitialDate(),
searchTerm: '',
textColor: '#000000',
selectedProp: 'mode',
locale: 'en-US',
mode: 'datetime',
minimumDate: defaultMinDate,
maximumDate: defaultMaxDate,
timeZoneOffsetInMinutes: undefined,
minuteInterval: 1,
}
render() {
return (
<View style={styles.container}>
<CustomPropValue
changeProp={({ propName, propValue }) => this.setState({ [propName]: propValue })}
/>
<DatePicker
ref={ref => this.ref = ref}
date={this.state.date}
onDateChange={this.setDate}
locale={this.state.locale}
minuteInterval={this.state.minuteInterval}
minimumDate={this.state.minimumDate}
maximumDate={this.state.maximumDate}
fadeToColor={this.props.backgroundColor}
textColor={this.state.textColor}
mode={this.state.mode}
timeZoneOffsetInMinutes={this.state.timeZoneOffsetInMinutes}
/>
<Text testID={"dateOutput"}>{readableDate(this.state.date)}</Text>
<Text />
<Text>Change prop: </Text>
<Text />
<PropSlider
testID={"props"}
selectedProp={this.state.selectedProp}
onSelect={this.onSelect}
data={this.propertyList()}
/>
<Text>Prop value:</Text>
{this.selectedPropData().component}
</View>
)
}
propertyList = () => [
{
name: 'scroll',
component: (
<Scroll scroll={this.scroll} reset={() => this.setState({ date: getInitialDate() })} />
),
},
{
name: 'mode',
component: (
<ModePicker
selected={this.state.mode}
onChange={mode => this.setState({ mode })}
/>
),
},
{
name: 'locale',
component: (
<LocalePicker
locale={this.state.locale}
onChange={locale => this.setState({ locale })}
/>
),
},
{
name: 'timeZoneOffset',
component: (
<TimeZoneOffsetInMinutes
onChange={timeZoneOffsetInMinutes =>
this.setState({ timeZoneOffsetInMinutes })
}
/>
),
},
{
name: 'date',
component: (
<DateChange
value={this.state.date}
onChange={date => this.setState({ date })}
/>
),
},
{
name: 'minuteInterval',
component: (
<MinuteInterval
value={this.state.minuteInterval}
onChange={minuteInterval => this.setState({ minuteInterval })}
/>
),
},
{
name: 'minDate',
component: (
<MinMaxDateChange
value={this.state.minimumDate}
onChange={minDate => this.setState({ minDate })}
defaultDate={defaultMinDate}
/>
),
},
{
name: 'maxDate',
component: (
<MinMaxDateChange
value={this.state.maximumDate}
onChange={maxDate => this.setState({ maxDate })}
defaultDate={defaultMaxDate}
/>
),
},
{
name: 'fadeToColor',
component: (
<FadeToColor onChange={() => this.props.setBackground(randomColor())} />
),
},
{
name: 'textColor',
component: (
<TextColor
onChange={() => this.setState({ textColor: randomColor() })}
/>
),
},
]
selectedPropData = () => {
return this.propertyList().find(p => p.name === this.state.selectedProp)
}
onSelect = selectedProp => this.setState({ selectedProp })
setDate = date => this.setState({ date })
scroll = ({ wheelIndex, scrollTimes }) => {
if (!this.ref) return
UIManager.dispatchViewManagerCommand(
findNodeHandle(this.ref),
UIManager.getViewManagerConfig("DatePickerManager").Commands.scroll,
[wheelIndex, scrollTimes],
);
}
}
const styles = StyleSheet.create({
container: {
alignItems: 'center',
justifyContent: 'center',
backgroundColor: 'transparent',
flex: 1,
},
item: {
borderWidth: 1,
marginTop: -1,
borderColor: 'rgba(0,0,0,1)',
padding: 3,
width: 100,
alignItems: 'center',
},
})
const randomColor = () =>
'#' + pad(Math.floor(Math.random() * 16777215).toString(16), 6)
function pad(n, width) {
n = n + ''
return n.length >= width ? n : new Array(width - n.length + 1).join('0') + n
}

+ 14
- 0
examples/detox/src/examples/DateMode.js View File

@ -0,0 +1,14 @@
import React, { Component } from 'react'
import DatePicker from 'react-native-date-picker'
export default class DateMode extends Component {
state = { date: new Date() }
render = () => (
<DatePicker
date={this.state.date}
onDateChange={date => this.setState({ date })}
mode={'date'}
/>
)
}

+ 13
- 0
examples/detox/src/examples/Minimal.js View File

@ -0,0 +1,13 @@
import React, { Component } from 'react'
import DatePicker from 'react-native-date-picker'
export default class MinimalExample extends Component {
state = { date: new Date() }
render = () => (
<DatePicker
date={this.state.date}
onDateChange={date => this.setState({ date })}
/>
)
}

+ 14
- 0
examples/detox/src/examples/TimeMode.js View File

@ -0,0 +1,14 @@
import React, { Component } from 'react'
import DatePicker from 'react-native-date-picker'
export default class TimeMode extends Component {
state = { date: new Date() }
render = () => (
<DatePicker
date={this.state.date}
onDateChange={date => this.setState({ date })}
mode={'time'}
/>
)
}

+ 212
- 0
examples/detox/src/locales.js View File

@ -0,0 +1,212 @@
export default [
'af-ZA',
'am-ET',
'ar-AE',
'ar-BH',
'ar-DZ',
'ar-EG',
'ar-IQ',
'ar-JO',
'ar-KW',
'ar-LB',
'ar-LY',
'ar-MA',
'arn-CL',
'ar-OM',
'ar-QA',
'ar-SA',
'ar-SY',
'ar-TN',
'ar-YE',
'as-IN',
'az-Cyrl-AZ',
'az-Latn-AZ',
'ba-RU',
'be-BY',
'bg-BG',
'bn-BD',
'bn-IN',
'bo-CN',
'br-FR',
'bs-Cyrl-BA',
'bs-Latn-BA',
'ca-ES',
'co-FR',
'cs-CZ',
'cy-GB',
'da-DK',
'de-AT',
'de-CH',
'de-DE',
'de-LI',
'de-LU',
'dsb-DE',
'dv-MV',
'el-GR',
'en-029',
'en-AU',
'en-BZ',
'en-CA',
'en-GB',
'en-IE',
'en-IN',
'en-JM',
'en-MY',
'en-NZ',
'en-PH',
'en-SG',
'en-TT',
'en-US',
'en-ZA',
'en-ZW',
'es-AR',
'es-BO',
'es-CL',
'es-CO',
'es-CR',
'es-DO',
'es-EC',
'es-ES',
'es-GT',
'es-HN',
'es-MX',
'es-NI',
'es-PA',
'es-PE',
'es-PR',
'es-PY',
'es-SV',
'es-US',
'es-UY',
'es-VE',
'et-EE',
'eu-ES',
'fa-IR',
'fi-FI',
'fil-PH',
'fo-FO',
'fr-BE',
'fr-CA',
'fr-CH',
'fr-FR',
'fr-LU',
'fr-MC',
'fy-NL',
'ga-IE',
'gd-GB',
'gl-ES',
'gsw-FR',
'gu-IN',
'ha-Latn-NG',
'he-IL',
'hi-IN',
'hr-BA',
'hr-HR',
'hsb-DE',
'hu-HU',
'hy-AM',
'id-ID',
'ig-NG',
'ii-CN',
'is-IS',
'it-CH',
'it-IT',
'iu-Cans-CA',
'iu-Latn-CA',
'ja-JP',
'ka-GE',
'kk-KZ',
'kl-GL',
'km-KH',
'kn-IN',
'kok-IN',
'ko-KR',
'ky-KG',
'lb-LU',
'lo-LA',
'lt-LT',
'lv-LV',
'mi-NZ',
'mk-MK',
'ml-IN',
'mn-MN',
'mn-Mong-CN',
'moh-CA',
'mr-IN',
'ms-BN',
'ms-MY',
'mt-MT',
'nb-NO',
'ne-NP',
'nl-BE',
'nl-NL',
'nn-NO',
'nso-ZA',
'oc-FR',
'or-IN',
'pa-IN',
'pl-PL',
'prs-AF',
'ps-AF',
'pt-BR',
'pt-PT',
'qut-GT',
'quz-BO',
'quz-EC',
'quz-PE',
'rm-CH',
'ro-RO',
'ru-RU',
'rw-RW',
'sah-RU',
'sa-IN',
'se-FI',
'se-NO',
'se-SE',
'si-LK',
'sk-SK',
'sl-SI',
'sma-NO',
'sma-SE',
'smj-NO',
'smj-SE',
'smn-FI',
'sms-FI',
'sq-AL',
'sr-Cyrl-BA',
'sr-Cyrl-CS',
'sr-Cyrl-ME',
'sr-Cyrl-RS',
'sr-Latn-BA',
'sr-Latn-CS',
'sr-Latn-ME',
'sr-Latn-RS',
'sv-FI',
'sv-SE',
'sw-KE',
'syr-SY',
'ta-IN',
'te-IN',
'tg-Cyrl-TJ',
'th-TH',
'tk-TM',
'tn-ZA',
'tr-TR',
'tt-RU',
'tzm-Latn-DZ',
'ug-CN',
'uk-UA',
'ur-PK',
'uz-Cyrl-UZ',
'uz-Latn-UZ',
'vi-VN',
'wo-SN',
'xh-ZA',
'yo-NG',
'zh-CN',
'zh-HK',
'zh-MO',
'zh-SG',
'zh-TW',
'zu-ZA',
]

+ 45
- 0
examples/detox/src/propPickers/DateChange.js View File

@ -0,0 +1,45 @@
import React, { Component } from 'react'
import {
Dimensions,
Button,
View,
StyleSheet,
ScrollView,
Text,
TouchableOpacity,
} from 'react-native'
export default class extends Component {
render() {
return (
<React.Fragment>
<Button
title="Add 1 min"
onPress={() =>
this.props.onChange(
new Date(this.props.value.getTime() + 60 * 1000)
)
}
/>
<Text />
<Button
title="Add 1 hour"
onPress={() =>
this.props.onChange(
new Date(this.props.value.getTime() + 60 * 60 * 1000)
)
}
/>
<Text />
<Button
title="Add 24 hours"
onPress={() =>
this.props.onChange(
new Date(this.props.value.getTime() + 60 * 60 * 24 * 1000)
)
}
/>
</React.Fragment>
)
}
}

+ 8
- 0
examples/detox/src/propPickers/FadeToColor.js View File

@ -0,0 +1,8 @@
import React, { Component } from 'react'
import { Button } from 'react-native'
export default class extends Component {
render() {
return <Button title={'Change color'} onPress={this.props.onChange} />
}
}

+ 39
- 0
examples/detox/src/propPickers/LocalePicker.js View File

@ -0,0 +1,39 @@
import React, { Component } from 'react'
import locales from '../locales'
import PropSlider from '../PropSlider'
const data = locales.map(key => ({ name: key }))
const split1 = Math.floor(data.length / 3)
const split2 = Math.floor((2 * data.length) / 3)
const data1 = data.slice(0, split1)
const data2 = data.slice(split1, split2)
const data3 = data.slice(split2)
export default class LocalPicker extends Component {
render() {
return (
<React.Fragment>
<PropSlider
selectedProp={this.props.locale}
onSelect={this.props.onChange}
data={data1}
width={50}
/>
<PropSlider
selectedProp={this.props.locale}
onSelect={this.props.onChange}
data={data2}
width={50}
/>
<PropSlider
selectedProp={this.props.locale}
onSelect={this.props.onChange}
data={data3}
width={50}
/>
</React.Fragment>
)
}
}

+ 55
- 0
examples/detox/src/propPickers/MinMaxDateChange.js View File

@ -0,0 +1,55 @@
import React, { Component } from 'react'
import { Text, Button, View, StyleSheet } from 'react-native'
import { readableDate } from '../examples/Advanced'
import { PropButton } from '../PropButton'
export default class extends Component {
render() {
const { onChange, defaultDate } = this.props
return (
<React.Fragment>
<Text>{readableDate(this.props.value)}</Text>
<View style={styles.row}>
{this.renderButton('-1 hour', -1)}
{this.renderButton('+1 hour', 1)}
</View>
<View style={styles.row}>
{this.renderButton('-1 day', -24)}
{this.renderButton('+1 day', 24)}
</View>
<View style={styles.row}>
<PropButton
title="Set undefined"
value={undefined}
onChange={onChange}
/>
<PropButton
title="Set default"
value={defaultDate}
onChange={onChange}
/>
</View>
</React.Fragment>
)
}
renderButton = (title, hourDiff) => (
<PropButton
title={title}
onChange={this.props.onChange}
value={
this.props.value &&
new Date(this.props.value.getTime()).addHours(hourDiff)
}
/>
)
}
const styles = StyleSheet.create({
row: {
flexDirection: 'row',
width: 300,
justifyContent: 'space-between',
margin: 5,
},
})

+ 18
- 0
examples/detox/src/propPickers/MinuteInterval.js View File

@ -0,0 +1,18 @@
import React, { Component } from 'react'
import { Button } from 'react-native'
export default class extends Component {
render() {
return (
<React.Fragment>
{[1, 5, 10, 15].map(minutes => (
<Button
key={minutes}
title={minutes + ' min'}
onPress={() => this.props.onChange(minutes)}
/>
))}
</React.Fragment>
)
}
}

+ 18
- 0
examples/detox/src/propPickers/ModePicker.js View File

@ -0,0 +1,18 @@
import React, { Component } from 'react'
import PropSlider from '../PropSlider'
const data = [{ name: 'datetime' }, { name: 'date' }, { name: 'time' }]
export default class extends Component {
render() {
return (
<PropSlider
testID={"mode"}
selectedProp={this.props.selected}
onSelect={this.props.onChange}
data={data}
width={100}
/>
)
}
}

+ 40
- 0
examples/detox/src/propPickers/Scroll.js View File

@ -0,0 +1,40 @@
import React, { useState } from 'react'
import { Button, TextInput, Text, View } from 'react-native'
export default function Scroll(props) {
const [wheelIndex, setWheelIndex] = useState("0")
const [scrollTimes, setScrollTimes] = useState("1")
return (
<View>
<View style={{ flexDirection: "row" }}>
<Text>Wheel index</Text>
<TextInput
testID="wheelIndex"
style={style}
onChangeText={setWheelIndex}
value={wheelIndex}
/>
<Text>Scroll times</Text>
<TextInput
testID="scrollTimes"
style={style}
onChangeText={setScrollTimes}
value={scrollTimes}
/>
</View>
<Button
testID={"doScroll"}
title={`Scroll`}
onPress={() => props.scroll({ wheelIndex: Number.parseInt(wheelIndex), scrollTimes: Number.parseInt(scrollTimes) })}
/>
<Button
testID={"reset"}
title={`Reset`}
onPress={props.reset}
/>
</View>
)
}
const style = { height: 40, borderColor: 'gray', borderWidth: 1 }

+ 8
- 0
examples/detox/src/propPickers/TextColor.js View File

@ -0,0 +1,8 @@
import React, { Component } from 'react'
import { Button } from 'react-native'
export default class extends Component {
render() {
return <Button title={'Change color'} onPress={this.props.onChange} />
}
}

+ 20
- 0
examples/detox/src/propPickers/TimeZoneOffsetInMinutes.js View File

@ -0,0 +1,20 @@
import React, { Component } from 'react'
import { PropButton } from '../PropButton'
export default class extends Component {
render() {
const { onChange } = this.props
return (
<React.Fragment>
<PropButton
title="Set undefined"
value={undefined}
onChange={onChange}
/>
<PropButton title="Set 0" value={0} onChange={onChange} />
<PropButton title="Set 180" value={180} onChange={onChange} />
<PropButton title="Set -180" value={-180} onChange={onChange} />
</React.Fragment>
)
}
}

+ 341
- 14
examples/detox/yarn.lock View File

@ -689,6 +689,11 @@
xcode "^2.0.0"
xmldoc "^0.4.0"
"@yarnpkg/lockfile@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31"
integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==
abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@ -707,6 +712,13 @@ accepts@~1.3.5, accepts@~1.3.7:
mime-types "~2.1.24"
negotiator "0.6.2"
ansi-align@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=
dependencies:
string-width "^2.0.0"
ansi-colors@3.2.3:
version "3.2.3"
resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813"
@ -992,6 +1004,19 @@ bluebird@3.5.x:
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
boxen@^1.2.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b"
integrity sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==
dependencies:
ansi-align "^2.0.0"
camelcase "^4.0.0"
chalk "^2.0.1"
cli-boxes "^1.0.0"
string-width "^2.0.0"
term-size "^1.2.0"
widest-line "^2.0.0"
bplist-creator@0.0.7:
version "0.0.7"
resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.7.tgz#37df1536092824b87c42f957b01344117372ae45"
@ -1118,7 +1143,7 @@ callsites@^2.0.0:
resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50"
integrity sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=
camelcase@^4.1.0:
camelcase@^4.0.0, camelcase@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=
@ -1135,6 +1160,11 @@ capture-exit@^1.2.0:
dependencies:
rsvp "^3.3.3"
capture-stack-trace@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d"
integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==
chalk@^1.1.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@ -1174,6 +1204,16 @@ chownr@^1.1.1:
resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.2.tgz#a18f1e0b269c8a6a5d3c86eb298beb14c3dd7bf6"
integrity sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==
ci-info@^1.5.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497"
integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
class-utils@^0.3.5:
version "0.3.6"
resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
@ -1184,6 +1224,11 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
cli-boxes@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM=
cli-cursor@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5"
@ -1313,6 +1358,18 @@ concat-stream@^1.6.0:
readable-stream "^2.2.2"
typedarray "^0.0.6"
configstore@^3.0.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.2.tgz#c6f25defaeef26df12dd33414b001fe81a543f8f"
integrity sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==
dependencies:
dot-prop "^4.1.0"
graceful-fs "^4.1.2"
make-dir "^1.0.0"
unique-string "^1.0.0"
write-file-atomic "^2.0.0"
xdg-basedir "^3.0.0"
connect@^3.6.5:
version "3.7.0"
resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8"
@ -1370,6 +1427,13 @@ cosmiconfig@^5.0.5:
js-yaml "^3.13.1"
parse-json "^4.0.0"
create-error-class@^3.0.0:
version "3.0.2"
resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=
dependencies:
capture-stack-trace "^1.0.0"
create-react-class@^15.6.3:
version "15.6.3"
resolved "https://registry.yarnpkg.com/create-react-class/-/create-react-class-15.6.3.tgz#2d73237fb3f970ae6ebe011a9e66f46dbca80036"
@ -1396,7 +1460,7 @@ cross-spawn@^5.0.1, cross-spawn@^5.1.0:
shebang-command "^1.2.0"
which "^1.2.9"
cross-spawn@^6.0.0:
cross-spawn@^6.0.0, cross-spawn@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
@ -1407,6 +1471,11 @@ cross-spawn@^6.0.0:
shebang-command "^1.2.0"
which "^1.2.9"
crypto-random-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
debug@2.6.9, debug@^2.2.0, debug@^2.3.3:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@ -1533,6 +1602,13 @@ dom-walk@^0.1.0:
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=
dot-prop@^4.1.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57"
integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==
dependencies:
is-obj "^1.0.0"
dtrace-provider@~0.8:
version "0.8.7"
resolved "https://registry.yarnpkg.com/dtrace-provider/-/dtrace-provider-0.8.7.tgz#dc939b4d3e0620cfe0c1cd803d0d2d7ed04ffd04"
@ -1540,6 +1616,11 @@ dtrace-provider@~0.8:
dependencies:
nan "^2.10.0"
duplexer3@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@ -1898,6 +1979,14 @@ find-up@^2.0.0:
dependencies:
locate-path "^2.0.0"
find-yarn-workspace-root@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db"
integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==
dependencies:
fs-extra "^4.0.3"
micromatch "^3.1.4"
flat@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/flat/-/flat-4.1.0.tgz#090bec8b05e39cba309747f1d588f04dbaf98db2"
@ -1938,7 +2027,7 @@ fs-extra@^1.0.0:
jsonfile "^2.1.0"
klaw "^1.0.0"
fs-extra@^4.0.2:
fs-extra@^4.0.2, fs-extra@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94"
integrity sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==
@ -2095,6 +2184,13 @@ glob@^7.1.1, glob@^7.1.3:
once "^1.3.0"
path-is-absolute "^1.0.0"
global-dirs@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445"
integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=
dependencies:
ini "^1.3.4"
global@^4.3.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
@ -2108,6 +2204,23 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
got@^6.7.1:
version "6.7.1"
resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0"
integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=
dependencies:
create-error-class "^3.0.0"
duplexer3 "^0.1.4"
get-stream "^3.0.0"
is-redirect "^1.0.0"
is-retry-allowed "^1.0.0"
is-stream "^1.0.0"
lowercase-keys "^1.0.0"
safe-buffer "^5.0.1"
timed-out "^4.0.0"
unzip-response "^2.0.1"
url-parse-lax "^1.0.0"
graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
version "4.2.1"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.1.tgz#1c1f0c364882c868f5bff6512146328336a11b1d"
@ -2233,6 +2346,11 @@ import-fresh@^2.0.0:
caller-path "^2.0.0"
resolve-from "^3.0.0"
import-lazy@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
@ -2327,6 +2445,20 @@ is-callable@^1.1.4:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75"
integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==
is-ci@^1.0.10:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c"
integrity sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==
dependencies:
ci-info "^1.5.0"
is-ci@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
dependencies:
ci-info "^2.0.0"
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@ -2417,6 +2549,19 @@ is-glob@^2.0.0, is-glob@^2.0.1:
dependencies:
is-extglob "^1.0.0"
is-installed-globally@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80"
integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=
dependencies:
global-dirs "^0.1.0"
is-path-inside "^1.0.0"
is-npm@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4"
integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ=
is-number@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
@ -2436,6 +2581,18 @@ is-number@^4.0.0:
resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
is-obj@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f"
integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8=
is-path-inside@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036"
integrity sha1-jvW33lBDej/cprToZe96pVy0gDY=
dependencies:
path-is-inside "^1.0.1"
is-plain-object@^2.0.3, is-plain-object@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
@ -2458,6 +2615,11 @@ is-promise@^2.1.0:
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=
is-redirect@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
is-regex@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
@ -2465,7 +2627,12 @@ is-regex@^1.0.4:
dependencies:
has "^1.0.1"
is-stream@^1.0.1, is-stream@^1.1.0:
is-retry-allowed@^1.0.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ=
@ -2645,6 +2812,13 @@ kind-of@^6.0.0, kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051"
integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==
klaw-sync@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
dependencies:
graceful-fs "^4.1.11"
klaw@^1.0.0:
version "1.3.1"
resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439"
@ -2652,6 +2826,13 @@ klaw@^1.0.0:
optionalDependencies:
graceful-fs "^4.1.9"
latest-version@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15"
integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=
dependencies:
package-json "^4.0.0"
lcid@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
@ -2731,6 +2912,11 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1, loose-envify@^1.4
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
lowercase-keys@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
lru-cache@^4.0.1:
version "4.1.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
@ -2746,6 +2932,13 @@ lru-cache@^5.1.1:
dependencies:
yallist "^3.0.2"
make-dir@^1.0.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==
dependencies:
pify "^3.0.0"
make-dir@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@ -3240,7 +3433,7 @@ mocha@^6.1.3:
yargs-parser "13.0.0"
yargs-unparser "1.5.0"
moment@^2.10.6, moment@^2.22.1:
moment@^2.10.6:
version "2.24.0"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
@ -3662,6 +3855,16 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
package-json@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed"
integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=
dependencies:
got "^6.7.1"
registry-auth-token "^3.0.1"
registry-url "^3.0.3"
semver "^5.1.0"
parse-glob@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c"
@ -3702,6 +3905,25 @@ pascalcase@^0.1.1:
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
patch-package@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-6.2.0.tgz#677de858e352b6ca4e6cb48a6efde2cec9fde566"
integrity sha512-HWlQflaBBMjLBfOWomfolF8aqsFDeNbSNro1JDUgYqnVvPM5OILJ9DQdwIRiKmGaOsmHvhkl1FYkvv1I9r2ZJw==
dependencies:
"@yarnpkg/lockfile" "^1.1.0"
chalk "^2.4.2"
cross-spawn "^6.0.5"
find-yarn-workspace-root "^1.2.1"
fs-extra "^7.0.1"
is-ci "^2.0.0"
klaw-sync "^6.0.0"
minimist "^1.2.0"
rimraf "^2.6.3"
semver "^5.6.0"
slash "^2.0.0"
tmp "^0.0.33"
update-notifier "^2.5.0"
path-exists@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
@ -3712,6 +3934,11 @@ path-is-absolute@^1.0.0:
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
path-is-inside@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53"
integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=
path-key@^2.0.0, path-key@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
@ -3734,6 +3961,11 @@ pify@^2.0.0:
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
pify@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
pify@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
@ -3790,6 +4022,11 @@ posix-character-classes@^0.1.0:
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
prepend-http@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
preserve@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
@ -3875,7 +4112,7 @@ range-parser@~1.2.1:
resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
rc@^1.2.7:
rc@^1.0.1, rc@^1.1.6, rc@^1.2.7:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
@ -3908,13 +4145,6 @@ react-is@^16.8.1:
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.9.0.tgz#21ca9561399aad0ff1a7701c01683e8ca981edcb"
integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw==
react-native-date-picker@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/react-native-date-picker/-/react-native-date-picker-2.6.1.tgz#ad322cc12a760ad7a2cabce18928652dd4f8b8f0"
integrity sha512-9FVOMulMs5mWfjWcoEuHotIh5LiJPHvrSUEsHfiYW48kME3GF/nE0DyNg4qDuJFRsZr8mIdiNyLQHQbnhGKZ/Q==
dependencies:
moment "^2.22.1"
react-native@0.59.9:
version "0.59.9"
resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.59.9.tgz#c94ee4fa35121720c05235a2dd6cdd2784bf5177"
@ -4083,6 +4313,21 @@ regexpu-core@^4.5.4:
unicode-match-property-ecmascript "^1.0.4"
unicode-match-property-value-ecmascript "^1.1.0"
registry-auth-token@^3.0.1:
version "3.4.0"
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e"
integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==
dependencies:
rc "^1.1.6"
safe-buffer "^5.0.1"
registry-url@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942"
integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI=
dependencies:
rc "^1.0.1"
regjsgen@^0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd"
@ -4167,6 +4412,13 @@ rimraf@^2.5.4, rimraf@^2.6.1:
dependencies:
glob "^7.1.3"
rimraf@^2.6.3:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
dependencies:
glob "^7.1.3"
rimraf@~2.2.6:
version "2.2.8"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582"
@ -4208,7 +4460,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
safe-buffer@^5.1.2:
safe-buffer@^5.0.1, safe-buffer@^5.1.2:
version "5.2.0"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
@ -4272,6 +4524,13 @@ scheduler@^0.13.3:
loose-envify "^1.1.0"
object-assign "^4.1.1"
semver-diff@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36"
integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=
dependencies:
semver "^5.0.3"
"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0:
version "5.7.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b"
@ -4662,6 +4921,13 @@ tempfile@^2.0.0:
temp-dir "^1.0.0"
uuid "^3.0.1"
term-size@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69"
integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=
dependencies:
execa "^0.7.0"
throat@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
@ -4685,6 +4951,11 @@ time-stamp@^1.0.0:
resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=
timed-out@^4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@ -4810,6 +5081,13 @@ union-value@^1.0.0:
is-extendable "^0.1.1"
set-value "^2.0.1"
unique-string@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a"
integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=
dependencies:
crypto-random-string "^1.0.0"
universalify@^0.1.0:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
@ -4828,11 +5106,39 @@ unset-value@^1.0.0:
has-value "^0.3.1"
isobject "^3.0.0"
unzip-response@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97"
integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=
update-notifier@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6"
integrity sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==
dependencies:
boxen "^1.2.1"
chalk "^2.0.1"
configstore "^3.0.0"
import-lazy "^2.1.0"
is-ci "^1.0.10"
is-installed-globally "^0.1.0"
is-npm "^1.0.0"
latest-version "^3.0.0"
semver-diff "^2.0.0"
xdg-basedir "^3.0.0"
urix@^0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
url-parse-lax@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73"
integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=
dependencies:
prepend-http "^1.0.1"
use@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
@ -4910,6 +5216,13 @@ wide-align@1.1.3, wide-align@^1.1.0:
dependencies:
string-width "^1.0.2 || 2"
widest-line@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc"
integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==
dependencies:
string-width "^2.1.1"
wordwrap@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
@ -4951,6 +5264,15 @@ write-file-atomic@^1.2.0:
imurmurhash "^0.1.4"
slide "^1.1.5"
write-file-atomic@^2.0.0:
version "2.4.3"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481"
integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==
dependencies:
graceful-fs "^4.1.11"
imurmurhash "^0.1.4"
signal-exit "^3.0.2"
ws@^1.1.0, ws@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/ws/-/ws-1.1.5.tgz#cbd9e6e75e09fc5d2c90015f21f0c40875e0dd51"
@ -4976,6 +5298,11 @@ xcode@^2.0.0:
simple-plist "^1.0.0"
uuid "^3.3.2"
xdg-basedir@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4"
integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=
xmlbuilder@^9.0.7:
version "9.0.7"
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"

+ 5785
- 0
package-lock.json
File diff suppressed because it is too large
View File


+ 1
- 1
package.json View File

@ -30,4 +30,4 @@
"devDependencies": {
"prettier": "^1.18.2"
}
}
}

+ 4448
- 0
yarn.lock
File diff suppressed because it is too large
View File


Loading…
Cancel
Save