From c16b2d0ce93df5613187bd5cfa4ff588c62c3361 Mon Sep 17 00:00:00 2001 From: Amogh J Date: Fri, 14 Aug 2020 21:28:04 +0530 Subject: [PATCH 01/69] Setup Intent Android Implemented --- .../stripepayments/StripePaymentsModule.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index db2701b..aac9418 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -21,6 +21,13 @@ import com.stripe.android.model.ConfirmPaymentIntentParams; import com.stripe.android.model.PaymentIntent; import com.stripe.android.model.PaymentMethodCreateParams; +import com.stripe.android.model.SetupIntent; +import com.stripe.android.SetupIntentResult; +import com.stripe.android.model.ConfirmSetupIntentParams; +import com.stripe.android.model.PaymentMethod; +import com.stripe.android.model.PaymentMethod.BillingDetails; + + public class StripePaymentsModule extends ReactContextBaseJavaModule { @@ -135,4 +142,62 @@ public void onError(Exception e) { promise.reject("StripeModule.failed", e.toString()); } } + + @ReactMethod + public void setupCard(String secret, ReadableMap cardParams, final Promise promise) { + PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( + cardParams.getString("number"), + cardParams.getInt("expMonth"), + cardParams.getInt("expYear"), + cardParams.getString("cvc"), + null, + null + ); + PaymentMethod.BillingDetails billingDetails = (new PaymentMethod.BillingDetails.Builder()).setEmail(cardParams.getString("email")).build(); + // PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card); + PaymentMethodCreateParams paymentMethodParams = PaymentMethodCreateParams.create(card, billingDetails); + + ConfirmSetupIntentParams confirmParams = ConfirmSetupIntentParams.create(paymentMethodParams, secret); + + + if (params == null) { + promise.reject("", "StripeModule.invalidSetupIntentParams"); + return; + } + + setupPromise = promise; + stripe = new Stripe( + reactContext, + PaymentConfiguration.getInstance(reactContext).getPublishableKey() + ); + stripe.confirmSetupIntent(this, confirmParams); + + } + + private static final class PaymentResultCallback implements ApiResultCallback { + private final Promise promise; + + PaymentResultCallback(Promise promise) { + this.promise = promise; + } + + @Override + public void onSuccess(SetupIntentResult result) { + SetupIntent setupIntent = result.getIntent(); + SetupIntent.Status status = setupIntent.getStatus(); + + if ( + status == SetupIntent.Status.Succeeded || + status == SetupIntent.Status.Processing + ) { + WritableMap map = Arguments.createMap(); + map.putString("id", setupIntent.getId()); + map.putString("paymentMethodId", setupIntent.getPaymentMethodId()); + promise.resolve(map); + } else if (status == SetupIntentResult.Status.Canceled) { + promise.reject("StripeModule.cancelled", ""); + } else { + promise.reject("StripeModule.failed", status.toString()); + } + } } From 65fc8dfe5ef030095a518500ebb5cd8f37f18638 Mon Sep 17 00:00:00 2001 From: Amogh J Date: Sun, 16 Aug 2020 02:19:14 +0530 Subject: [PATCH 02/69] Bug fixes --- .../stripepayments/StripePaymentsModule.java | 65 -------- .../stripepayments/StripePaymentsPackage.java | 6 +- .../stripepayments/StripeSetupModule.java | 148 ++++++++++++++++++ 3 files changed, 153 insertions(+), 66 deletions(-) create mode 100644 android/src/main/java/com/fitpassu/stripepayments/StripeSetupModule.java diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index aac9418..db2701b 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -21,13 +21,6 @@ import com.stripe.android.model.ConfirmPaymentIntentParams; import com.stripe.android.model.PaymentIntent; import com.stripe.android.model.PaymentMethodCreateParams; -import com.stripe.android.model.SetupIntent; -import com.stripe.android.SetupIntentResult; -import com.stripe.android.model.ConfirmSetupIntentParams; -import com.stripe.android.model.PaymentMethod; -import com.stripe.android.model.PaymentMethod.BillingDetails; - - public class StripePaymentsModule extends ReactContextBaseJavaModule { @@ -142,62 +135,4 @@ public void onError(Exception e) { promise.reject("StripeModule.failed", e.toString()); } } - - @ReactMethod - public void setupCard(String secret, ReadableMap cardParams, final Promise promise) { - PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( - cardParams.getString("number"), - cardParams.getInt("expMonth"), - cardParams.getInt("expYear"), - cardParams.getString("cvc"), - null, - null - ); - PaymentMethod.BillingDetails billingDetails = (new PaymentMethod.BillingDetails.Builder()).setEmail(cardParams.getString("email")).build(); - // PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card); - PaymentMethodCreateParams paymentMethodParams = PaymentMethodCreateParams.create(card, billingDetails); - - ConfirmSetupIntentParams confirmParams = ConfirmSetupIntentParams.create(paymentMethodParams, secret); - - - if (params == null) { - promise.reject("", "StripeModule.invalidSetupIntentParams"); - return; - } - - setupPromise = promise; - stripe = new Stripe( - reactContext, - PaymentConfiguration.getInstance(reactContext).getPublishableKey() - ); - stripe.confirmSetupIntent(this, confirmParams); - - } - - private static final class PaymentResultCallback implements ApiResultCallback { - private final Promise promise; - - PaymentResultCallback(Promise promise) { - this.promise = promise; - } - - @Override - public void onSuccess(SetupIntentResult result) { - SetupIntent setupIntent = result.getIntent(); - SetupIntent.Status status = setupIntent.getStatus(); - - if ( - status == SetupIntent.Status.Succeeded || - status == SetupIntent.Status.Processing - ) { - WritableMap map = Arguments.createMap(); - map.putString("id", setupIntent.getId()); - map.putString("paymentMethodId", setupIntent.getPaymentMethodId()); - promise.resolve(map); - } else if (status == SetupIntentResult.Status.Canceled) { - promise.reject("StripeModule.cancelled", ""); - } else { - promise.reject("StripeModule.failed", status.toString()); - } - } } diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsPackage.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsPackage.java index 4913afc..0b7c5f4 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsPackage.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsPackage.java @@ -3,6 +3,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.ArrayList; import com.facebook.react.ReactPackage; import com.facebook.react.bridge.NativeModule; @@ -12,7 +13,10 @@ public class StripePaymentsPackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { - return Arrays.asList(new StripePaymentsModule(reactContext)); + List modules = new ArrayList<>(); + modules.add(new StripePaymentsModule(reactContext)); + // modules.add(new StripeSetupModule(reactContext)); + return modules; } @Override diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripeSetupModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripeSetupModule.java new file mode 100644 index 0000000..d628073 --- /dev/null +++ b/android/src/main/java/com/fitpassu/stripepayments/StripeSetupModule.java @@ -0,0 +1,148 @@ +package com.fitpassu.stripepayments; + +import android.app.Activity; +import android.content.Intent; + +import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.Promise; +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.bridge.ReactContextBaseJavaModule; +import com.facebook.react.bridge.ReactMethod; +import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.ActivityEventListener; +import com.facebook.react.bridge.BaseActivityEventListener; + +import com.facebook.react.bridge.WritableMap; +import com.stripe.android.ApiResultCallback; +import com.stripe.android.PaymentConfiguration; +// import com.stripe.android.PaymentIntentResult; +import com.stripe.android.Stripe; +import com.stripe.android.model.Card; +// import com.stripe.android.model.ConfirmPaymentIntentParams; +// import com.stripe.android.model.PaymentIntent; +import com.stripe.android.model.PaymentMethodCreateParams; +import com.stripe.android.model.SetupIntent; +import com.stripe.android.SetupIntentResult; +import com.stripe.android.model.ConfirmSetupIntentParams; +import com.stripe.android.model.PaymentMethod; +import com.stripe.android.model.PaymentMethod.BillingDetails; + + + +public class StripeSetupModule extends ReactContextBaseJavaModule { + + private static ReactApplicationContext reactContext; + + private Stripe stripe; + private Promise setupPromise; + + private final ActivityEventListener activityListener = new BaseActivityEventListener() { + + @Override + public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { + if (setupPromise == null || stripe == null) { + super.onActivityResult(activity, requestCode, resultCode, data); + return; + } + boolean handled = stripe.onSetupResult(requestCode, data, new SetupResultCallback(setupPromise)); + if (!handled) { + super.onActivityResult(activity, requestCode, resultCode, data); + } + } + }; + + StripeSetupModule(ReactApplicationContext context) { + super(context); + + context.addActivityEventListener(activityListener); + + reactContext = context; + } + + @Override + public String getName() { + return "StripeSetupModule"; + } + + // @ReactMethod(isBlockingSynchronousMethod = true) + // public void init(String publishableKey) { + // SetupConfiguration.init( + // reactContext, + // publishableKey + // ); + // } + + // @ReactMethod(isBlockingSynchronousMethod = true) + // public boolean isCardValid(ReadableMap cardParams) { + // Card card = new Card.Builder( + // cardParams.getString("number"), + // cardParams.getInt("expMonth"), + // cardParams.getInt("expYear"), + // cardParams.getString("cvc") + // ) + // .build(); + // return card.validateNumber() && card.validateExpiryDate() && card.validateExpMonth() && card.validateCVC(); + // } + + + @ReactMethod + public void setupCard(String secret, ReadableMap cardParams, final Promise promise) { + PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( + cardParams.getString("number"), + cardParams.getInt("expMonth"), + cardParams.getInt("expYear"), + cardParams.getString("cvc"), + null, + null + ); + PaymentMethod.BillingDetails billingDetails = (new PaymentMethod.BillingDetails.Builder()).setEmail(cardParams.getString("email")).build(); + // PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card); + PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card, billingDetails); + + ConfirmSetupIntentParams confirmParams = ConfirmSetupIntentParams.create(params, secret); + + + if (params == null) { + promise.reject("", "StripeModule.invalidSetupIntentParams"); + return; + } + + setupPromise = promise; + stripe = new Stripe( + reactContext, + PaymentConfiguration.getInstance(reactContext).getPublishableKey() + ); + stripe.confirmSetupIntent(getCurrentActivity(), confirmParams); + + } + private static final class SetupResultCallback implements ApiResultCallback { + private final Promise promise; + + SetupResultCallback(Promise promise) { + this.promise = promise; + } + + @Override + public void onSuccess(SetupIntentResult result) { + SetupIntent setupIntent = result.getIntent(); + SetupIntent.Status status = setupIntent.getStatus(); + + if ( + status == SetupIntent.Status.Succeeded || + status == SetupIntent.Status.Processing + ) { + WritableMap map = Arguments.createMap(); + map.putString("id", setupIntent.getId()); + map.putString("paymentMethodId", setupIntent.getPaymentMethodId()); + promise.resolve(map); + } else if (status == SetupIntent.Status.Canceled) { + promise.reject("StripeModule.cancelled", ""); + } else { + promise.reject("StripeModule.failed", status.toString()); + } + } + @Override + public void onError(Exception e) { + promise.reject("StripeModule.failed", e.toString()); + } + }} From 6b81dbda469f2f92bd6697be1eb681d7c1e837ff Mon Sep 17 00:00:00 2001 From: Amogh J Date: Sun, 16 Aug 2020 03:03:47 +0530 Subject: [PATCH 03/69] Setup Intents removed --- .../stripepayments/StripePaymentsModule.java | 75 ++++++++- .../stripepayments/StripeSetupModule.java | 148 ------------------ 2 files changed, 72 insertions(+), 151 deletions(-) delete mode 100644 android/src/main/java/com/fitpassu/stripepayments/StripeSetupModule.java diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index db2701b..ce9e3b3 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -1,5 +1,7 @@ package com.fitpassu.stripepayments; +import java.lang.String; + import android.app.Activity; import android.content.Intent; @@ -27,8 +29,9 @@ public class StripePaymentsModule extends ReactContextBaseJavaModule { private static ReactApplicationContext reactContext; private Stripe stripe; - private Promise paymentPromise; - + private Promise paymentPromise, setupPromise; + private String current; + // boolean handled private final ActivityEventListener activityListener = new BaseActivityEventListener() { @Override @@ -37,8 +40,13 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode, super.onActivityResult(activity, requestCode, resultCode, data); return; } + if(current.equals("Payment")){ boolean handled = stripe.onPaymentResult(requestCode, data, new PaymentResultCallback(paymentPromise)); - if (!handled) { + }else{ + // boolean handled = stripe.onSetupResult(requestCode, data, new SetupResultCallback(paymentPromise)); + } + +if (!handled) { super.onActivityResult(activity, requestCode, resultCode, data); } } @@ -135,4 +143,65 @@ public void onError(Exception e) { promise.reject("StripeModule.failed", e.toString()); } } + // @ReactMethod + // public void setupCard(String secret, ReadableMap cardParams, final Promise promise) { + // PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( + // cardParams.getString("number"), + // cardParams.getInt("expMonth"), + // cardParams.getInt("expYear"), + // cardParams.getString("cvc"), + // null, + // null + // ); + // PaymentMethod.BillingDetails billingDetails = (new PaymentMethod.BillingDetails.Builder()).setEmail(cardParams.getString("email")).build(); + // // PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card); + // PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card, billingDetails); + + // ConfirmSetupIntentParams confirmParams = ConfirmSetupIntentParams.create(params, secret); + + + // if (params == null) { + // promise.reject("", "StripeModule.invalidSetupIntentParams"); + // return; + // } + + // setupPromise = promise; + // stripe = new Stripe( + // reactContext, + // PaymentConfiguration.getInstance(reactContext).getPublishableKey() + // ); + // stripe.confirmSetupIntent(getCurrentActivity(), confirmParams); + + // } + // private static final class SetupResultCallback implements ApiResultCallback { + // private final Promise promise; + + // SetupResultCallback(Promise promise) { + // this.promise = promise; + // } + + // @Override + // public void onSuccess(SetupIntentResult result) { + // SetupIntent setupIntent = result.getIntent(); + // SetupIntent.Status status = setupIntent.getStatus(); + + // if ( + // status == SetupIntent.Status.Succeeded || + // status == SetupIntent.Status.Processing + // ) { + // WritableMap map = Arguments.createMap(); + // map.putString("id", setupIntent.getId()); + // map.putString("paymentMethodId", setupIntent.getPaymentMethodId()); + // promise.resolve(map); + // } else if (status == SetupIntent.Status.Canceled) { + // promise.reject("StripeModule.cancelled", ""); + // } else { + // promise.reject("StripeModule.failed", status.toString()); + // } + // } + // @Override + // public void onError(Exception e) { + // promise.reject("StripeModule.failed", e.toString()); + // } + // } } diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripeSetupModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripeSetupModule.java deleted file mode 100644 index d628073..0000000 --- a/android/src/main/java/com/fitpassu/stripepayments/StripeSetupModule.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.fitpassu.stripepayments; - -import android.app.Activity; -import android.content.Intent; - -import com.facebook.react.bridge.Arguments; -import com.facebook.react.bridge.Promise; -import com.facebook.react.bridge.ReactApplicationContext; -import com.facebook.react.bridge.ReactContextBaseJavaModule; -import com.facebook.react.bridge.ReactMethod; -import com.facebook.react.bridge.ReadableMap; -import com.facebook.react.bridge.ActivityEventListener; -import com.facebook.react.bridge.BaseActivityEventListener; - -import com.facebook.react.bridge.WritableMap; -import com.stripe.android.ApiResultCallback; -import com.stripe.android.PaymentConfiguration; -// import com.stripe.android.PaymentIntentResult; -import com.stripe.android.Stripe; -import com.stripe.android.model.Card; -// import com.stripe.android.model.ConfirmPaymentIntentParams; -// import com.stripe.android.model.PaymentIntent; -import com.stripe.android.model.PaymentMethodCreateParams; -import com.stripe.android.model.SetupIntent; -import com.stripe.android.SetupIntentResult; -import com.stripe.android.model.ConfirmSetupIntentParams; -import com.stripe.android.model.PaymentMethod; -import com.stripe.android.model.PaymentMethod.BillingDetails; - - - -public class StripeSetupModule extends ReactContextBaseJavaModule { - - private static ReactApplicationContext reactContext; - - private Stripe stripe; - private Promise setupPromise; - - private final ActivityEventListener activityListener = new BaseActivityEventListener() { - - @Override - public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { - if (setupPromise == null || stripe == null) { - super.onActivityResult(activity, requestCode, resultCode, data); - return; - } - boolean handled = stripe.onSetupResult(requestCode, data, new SetupResultCallback(setupPromise)); - if (!handled) { - super.onActivityResult(activity, requestCode, resultCode, data); - } - } - }; - - StripeSetupModule(ReactApplicationContext context) { - super(context); - - context.addActivityEventListener(activityListener); - - reactContext = context; - } - - @Override - public String getName() { - return "StripeSetupModule"; - } - - // @ReactMethod(isBlockingSynchronousMethod = true) - // public void init(String publishableKey) { - // SetupConfiguration.init( - // reactContext, - // publishableKey - // ); - // } - - // @ReactMethod(isBlockingSynchronousMethod = true) - // public boolean isCardValid(ReadableMap cardParams) { - // Card card = new Card.Builder( - // cardParams.getString("number"), - // cardParams.getInt("expMonth"), - // cardParams.getInt("expYear"), - // cardParams.getString("cvc") - // ) - // .build(); - // return card.validateNumber() && card.validateExpiryDate() && card.validateExpMonth() && card.validateCVC(); - // } - - - @ReactMethod - public void setupCard(String secret, ReadableMap cardParams, final Promise promise) { - PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( - cardParams.getString("number"), - cardParams.getInt("expMonth"), - cardParams.getInt("expYear"), - cardParams.getString("cvc"), - null, - null - ); - PaymentMethod.BillingDetails billingDetails = (new PaymentMethod.BillingDetails.Builder()).setEmail(cardParams.getString("email")).build(); - // PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card); - PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card, billingDetails); - - ConfirmSetupIntentParams confirmParams = ConfirmSetupIntentParams.create(params, secret); - - - if (params == null) { - promise.reject("", "StripeModule.invalidSetupIntentParams"); - return; - } - - setupPromise = promise; - stripe = new Stripe( - reactContext, - PaymentConfiguration.getInstance(reactContext).getPublishableKey() - ); - stripe.confirmSetupIntent(getCurrentActivity(), confirmParams); - - } - private static final class SetupResultCallback implements ApiResultCallback { - private final Promise promise; - - SetupResultCallback(Promise promise) { - this.promise = promise; - } - - @Override - public void onSuccess(SetupIntentResult result) { - SetupIntent setupIntent = result.getIntent(); - SetupIntent.Status status = setupIntent.getStatus(); - - if ( - status == SetupIntent.Status.Succeeded || - status == SetupIntent.Status.Processing - ) { - WritableMap map = Arguments.createMap(); - map.putString("id", setupIntent.getId()); - map.putString("paymentMethodId", setupIntent.getPaymentMethodId()); - promise.resolve(map); - } else if (status == SetupIntent.Status.Canceled) { - promise.reject("StripeModule.cancelled", ""); - } else { - promise.reject("StripeModule.failed", status.toString()); - } - } - @Override - public void onError(Exception e) { - promise.reject("StripeModule.failed", e.toString()); - } - }} From 89378a634a619511ebb166a8472a385994a74709 Mon Sep 17 00:00:00 2001 From: Amogh J Date: Sun, 16 Aug 2020 16:00:27 +0530 Subject: [PATCH 04/69] Build folder generated --- .../stripepayments/StripePaymentsModule.java | 132 +- package-lock.json | 6520 +++++++++++++++++ 2 files changed, 6589 insertions(+), 63 deletions(-) create mode 100644 package-lock.json diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index ce9e3b3..e36223e 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -24,6 +24,12 @@ import com.stripe.android.model.PaymentIntent; import com.stripe.android.model.PaymentMethodCreateParams; +import com.stripe.android.model.SetupIntent; +import com.stripe.android.SetupIntentResult; +import com.stripe.android.model.ConfirmSetupIntentParams; +import com.stripe.android.model.PaymentMethod; +import com.stripe.android.model.PaymentMethod.BillingDetails; + public class StripePaymentsModule extends ReactContextBaseJavaModule { private static ReactApplicationContext reactContext; @@ -43,10 +49,10 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode, if(current.equals("Payment")){ boolean handled = stripe.onPaymentResult(requestCode, data, new PaymentResultCallback(paymentPromise)); }else{ - // boolean handled = stripe.onSetupResult(requestCode, data, new SetupResultCallback(paymentPromise)); + boolean handled = stripe.onSetupResult(requestCode, data, new SetupResultCallback(paymentPromise)); } -if (!handled) { +if (!handled){ super.onActivityResult(activity, requestCode, resultCode, data); } } @@ -143,65 +149,65 @@ public void onError(Exception e) { promise.reject("StripeModule.failed", e.toString()); } } - // @ReactMethod - // public void setupCard(String secret, ReadableMap cardParams, final Promise promise) { - // PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( - // cardParams.getString("number"), - // cardParams.getInt("expMonth"), - // cardParams.getInt("expYear"), - // cardParams.getString("cvc"), - // null, - // null - // ); - // PaymentMethod.BillingDetails billingDetails = (new PaymentMethod.BillingDetails.Builder()).setEmail(cardParams.getString("email")).build(); - // // PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card); - // PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card, billingDetails); - - // ConfirmSetupIntentParams confirmParams = ConfirmSetupIntentParams.create(params, secret); - - - // if (params == null) { - // promise.reject("", "StripeModule.invalidSetupIntentParams"); - // return; - // } - - // setupPromise = promise; - // stripe = new Stripe( - // reactContext, - // PaymentConfiguration.getInstance(reactContext).getPublishableKey() - // ); - // stripe.confirmSetupIntent(getCurrentActivity(), confirmParams); - - // } - // private static final class SetupResultCallback implements ApiResultCallback { - // private final Promise promise; - - // SetupResultCallback(Promise promise) { - // this.promise = promise; - // } - - // @Override - // public void onSuccess(SetupIntentResult result) { - // SetupIntent setupIntent = result.getIntent(); - // SetupIntent.Status status = setupIntent.getStatus(); - - // if ( - // status == SetupIntent.Status.Succeeded || - // status == SetupIntent.Status.Processing - // ) { - // WritableMap map = Arguments.createMap(); - // map.putString("id", setupIntent.getId()); - // map.putString("paymentMethodId", setupIntent.getPaymentMethodId()); - // promise.resolve(map); - // } else if (status == SetupIntent.Status.Canceled) { - // promise.reject("StripeModule.cancelled", ""); - // } else { - // promise.reject("StripeModule.failed", status.toString()); - // } - // } - // @Override - // public void onError(Exception e) { - // promise.reject("StripeModule.failed", e.toString()); - // } - // } + @ReactMethod + public void setupCard(String secret, ReadableMap cardParams, final Promise promise) { + PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( + cardParams.getString("number"), + cardParams.getInt("expMonth"), + cardParams.getInt("expYear"), + cardParams.getString("cvc"), + null, + null + ); + PaymentMethod.BillingDetails billingDetails = (new PaymentMethod.BillingDetails.Builder()).setEmail(cardParams.getString("email")).build(); + // PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card); + PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card, billingDetails); + + ConfirmSetupIntentParams confirmParams = ConfirmSetupIntentParams.create(params, secret); + + + if (params == null) { + promise.reject("", "StripeModule.invalidSetupIntentParams"); + return; + } + + setupPromise = promise; + stripe = new Stripe( + reactContext, + PaymentConfiguration.getInstance(reactContext).getPublishableKey() + ); + stripe.confirmSetupIntent(getCurrentActivity(), confirmParams); + + } + private static final class SetupResultCallback implements ApiResultCallback { + private final Promise promise; + + SetupResultCallback(Promise promise) { + this.promise = promise; + } + + @Override + public void onSuccess(SetupIntentResult result) { + SetupIntent setupIntent = result.getIntent(); + SetupIntent.Status status = setupIntent.getStatus(); + + if ( + status == SetupIntent.Status.Succeeded || + status == SetupIntent.Status.Processing + ) { + WritableMap map = Arguments.createMap(); + map.putString("id", setupIntent.getId()); + map.putString("paymentMethodId", setupIntent.getPaymentMethodId()); + promise.resolve(map); + } else if (status == SetupIntent.Status.Canceled) { + promise.reject("StripeModule.cancelled", ""); + } else { + promise.reject("StripeModule.failed", status.toString()); + } + } + @Override + public void onError(Exception e) { + promise.reject("StripeModule.failed", e.toString()); + } + } } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8a5b32a --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6520 @@ +{ + "name": "react-native-stripe-payments", + "version": "1.0.4", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/core": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.11.1.tgz", + "integrity": "sha512-XqF7F6FWQdKGGWAzGELL+aCO1p+lRY5Tj5/tbT3St1G8NaH70jhhDIKknIZaDans0OQBG5wRAldROLHSt44BgQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-module-transforms": "^7.11.0", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.11.1", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.11.0", + "@babel/types": "^7.11.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.11.0.tgz", + "integrity": "sha512-fEm3Uzw7Mc9Xi//qU20cBKatTfs2aOtKqmvy/Vm7RkJEGFQ4xc9myCfbXxqK//ZS8MR/ciOHw6meGASJuKmDfQ==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.10.4.tgz", + "integrity": "sha512-5nPcIZ7+KKDxT1427oBivl9V9YTal7qk0diccnh7RrcgrT/pGFOjgGw1dgryyx1GvHEpXVfoDF6Ak3rTiWh8Rg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-builder-react-jsx-experimental": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.10.5.tgz", + "integrity": "sha512-Buewnx6M4ttG+NLkKyt7baQn7ScC/Td+e99G914fRU8fGIUivDDgVIQeDHFa5e4CRSJQt58WpNHhsAZgtzVhsg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/types": "^7.10.5" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", + "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "dev": true, + "requires": { + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.11.0.tgz", + "integrity": "sha512-JbFlKHFntRV5qKw3YC0CvQnDZ4XMwgzzBbld7Ly4Mj4cbFy3KywcR8NtNctRToMWJOVvLINJv525Gd6wwVEx/Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.11.0.tgz", + "integrity": "sha512-02EVu8COMuTRO1TAzdMtpBPbe6aQ1w/8fePD2YgQmxZU4gpNWaL9gK3Jp7dxlkUlUCJOTaSeA+Hrm1BRQwqIhg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/template": "^7.10.4", + "@babel/types": "^7.11.0", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", + "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.11.0.tgz", + "integrity": "sha512-0XIdiQln4Elglgjbwo9wuJpL/K7AGCY26kmEt0+pRP0TAj4jjyNq1MjoRvikrTVqKcx4Gysxt4cXvVFXP/JO2Q==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz", + "integrity": "sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg==", + "dev": true, + "requires": { + "@babel/types": "^7.11.0" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.11.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.11.3.tgz", + "integrity": "sha512-REo8xv7+sDxkKvoxEywIdsNFiZLybwdI7hcT5uEPyQrSMB4YQ973BfC9OOrD/81MaIjh6UxdulIQXkjmiH3PcA==", + "dev": true + }, + "@babel/plugin-external-helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-external-helpers/-/plugin-external-helpers-7.10.4.tgz", + "integrity": "sha512-5mASqSthmRNYVXOphYzlqmR3Y8yp5SZMZhtKDh2DGV3R2PWGLEmP7qOahw66//6m4hjhlpV1bVM7xIJHt1F77Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-proposal-export-default-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.10.4.tgz", + "integrity": "sha512-G1l00VvDZ7Yk2yRlC5D8Ybvu3gmeHS3rCHoUYdjrqGYUtdeOBoRypnvDZ5KQqxyaiiGHWnVDeSEzA5F9ozItig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-export-default-from": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.11.0.tgz", + "integrity": "sha512-wzch41N4yztwoRw0ak+37wxwJM2oiIiy6huGCoqkvSTA9acYWcPfn9Y4aJqmFFJ70KTJUu29f3DQ43uJ9HXzEA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.11.0.tgz", + "integrity": "sha512-v9fZIu3Y8562RRwhm1BbMRxtqZNFmFA2EG+pT2diuU8PT3H6T/KXoZ54KgYisfOFZHV6PfvAiBIZ9Rcz+/JCxA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-default-from": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.10.4.tgz", + "integrity": "sha512-79V6r6Pgudz0RnuMGp5xidu6Z+bPFugh8/Q9eDHonmLp4wKFAZDwygJwYgCzuDu8lFA/sYyT+mc5y2wkd7bTXA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-flow": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.10.4.tgz", + "integrity": "sha512-yxQsX1dJixF4qEEdzVbst3SZQ58Nrooz8NV9Z9GL4byTE25BvJgl5lf0RECUf0fh28rZBb/RYTWn/eeKwCMrZQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.4.tgz", + "integrity": "sha512-KCg9mio9jwiARCB7WAcQ7Y1q+qicILjoK8LP/VkPkEKaf5dkaZZK1EcTe91a3JJlZ3qy6L5s9X52boEYi8DM9g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.10.4.tgz", + "integrity": "sha512-oSAEz1YkBCAKr5Yiq8/BNtvSAPwkp/IyUnwZogd8p+F0RuYQQrLeRUzIQhueQTTBy/F+a40uS7OFKxnkRvmvFQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.11.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.11.1.tgz", + "integrity": "sha512-00dYeDE0EVEHuuM+26+0w/SCL0BH2Qy7LwHuI4Hi4MH5gkC8/AqMN5uWFJIsoXZrAphiMm1iXzBw6L2T+eA0ew==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-flow-strip-types": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.10.4.tgz", + "integrity": "sha512-XTadyuqNst88UWBTdLjM+wEY7BFnY2sYtPyAidfC7M/QaZnSuIZpMvLxqGT7phAcnGyWh/XQFLKcGf04CnvxSQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-flow": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-object-assign": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.10.4.tgz", + "integrity": "sha512-6zccDhYEICfMeQqIjuY5G09/yhKzG30DKHJeYBQUHIsJH7c2jXSGvgwRalufLAXAq432OSlsEfAOLlzEsQzxVw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.10.4.tgz", + "integrity": "sha512-Zd4X54Mu9SBfPGnEcaGcOrVAYOtjT2on8QZkLKEq1S/tHexG39d9XXGZv19VfRrDjPJzFmPfTAqOQS1pfFOujw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.10.4.tgz", + "integrity": "sha512-L+MfRhWjX0eI7Js093MM6MacKU4M6dnCRa/QPDwYMxjljzSCzzlzKzj9Pk4P3OtrPcxr2N3znR419nr3Xw+65A==", + "dev": true, + "requires": { + "@babel/helper-builder-react-jsx": "^7.10.4", + "@babel/helper-builder-react-jsx-experimental": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-self": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.10.4.tgz", + "integrity": "sha512-yOvxY2pDiVJi0axdTWHSMi5T0DILN+H+SaeJeACHKjQLezEzhLx9nEF9xgpBLPtkZsks9cnb5P9iBEi21En3gg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-react-jsx-source": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.10.5.tgz", + "integrity": "sha512-wTeqHVkN1lfPLubRiZH3o73f4rfon42HpgxUSs86Nc+8QIcm/B9s8NNVXu/gwGcOyd7yDib9ikxoDLxJP0UiDA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-jsx": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.0.tgz", + "integrity": "sha512-LFEsP+t3wkYBlis8w6/kmnd6Kb1dxTd+wGJ8MlxTGzQo//ehtqlVL4S9DNUa53+dtPSQobN2CXx4d81FqC58cw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "resolve": "^1.8.1", + "semver": "^5.5.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.11.0.tgz", + "integrity": "sha512-UwQYGOqIdQJe4aWNyS7noqAnN2VbaczPLiEtln+zPowRNlD+79w3oi2TWfYe0eZgd+gjZCbsydN7lzWysDt+gw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.11.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.11.0.tgz", + "integrity": "sha512-edJsNzTtvb3MaXQwj8403B7mZoGu9ElDJQZOKjGUnvilquxBA3IQoEIOvkX/1O8xfAsnHS/oQhe2w/IXrr+w0w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-typescript": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/register": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.10.5.tgz", + "integrity": "sha512-eYHdLv43nyvmPn9bfNfrcC4+iYNwdQ8Pxk1MFJuU/U5LpSYl/PH4dFMazCYZDFVi8ueG3shvO+AQfLrxpYulQw==", + "dev": true, + "requires": { + "find-cache-dir": "^2.0.0", + "lodash": "^4.17.19", + "make-dir": "^2.1.0", + "pirates": "^4.0.0", + "source-map-support": "^0.5.16" + } + }, + "@babel/runtime": { + "version": "7.11.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz", + "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.11.0.tgz", + "integrity": "sha512-ZB2V+LskoWKNpMq6E5UUCrjtDUh5IOTAyIl0dTjIEoXum/iKWkoIEKIRDnUucO6f+2FzNkE0oD4RLKoPIufDtg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.11.0", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/parser": "^7.11.0", + "@babel/types": "^7.11.0", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "@babel/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.11.0.tgz", + "integrity": "sha512-O53yME4ZZI0jO1EVGtF1ePGl0LHirG4P1ibcD80XyzZcKhcMFeCXmh4Xb1ifGBIV233Qg12x4rBfQgA+tmOukA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.4.tgz", + "integrity": "sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" + } + }, + "@hapi/address": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", + "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", + "dev": true + }, + "@hapi/bourne": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz", + "integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==", + "dev": true + }, + "@hapi/hoek": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", + "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "dev": true + }, + "@hapi/joi": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz", + "integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==", + "dev": true, + "requires": { + "@hapi/address": "2.x.x", + "@hapi/bourne": "1.x.x", + "@hapi/hoek": "8.x.x", + "@hapi/topo": "3.x.x" + } + }, + "@hapi/topo": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", + "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "dev": true, + "requires": { + "@hapi/hoek": "^8.3.0" + } + }, + "@jest/console": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.9.0.tgz", + "integrity": "sha512-Zuj6b8TnKXi3q4ymac8EQfc3ea/uhLeCGThFqXeC8H9/raaH8ARPUTdId+XyGd03Z4In0/VjD2OYFcBF09fNLQ==", + "dev": true, + "requires": { + "@jest/source-map": "^24.9.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@jest/fake-timers": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.9.0.tgz", + "integrity": "sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "jest-message-util": "^24.9.0", + "jest-mock": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/yargs": { + "version": "13.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", + "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "@jest/source-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.9.0.tgz", + "integrity": "sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==", + "dev": true, + "requires": { + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@jest/test-result": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.9.0.tgz", + "integrity": "sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/istanbul-lib-coverage": "^2.0.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/yargs": { + "version": "13.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", + "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "@jest/types": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.5.0.tgz", + "integrity": "sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^15.0.0", + "chalk": "^3.0.0" + } + }, + "@react-native-community/cli-debugger-ui": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-4.9.0.tgz", + "integrity": "sha512-fBFGamHm4VUrDqkBGnsrwQL8OC6Om7K6EBQb4xj0nWekpXt1HSa3ScylYHTTWwYcpRf9htGMRGiv4dQDY/odAw==", + "dev": true, + "requires": { + "serve-static": "^1.13.1" + } + }, + "@react-native-community/cli-platform-android": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-4.11.0.tgz", + "integrity": "sha512-BzqocGjOCjpDW0bM/LUrHMXw4nBvOhDXnHWxaoRp3eeUVsD2oSegoRn52kZo9yhPb9cCPkZJ3b+Web71Ue4j9w==", + "dev": true, + "requires": { + "@react-native-community/cli-tools": "^4.11.0", + "chalk": "^3.0.0", + "execa": "^1.0.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.3", + "jetifier": "^1.6.2", + "lodash": "^4.17.15", + "logkitty": "^0.7.1", + "slash": "^3.0.0", + "xmldoc": "^1.1.2" + }, + "dependencies": { + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "@react-native-community/cli-platform-ios": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-4.11.0.tgz", + "integrity": "sha512-/qkjnhhJ7BGBTNkHSS8a+z8UgWUQbU6YZOTuYxjNywGUzMiTsb/wlm2cWCY1VEAvWtY97c4plAZ5OferPJHaVA==", + "dev": true, + "requires": { + "@react-native-community/cli-tools": "^4.11.0", + "chalk": "^3.0.0", + "glob": "^7.1.3", + "js-yaml": "^3.13.1", + "lodash": "^4.17.15", + "plist": "^3.0.1", + "xcode": "^2.0.0" + } + }, + "@react-native-community/cli-server-api": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-4.11.0.tgz", + "integrity": "sha512-vrRaGq7ezsxyyUsFhAboEtA1CHLDa2UpJygOWHip30LaAluM+vopAJbau2NtHVX54vgQzXo438Tx8TXiRacPhA==", + "dev": true, + "requires": { + "@react-native-community/cli-debugger-ui": "^4.9.0", + "@react-native-community/cli-tools": "^4.11.0", + "compression": "^1.7.1", + "connect": "^3.6.5", + "errorhandler": "^1.5.0", + "pretty-format": "^25.1.0", + "serve-static": "^1.13.1", + "ws": "^1.1.0" + }, + "dependencies": { + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } + } + }, + "@react-native-community/cli-tools": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-4.11.0.tgz", + "integrity": "sha512-o2dh9q/778lIYBJxgIvTXkcxi9bSozjt8lv3tpyVmLZNA/PAPmQ7CafT37jWWwdmaSgP7nWyp4DtuE/gRsrXkA==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "lodash": "^4.17.15", + "mime": "^2.4.1", + "node-fetch": "^2.6.0", + "open": "^6.2.0", + "shell-quote": "1.6.1" + }, + "dependencies": { + "mime": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==", + "dev": true + } + } + }, + "@react-native-community/cli-types": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-4.10.1.tgz", + "integrity": "sha512-ael2f1onoPF3vF7YqHGWy7NnafzGu+yp88BbFbP0ydoCP2xGSUzmZVw0zakPTC040Id+JQ9WeFczujMkDy6jYQ==", + "dev": true + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "dev": true + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", + "integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/prop-types": { + "version": "15.7.3", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz", + "integrity": "sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==", + "dev": true + }, + "@types/react": { + "version": "16.9.46", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.46.tgz", + "integrity": "sha512-dbHzO3aAq1lB3jRQuNpuZ/mnu+CdD3H0WVaaBQA8LTT3S33xhVBUj232T8M3tAhSWJs/D/UqORYUlJNl/8VQZg==", + "dev": true, + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-native": { + "version": "0.62.18", + "resolved": "https://registry.npmjs.org/@types/react-native/-/react-native-0.62.18.tgz", + "integrity": "sha512-7QfU8EzIYxYqeXpPf8QNv2xi8hrePlgTbRATRo+plRSdVfJu7N6sAXqrFxKJp6bGLvp82GV1gczl93gqiAfXPA==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", + "dev": true + }, + "@types/yargs": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.5.tgz", + "integrity": "sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==", + "dev": true + }, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", + "dev": true, + "requires": { + "event-target-shim": "^5.0.0" + } + }, + "absolute-path": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/absolute-path/-/absolute-path-0.0.0.tgz", + "integrity": "sha1-p4di+9rftSl76ZsV01p4Wy8JW/c=", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "anser": { + "version": "1.4.10", + "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", + "integrity": "sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==", + "dev": true + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "^0.1.0" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-fragments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz", + "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==", + "dev": true, + "requires": { + "colorette": "^1.0.7", + "slice-ansi": "^2.0.0", + "strip-ansi": "^5.0.0" + } + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "7.0.0-beta.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz", + "integrity": "sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==", + "dev": true + }, + "babel-preset-fbjs": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz", + "integrity": "sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw==", + "dev": true, + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-syntax-class-properties": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.0.0", + "@babel/plugin-syntax-jsx": "^7.0.0", + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoped-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-member-expression-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-super": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-property-literals": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "babel-plugin-syntax-trailing-function-commas": "^7.0.0-beta.0" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", + "dev": true + }, + "big-integer": { + "version": "1.6.48", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz", + "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==", + "dev": true + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bplist-creator": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/bplist-creator/-/bplist-creator-0.0.8.tgz", + "integrity": "sha512-Za9JKzD6fjLC16oX2wsXfc+qBEhJBJB1YPInoAQpMLhDuj5aVOv1baGeIQSq1Fr3OCqzvsoQcSBSwGId/Ja2PA==", + "dev": true, + "requires": { + "stream-buffers": "~2.2.0" + } + }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "requires": { + "node-int64": "^0.4.0" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "dev": true + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-spinners": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.4.0.tgz", + "integrity": "sha512-sJAofoarcm76ZGpuooaO0eDy8saEy+YoZBLjC4h8srt4jeBnkYeOgqxgsJQTpyt2LjI5PTfLJHSL+41Yu4fEJA==", + "dev": true + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dev": true, + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==", + "dev": true + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "csstype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", + "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==", + "dev": true + }, + "dayjs": { + "version": "1.8.33", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.33.tgz", + "integrity": "sha512-881TDLZCdpJFKbraWRHcUG8zfMLLX400ENf9rFZDuWc5zYMss6xifo2PhlDX0ftOmR2NRmaIY47bAa4gKQfXqw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deepmerge": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-3.3.0.tgz", + "integrity": "sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA==", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "denodeify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz", + "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, + "envinfo": { + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.2.tgz", + "integrity": "sha512-k3Eh5bKuQnZjm49/L7H4cHzs2FlL5QjbTB3JrPxoTI8aJG7hVMe4uKyJxSYH4ahseby2waUwk5OaKX/nAsaYgg==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "errorhandler": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.1.tgz", + "integrity": "sha512-rcOwbfvP1WTViVoUjcfZicVzjhjTuhSMntHh6mW3IrEiyE6mJyXvsToJUJGlGlw/2xU9P5whlWNGlIDVeCiT4A==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "escape-html": "~1.0.3" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "dev": true + }, + "eventemitter3": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==", + "dev": true + }, + "exec-sh": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.4.tgz", + "integrity": "sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "dev": true, + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "requires": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + } + }, + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", + "dev": true, + "requires": { + "bser": "2.1.1" + } + }, + "fbjs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-1.0.0.tgz", + "integrity": "sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA==", + "dev": true, + "requires": { + "core-js": "^2.4.1", + "fbjs-css-vars": "^1.0.0", + "isomorphic-fetch": "^2.1.1", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + }, + "dependencies": { + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "~2.0.3" + } + } + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==", + "dev": true + }, + "fbjs-scripts": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fbjs-scripts/-/fbjs-scripts-1.2.0.tgz", + "integrity": "sha512-5krZ8T0Bf8uky0abPoCLrfa7Orxd8UH4Qq8hRUF2RZYNMu+FmEOrBc7Ib3YVONmxTXTlLAvyrrdrVmksDb2OqQ==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "ansi-colors": "^1.0.1", + "babel-preset-fbjs": "^3.2.0", + "core-js": "^2.4.1", + "cross-spawn": "^5.1.0", + "fancy-log": "^1.3.2", + "object-assign": "^4.0.1", + "plugin-error": "^0.1.2", + "semver": "^5.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hermes-engine": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/hermes-engine/-/hermes-engine-0.5.1.tgz", + "integrity": "sha512-hLwqh8dejHayjlpvZY40e1aDCDvyP98cWx/L5DhAjSJLH8g4z9Tp08D7y4+3vErDsncPOdf1bxm+zUWpx0/Fxg==", + "dev": true + }, + "http-errors": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz", + "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "image-size": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.6.3.tgz", + "integrity": "sha512-47xSUiQioGaB96nqtp5/q55m0aBQSQdyIloMOc/x+QVTDZLNmXE892IIDrJ0hM1A5vcNUDD5tDffkSP5lCaIIA==", + "dev": true + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.0.4", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rx-lite": "^4.0.8", + "rx-lite-aggregates": "^4.0.8", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dev": true, + "requires": { + "node-fetch": "^1.0.1", + "whatwg-fetch": ">=0.10.0" + }, + "dependencies": { + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "is-stream": "^1.0.1" + } + } + } + }, + "jest-get-type": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.9.0.tgz", + "integrity": "sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q==", + "dev": true + }, + "jest-haste-map": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.9.0.tgz", + "integrity": "sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.9.0", + "jest-util": "^24.9.0", + "jest-worker": "^24.9.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/yargs": { + "version": "13.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", + "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "jest-message-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.9.0.tgz", + "integrity": "sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/yargs": { + "version": "13.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", + "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-mock": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.9.0.tgz", + "integrity": "sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/yargs": { + "version": "13.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", + "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + } + } + }, + "jest-serializer": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.9.0.tgz", + "integrity": "sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==", + "dev": true + }, + "jest-util": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.9.0.tgz", + "integrity": "sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==", + "dev": true, + "requires": { + "@jest/console": "^24.9.0", + "@jest/fake-timers": "^24.9.0", + "@jest/source-map": "^24.9.0", + "@jest/test-result": "^24.9.0", + "@jest/types": "^24.9.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/yargs": { + "version": "13.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", + "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-validate": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.9.0.tgz", + "integrity": "sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "camelcase": "^5.3.1", + "chalk": "^2.0.1", + "jest-get-type": "^24.9.0", + "leven": "^3.1.0", + "pretty-format": "^24.9.0" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/yargs": { + "version": "13.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", + "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jetifier": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/jetifier/-/jetifier-1.6.6.tgz", + "integrity": "sha512-JNAkmPeB/GS2tCRqUzRPsTOHpGDah7xP18vGJfIjZC+W2sxEHbxgJxetIjIqhjQ3yYbYNEELkM/spKLtwoOSUQ==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsc-android": { + "version": "245459.0.0", + "resolved": "https://registry.npmjs.org/jsc-android/-/jsc-android-245459.0.0.tgz", + "integrity": "sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg==", + "dev": true + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "~0.0.0" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.9" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==", + "dev": true + }, + "lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "logkitty": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", + "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==", + "dev": true, + "requires": { + "ansi-fragments": "^0.2.1", + "dayjs": "^1.8.15", + "yargs": "^15.1.0" + }, + "dependencies": { + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.x" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "metro": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro/-/metro-0.58.0.tgz", + "integrity": "sha512-yi/REXX+/s4r7RjzXht+E+qE6nzvFIrEXO5Q61h+70Q7RODMU8EnlpXx04JYk7DevHuMhFaX+NWhCtRINzR4zA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/core": "^7.0.0", + "@babel/generator": "^7.5.0", + "@babel/parser": "^7.0.0", + "@babel/plugin-external-helpers": "^7.0.0", + "@babel/template": "^7.0.0", + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "absolute-path": "^0.0.0", + "async": "^2.4.0", + "babel-preset-fbjs": "^3.3.0", + "buffer-crc32": "^0.2.13", + "chalk": "^2.4.1", + "ci-info": "^2.0.0", + "concat-stream": "^1.6.0", + "connect": "^3.6.5", + "debug": "^2.2.0", + "denodeify": "^1.2.1", + "eventemitter3": "^3.0.0", + "fbjs": "^1.0.0", + "fs-extra": "^1.0.0", + "graceful-fs": "^4.1.3", + "image-size": "^0.6.0", + "invariant": "^2.2.4", + "jest-haste-map": "^24.7.1", + "jest-worker": "^24.6.0", + "json-stable-stringify": "^1.0.1", + "lodash.throttle": "^4.1.1", + "merge-stream": "^1.0.1", + "metro-babel-register": "0.58.0", + "metro-babel-transformer": "0.58.0", + "metro-cache": "0.58.0", + "metro-config": "0.58.0", + "metro-core": "0.58.0", + "metro-inspector-proxy": "0.58.0", + "metro-minify-uglify": "0.58.0", + "metro-react-native-babel-preset": "0.58.0", + "metro-resolver": "0.58.0", + "metro-source-map": "0.58.0", + "metro-symbolicate": "0.58.0", + "mime-types": "2.1.11", + "mkdirp": "^0.5.1", + "node-fetch": "^2.2.0", + "nullthrows": "^1.1.1", + "resolve": "^1.5.0", + "rimraf": "^2.5.4", + "serialize-error": "^2.1.0", + "source-map": "^0.5.6", + "strip-ansi": "^4.0.0", + "temp": "0.8.3", + "throat": "^4.1.0", + "wordwrap": "^1.0.0", + "write-file-atomic": "^1.2.0", + "ws": "^1.1.5", + "xpipe": "^1.0.5", + "yargs": "^14.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "fs-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "metro-babel-register": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.58.0.tgz", + "integrity": "sha512-P5+G3ufhSYL6cA3a7xkbSJzzFBvtivj/PhWvGXFXnuFssDlMAX1CTktff+0gpka5Cd6B6QLt0UAMWulUAAE4Eg==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-transform-async-to-generator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/register": "^7.0.0", + "core-js": "^2.2.2", + "escape-string-regexp": "^1.0.5" + } + }, + "metro-source-map": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", + "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.58.0", + "ob1": "0.58.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "mime-db": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.23.0.tgz", + "integrity": "sha1-oxtAcK2uon1zLqMzdApk0OyaZlk=", + "dev": true + }, + "mime-types": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.11.tgz", + "integrity": "sha1-wlnEcb2oCKhdbNGTtDCl+uRHOzw=", + "dev": true, + "requires": { + "mime-db": "~1.23.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "metro-babel-register": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-babel-register/-/metro-babel-register-0.59.0.tgz", + "integrity": "sha512-JtWc29erdsXO/V3loenXKw+aHUXgj7lt0QPaZKPpctLLy8kcEpI/8pfXXgVK9weXICCpCnYtYncIosAyzh0xjg==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/register": "^7.0.0", + "escape-string-regexp": "^1.0.5" + } + }, + "metro-babel-transformer": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.58.0.tgz", + "integrity": "sha512-yBX3BkRhw2TCNPhe+pmLSgsAEA3huMvnX08UwjFqSXXI1aiqzRQobn92uKd1U5MM1Vx8EtXVomlJb95ZHNAv6A==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "metro-source-map": "0.58.0" + }, + "dependencies": { + "metro-source-map": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", + "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.58.0", + "ob1": "0.58.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + } + } + }, + "metro-cache": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.58.0.tgz", + "integrity": "sha512-jjW9zCTKxhgKcVkyQ6LHyna9Zdf4TK/45vvT1fPyyTk1RY82ZYjU1qs+84ycKEd08Ka4YcK9xcUew9SIDJYI8Q==", + "dev": true, + "requires": { + "jest-serializer": "^24.4.0", + "metro-core": "0.58.0", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4" + } + }, + "metro-config": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.58.0.tgz", + "integrity": "sha512-4vgBliXwL56vjUlYplvGMVSNrJJpkHuLcD+O20trV3FvPxKg4ZsvuOcNSxqDSMU26FCtIEJ15ojcuCbRL7KY0w==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.5", + "jest-validate": "^24.7.0", + "metro": "0.58.0", + "metro-cache": "0.58.0", + "metro-core": "0.58.0", + "pretty-format": "^24.7.0" + } + }, + "metro-core": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.58.0.tgz", + "integrity": "sha512-RzXUjGFmCLOyzUqcKDvr91AldGtIOxnzNZrWUIiG8uC3kerVLo0mQp4YH3+XVm6fMNiLMg6iER7HLqD+MbpUjQ==", + "dev": true, + "requires": { + "jest-haste-map": "^24.7.1", + "lodash.throttle": "^4.1.1", + "metro-resolver": "0.58.0", + "wordwrap": "^1.0.0" + } + }, + "metro-inspector-proxy": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-inspector-proxy/-/metro-inspector-proxy-0.58.0.tgz", + "integrity": "sha512-oFqTyNTJdCdvcw1Ha6SKE7ITbSaoTbO4xpYownIoJR+WZ0ZfxbWpp225JkHuBJm9UcBAnG9c0CME924m3uBbaw==", + "dev": true, + "requires": { + "connect": "^3.6.5", + "debug": "^2.2.0", + "rxjs": "^5.4.3", + "ws": "^1.1.5", + "yargs": "^14.2.0" + } + }, + "metro-minify-uglify": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.58.0.tgz", + "integrity": "sha512-vRHsA7bCi7eCn3LXLm20EfY2NoWDyYOnmWaq/N8LB0OxL2L5DXRqMYAQK+prWGJ5S1yvVnDuuNVP+peQ9851TA==", + "dev": true, + "requires": { + "uglify-es": "^3.1.9" + } + }, + "metro-react-native-babel-preset": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.58.0.tgz", + "integrity": "sha512-MRriNW+fF6jxABsgPphocUY6mIhmCm8idcrQZ58fT3Iti2vCdtkaK32TyCGUNUptzhUe2/cbE57j4aC+eaodAA==", + "dev": true, + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "metro-react-native-babel-transformer": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.59.0.tgz", + "integrity": "sha512-1O3wrnMq4NcPQ1asEcl9lRDn/t+F1Oef6S9WaYVIKEhg9m/EQRGVrrTVP+R6B5Eeaj3+zNKbzM8Dx/NWy1hUbQ==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "babel-preset-fbjs": "^3.3.0", + "metro-babel-transformer": "0.59.0", + "metro-react-native-babel-preset": "0.59.0", + "metro-source-map": "0.59.0" + }, + "dependencies": { + "metro-babel-transformer": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.59.0.tgz", + "integrity": "sha512-fdZJl8rs54GVFXokxRdD7ZrQ1TJjxWzOi/xSP25VR3E8tbm3nBZqS+/ylu643qSr/IueABR+jrlqAyACwGEf6w==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "metro-source-map": "0.59.0" + } + }, + "metro-react-native-babel-preset": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.59.0.tgz", + "integrity": "sha512-BoO6ncPfceIDReIH8pQ5tQptcGo5yRWQXJGVXfANbiKLq4tfgdZB1C1e2rMUJ6iypmeJU9dzl+EhPmIFKtgREg==", + "dev": true, + "requires": { + "@babel/plugin-proposal-class-properties": "^7.0.0", + "@babel/plugin-proposal-export-default-from": "^7.0.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.0.0", + "@babel/plugin-proposal-optional-chaining": "^7.0.0", + "@babel/plugin-syntax-dynamic-import": "^7.0.0", + "@babel/plugin-syntax-export-default-from": "^7.0.0", + "@babel/plugin-syntax-flow": "^7.2.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0", + "@babel/plugin-syntax-optional-chaining": "^7.0.0", + "@babel/plugin-transform-arrow-functions": "^7.0.0", + "@babel/plugin-transform-block-scoping": "^7.0.0", + "@babel/plugin-transform-classes": "^7.0.0", + "@babel/plugin-transform-computed-properties": "^7.0.0", + "@babel/plugin-transform-destructuring": "^7.0.0", + "@babel/plugin-transform-exponentiation-operator": "^7.0.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0", + "@babel/plugin-transform-for-of": "^7.0.0", + "@babel/plugin-transform-function-name": "^7.0.0", + "@babel/plugin-transform-literals": "^7.0.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0", + "@babel/plugin-transform-object-assign": "^7.0.0", + "@babel/plugin-transform-parameters": "^7.0.0", + "@babel/plugin-transform-react-display-name": "^7.0.0", + "@babel/plugin-transform-react-jsx": "^7.0.0", + "@babel/plugin-transform-react-jsx-self": "^7.0.0", + "@babel/plugin-transform-react-jsx-source": "^7.0.0", + "@babel/plugin-transform-regenerator": "^7.0.0", + "@babel/plugin-transform-runtime": "^7.0.0", + "@babel/plugin-transform-shorthand-properties": "^7.0.0", + "@babel/plugin-transform-spread": "^7.0.0", + "@babel/plugin-transform-sticky-regex": "^7.0.0", + "@babel/plugin-transform-template-literals": "^7.0.0", + "@babel/plugin-transform-typescript": "^7.5.0", + "@babel/plugin-transform-unicode-regex": "^7.0.0", + "@babel/template": "^7.0.0", + "react-refresh": "^0.4.0" + } + } + } + }, + "metro-resolver": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.58.0.tgz", + "integrity": "sha512-XFbAKvCHN2iWqKeiRARzEXn69eTDdJVJC7lu16S4dPQJ+Dy82dZBr5Es12iN+NmbJuFgrAuIHbpWrdnA9tOf6Q==", + "dev": true, + "requires": { + "absolute-path": "^0.0.0" + } + }, + "metro-source-map": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.59.0.tgz", + "integrity": "sha512-0w5CmCM+ybSqXIjqU4RiK40t4bvANL6lafabQ2GP2XD3vSwkLY+StWzCtsb4mPuyi9R/SgoLBel+ZOXHXAH0eQ==", + "dev": true, + "requires": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.59.0", + "ob1": "0.59.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "dependencies": { + "metro-symbolicate": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.59.0.tgz", + "integrity": "sha512-asLaF2A7rndrToGFIknL13aiohwPJ95RKHf0NM3hP/nipiLDoMzXT6ZnQvBqDxkUKyP+51AI75DMtb+Wcyw4Bw==", + "dev": true, + "requires": { + "invariant": "^2.2.4", + "metro-source-map": "0.59.0", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + } + }, + "ob1": { + "version": "0.59.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.59.0.tgz", + "integrity": "sha512-opXMTxyWJ9m68ZglCxwo0OPRESIC/iGmKFPXEXzMZqsVIrgoRXOHmoMDkQzz4y3irVjbyPJRAh5pI9fd0MJTFQ==", + "dev": true + } + } + }, + "metro-symbolicate": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.58.0.tgz", + "integrity": "sha512-uIVxUQC1E26qOMj13dKROhwAa2FmZk5eR0NcBqej/aXmQhpr8LjJg2sondkoLKUp827Tf/Fm9+pS4icb5XiqCw==", + "dev": true, + "requires": { + "invariant": "^2.2.4", + "metro-source-map": "0.58.0", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + }, + "dependencies": { + "metro-source-map": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", + "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.58.0", + "ob1": "0.58.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + }, + "mime-types": { + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", + "dev": true, + "requires": { + "mime-db": "1.44.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==", + "dev": true + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-stream-zip": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.11.3.tgz", + "integrity": "sha512-GY+9LxkQuIT3O7K8BTdHVGKFcBYBy2vAVcTBtkKpu+OlBef/NSb6VuIWSyLiVDfmLMkggHeRJZN0F3W0GWU/uw==", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, + "nullthrows": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz", + "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==", + "dev": true + }, + "ob1": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.58.0.tgz", + "integrity": "sha512-uZP44cbowAfHafP1k4skpWItk5iHCoRevMfrnUvYCfyNNPPJd3rfDCyj0exklWi2gDXvjlj2ObsfiqP/bs/J7Q==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "ora": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", + "dev": true, + "requires": { + "node-modules-regexp": "^1.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "dev": true, + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + } + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "^0.1.1", + "ansi-red": "^0.1.1", + "arr-diff": "^1.0.1", + "arr-union": "^2.0.1", + "extend-shallow": "^1.1.2" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1", + "array-slice": "^0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "^1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "pretty-format": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.9.0.tgz", + "integrity": "sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA==", + "dev": true, + "requires": { + "@jest/types": "^24.9.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "dependencies": { + "@jest/types": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.9.0.tgz", + "integrity": "sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^13.0.0" + } + }, + "@types/yargs": { + "version": "13.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-13.0.10.tgz", + "integrity": "sha512-MU10TSgzNABgdzKvQVW1nuuT+sgBMWeXNc3XOs5YXV5SDAK+PPja2eUuBNB9iqElu03xyEDqlnGw0jgl4nbqGQ==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.1.0.tgz", + "integrity": "sha512-W04AqnILOL/sPRXziNicCjSNRruLAuIHEOVBazepu0545DDNGYHz7ar9ZgZ1fMU8/MA4mVxp5rkBWRi6OXIy3Q==", + "dev": true, + "requires": { + "asap": "~2.0.6" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "react": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz", + "integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "prop-types": "^15.6.2" + } + }, + "react-devtools-core": { + "version": "4.8.2", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.8.2.tgz", + "integrity": "sha512-3Lv3nI8FPAwKqUco35oOlgf+4j8mgYNnIcDv2QTfxEqg2G69q17ZJ8ScU9aBnymS28YC1OW+kTxLmdIQeTN8yg==", + "dev": true, + "requires": { + "shell-quote": "^1.6.1", + "ws": "^7" + }, + "dependencies": { + "ws": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", + "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==", + "dev": true + } + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "react-native": { + "version": "0.63.2", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.63.2.tgz", + "integrity": "sha512-MkxHeJorUDzmQwKJrTfrFYMDRLyu9GSBpsFFMDX7X+HglVnaZi3CTzW2mRv1eIcazoseBOP2eJe+bnkyLl8Y2A==", + "dev": true, + "requires": { + "@babel/runtime": "^7.0.0", + "@react-native-community/cli": "^4.7.0", + "@react-native-community/cli-platform-android": "^4.7.0", + "@react-native-community/cli-platform-ios": "^4.7.0", + "abort-controller": "^3.0.0", + "anser": "^1.4.9", + "base64-js": "^1.1.2", + "event-target-shim": "^5.0.1", + "fbjs": "^1.0.0", + "fbjs-scripts": "^1.1.0", + "hermes-engine": "~0.5.0", + "invariant": "^2.2.4", + "jsc-android": "^245459.0.0", + "metro-babel-register": "0.59.0", + "metro-react-native-babel-transformer": "0.59.0", + "metro-source-map": "0.59.0", + "nullthrows": "^1.1.1", + "pretty-format": "^24.9.0", + "promise": "^8.0.3", + "prop-types": "^15.7.2", + "react-devtools-core": "^4.6.0", + "react-refresh": "^0.4.0", + "regenerator-runtime": "^0.13.2", + "scheduler": "0.19.1", + "stacktrace-parser": "^0.1.3", + "use-subscription": "^1.0.0", + "whatwg-fetch": "^3.0.0" + }, + "dependencies": { + "@react-native-community/cli": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-4.12.0.tgz", + "integrity": "sha512-zIrKxgHsQ5EUGjZ+oIW54+qY2XqVwDJbGV3hzsVsCFXleos2QUAQWskR0BG9zf06P1HT8kfwuDuHs/p1Ywe0rg==", + "dev": true, + "requires": { + "@hapi/joi": "^15.0.3", + "@react-native-community/cli-debugger-ui": "^4.9.0", + "@react-native-community/cli-server-api": "^4.11.0", + "@react-native-community/cli-tools": "^4.11.0", + "@react-native-community/cli-types": "^4.10.1", + "chalk": "^3.0.0", + "command-exists": "^1.2.8", + "commander": "^2.19.0", + "cosmiconfig": "^5.1.0", + "deepmerge": "^3.2.0", + "envinfo": "^7.7.2", + "execa": "^1.0.0", + "find-up": "^4.1.0", + "fs-extra": "^8.1.0", + "glob": "^7.1.3", + "graceful-fs": "^4.1.3", + "inquirer": "^3.0.6", + "leven": "^3.1.0", + "lodash": "^4.17.15", + "metro": "^0.58.0", + "metro-config": "^0.58.0", + "metro-core": "^0.58.0", + "metro-react-native-babel-transformer": "^0.58.0", + "metro-resolver": "^0.58.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "node-stream-zip": "^1.9.1", + "ora": "^3.4.0", + "pretty-format": "^25.2.0", + "semver": "^6.3.0", + "serve-static": "^1.13.1", + "strip-ansi": "^5.2.0", + "sudo-prompt": "^9.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "metro-react-native-babel-transformer": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.58.0.tgz", + "integrity": "sha512-3A73+cRq1eUPQ8g+hPNGgMUMCGmtQjwqHfoG1DwinAoJ/kr4WOXWWbGZo0xHJNBe/zdHGl0uHcDCp2knPglTdQ==", + "dev": true, + "requires": { + "@babel/core": "^7.0.0", + "babel-preset-fbjs": "^3.3.0", + "metro-babel-transformer": "0.58.0", + "metro-react-native-babel-preset": "0.58.0", + "metro-source-map": "0.58.0" + } + }, + "metro-source-map": { + "version": "0.58.0", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.58.0.tgz", + "integrity": "sha512-yvN1YPmejmgiiS7T1aKBiiUTHPw2Vcm3r2TZ+DY92z/9PR4alysIywrCs/fTHs8rbDcKM5VfPCKGLpkBrbKeOw==", + "dev": true, + "requires": { + "@babel/traverse": "^7.0.0", + "@babel/types": "^7.0.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.58.0", + "ob1": "0.58.0", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "pretty-format": { + "version": "25.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.5.0.tgz", + "integrity": "sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ==", + "dev": true, + "requires": { + "@jest/types": "^25.5.0", + "ansi-regex": "^5.0.0", + "ansi-styles": "^4.0.0", + "react-is": "^16.12.0" + } + } + } + } + } + }, + "react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", + "integrity": "sha512-Hwln1VNuGl/6bVwnd0Xdn1e84gT/8T9aYNL+HAKDArLCS7LWjwr7StE30IEYbIkx0Vi3vs+coQxe+SQDbGbbpA==", + "dev": true + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "regenerate": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexpu-core": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "resolve": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rsvp": { + "version": "4.8.5", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.5.tgz", + "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==", + "dev": true + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "*" + } + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dev": true, + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "scheduler": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz", + "integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==", + "dev": true, + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + } + }, + "serialize-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz", + "integrity": "sha1-ULZ51WNc34Rme9yOWa9OW4HV9go=", + "dev": true + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" + } + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "simple-plist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-plist/-/simple-plist-1.1.0.tgz", + "integrity": "sha512-2i5Tc0BYAqppM7jVzmNrI+aEUntPolIq4fDgji6WuNNn1D/qYdn2KwoLhZdzQkE04lu9L5tUoeJsjuJAvd+lFg==", + "dev": true, + "requires": { + "bplist-creator": "0.0.8", + "bplist-parser": "0.2.0", + "plist": "^3.0.1" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + } + } + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, + "stacktrace-parser": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz", + "integrity": "sha512-KJP1OCML99+8fhOHxwwzyWrlUuVX5GQ0ZpJTd1DFXhdkrvg1szxfHhawXUZ3g9TkXORQd4/WG68jMlQZ2p8wlg==", + "dev": true, + "requires": { + "type-fest": "^0.7.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stream-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "sudo-prompt": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sudo-prompt/-/sudo-prompt-9.2.1.tgz", + "integrity": "sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==", + "dev": true + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=", + "dev": true + }, + "temp": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", + "integrity": "sha1-4Ma8TSa5AxJEEOT+2BEDAU38H1k=", + "dev": true, + "requires": { + "os-tmpdir": "^1.0.0", + "rimraf": "~2.2.6" + }, + "dependencies": { + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + } + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz", + "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", + "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "~2.13.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "use-subscription": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/use-subscription/-/use-subscription-1.4.1.tgz", + "integrity": "sha512-7+IIwDG/4JICrWHL/Q/ZPK5yozEnvRm6vHImu0LKwQlmWGKeiF7mbAenLlK/cTNXrTtXHU/SFASQHzB6+oSJMQ==", + "dev": true, + "requires": { + "object-assign": "^4.1.1" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vlq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz", + "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==", + "dev": true + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "whatwg-fetch": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.4.0.tgz", + "integrity": "sha512-rsum2ulz2iuZH08mJkT0Yi6JnKhwdw4oeyMjokgxd+mmqYSd9cPpOQf01TIWgjxG/U4+QR+AwKq6lSbXVxkyoQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" + } + }, + "ws": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz", + "integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==", + "dev": true, + "requires": { + "options": ">=0.0.5", + "ultron": "1.0.x" + } + }, + "xcode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/xcode/-/xcode-2.1.0.tgz", + "integrity": "sha512-uCrmPITrqTEzhn0TtT57fJaNaw8YJs1aCzs+P/QqxsDbvPZSv7XMPPwXrKvHtD6pLjBM/NaVwraWJm8q83Y4iQ==", + "dev": true, + "requires": { + "simple-plist": "^1.0.0", + "uuid": "^3.3.2" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", + "dev": true + }, + "xmldoc": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/xmldoc/-/xmldoc-1.1.2.tgz", + "integrity": "sha512-ruPC/fyPNck2BD1dpz0AZZyrEwMOrWTO5lDdIXS91rs3wtm4j+T8Rp2o+zoOYkkAxJTZRPOSnOGei1egoRmKMQ==", + "dev": true, + "requires": { + "sax": "^1.2.1" + } + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", + "dev": true + }, + "xpipe": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/xpipe/-/xpipe-1.0.5.tgz", + "integrity": "sha1-jdi/Rfw/f1Xw4FS4ePQ6YmFNr98=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + } + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } +} From 30147ada1c13533fec4ab52693d22d1be9b4d96f Mon Sep 17 00:00:00 2001 From: Amogh J Date: Sun, 16 Aug 2020 16:02:57 +0530 Subject: [PATCH 05/69] Testing 2.0 --- .../com/fitpassu/stripepayments/StripePaymentsModule.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index e36223e..d5e444b 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -93,6 +93,7 @@ public boolean isCardValid(ReadableMap cardParams) { @ReactMethod public void confirmPayment(String secret, ReadableMap cardParams, final Promise promise) { + PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( cardParams.getString("number"), cardParams.getInt("expMonth"), @@ -151,13 +152,14 @@ public void onError(Exception e) { } @ReactMethod public void setupCard(String secret, ReadableMap cardParams, final Promise promise) { + current = "Setup"; PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( cardParams.getString("number"), cardParams.getInt("expMonth"), cardParams.getInt("expYear"), cardParams.getString("cvc"), null, - null + nul ); PaymentMethod.BillingDetails billingDetails = (new PaymentMethod.BillingDetails.Builder()).setEmail(cardParams.getString("email")).build(); // PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card); From 0718938c1ccd21a7de23a9c833b0698f50fb36f0 Mon Sep 17 00:00:00 2001 From: Amogh J Date: Sun, 16 Aug 2020 16:09:31 +0530 Subject: [PATCH 06/69] Gitignore updated --- .gitignore | 32 -------------------------------- build/index.d.ts | 21 +++++++++++++++++++++ build/index.js | 24 ++++++++++++++++++++++++ build/index.js.map | 1 + 4 files changed, 46 insertions(+), 32 deletions(-) create mode 100644 build/index.d.ts create mode 100644 build/index.js create mode 100644 build/index.js.map diff --git a/.gitignore b/.gitignore index c5464d9..1c53a7b 100644 --- a/.gitignore +++ b/.gitignore @@ -8,35 +8,3 @@ node_modules/ npm-debug.log yarn-error.log -# Xcode -# -build/ -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 -xcuserdata -*.xccheckout -*.moved-aside -DerivedData -*.hmap -*.ipa -*.xcuserstate -project.xcworkspace - -# Android/IntelliJ -# -build/ -.idea -.gradle -local.properties -*.iml - -# BUCK -buck-out/ -\.buckd/ -*.keystore diff --git a/build/index.d.ts b/build/index.d.ts new file mode 100644 index 0000000..746400e --- /dev/null +++ b/build/index.d.ts @@ -0,0 +1,21 @@ +export interface InitParams { + publishingKey: string; +} +export interface CardDetails { + number: string; + expMonth: number; + expYear: number; + cvc: string; +} +export interface PaymentResult { + id: string; + paymentMethodId: string; +} +declare class Stripe { + _stripeInitialized: boolean; + setOptions: (options: InitParams) => void; + confirmPayment(clientSecret: string, cardDetails: CardDetails): Promise; + isCardValid(cardDetails: CardDetails): boolean; +} +declare const _default: Stripe; +export default _default; diff --git a/build/index.js b/build/index.js new file mode 100644 index 0000000..57743a5 --- /dev/null +++ b/build/index.js @@ -0,0 +1,24 @@ +import { NativeModules } from 'react-native'; +var StripePayments = NativeModules.StripePayments; +var Stripe = /** @class */ (function () { + function Stripe() { + var _this = this; + this._stripeInitialized = false; + this.setOptions = function (options) { + if (_this._stripeInitialized) { + return; + } + StripePayments.init(options.publishingKey); + _this._stripeInitialized = true; + }; + } + Stripe.prototype.confirmPayment = function (clientSecret, cardDetails) { + return StripePayments.confirmPayment(clientSecret, cardDetails); + }; + Stripe.prototype.isCardValid = function (cardDetails) { + return StripePayments.isCardValid(cardDetails) == true; + }; + return Stripe; +}()); +export default new Stripe(); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/build/index.js.map b/build/index.js.map new file mode 100644 index 0000000..87ed857 --- /dev/null +++ b/build/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAErC,IAAA,6CAAc,CAAmB;AAkBzC;IAAA;QAAA,iBAgBC;QAfC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IASH,CAAC;IAPC,+BAAc,GAAd,UAAe,YAAoB,EAAE,WAAwB;QAC3D,OAAO,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IACjE,CAAC;IAED,4BAAW,GAAX,UAAY,WAAwB;QAClC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AAhBD,IAgBC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file From dd99012d18fd8f6d88690d79eb1d6b3c7dfdc1b0 Mon Sep 17 00:00:00 2001 From: Amogh J Date: Mon, 17 Aug 2020 23:53:09 +0530 Subject: [PATCH 07/69] Fixes --- .../stripepayments/StripePaymentsModule.java | 70 +++++++++++++------ .../stripepayments/StripePaymentsPackage.java | 5 +- build/index.d.ts | 8 ++- build/index.js | 7 +- build/index.js.map | 2 +- lib/index.tsx | 12 +++- 6 files changed, 71 insertions(+), 33 deletions(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index d5e444b..147e8b5 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -36,23 +36,25 @@ public class StripePaymentsModule extends ReactContextBaseJavaModule { private Stripe stripe; private Promise paymentPromise, setupPromise; - private String current; - // boolean handled + private String current= " temp_val"; + + boolean handled; private final ActivityEventListener activityListener = new BaseActivityEventListener() { @Override public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { - if (paymentPromise == null || stripe == null) { + if ((paymentPromise == null && setupPromise == null) || stripe == null) { super.onActivityResult(activity, requestCode, resultCode, data); return; } + if(current.equals("Payment")){ - boolean handled = stripe.onPaymentResult(requestCode, data, new PaymentResultCallback(paymentPromise)); - }else{ - boolean handled = stripe.onSetupResult(requestCode, data, new SetupResultCallback(paymentPromise)); + handled = stripe.onPaymentResult(requestCode, data, new PaymentResultCallback(paymentPromise)); + }else if(current.equals("Setup")){ + handled = stripe.onSetupResult(requestCode, data, new SetupResultCallback(setupPromise)); } -if (!handled){ + if (!handled){ super.onActivityResult(activity, requestCode, resultCode, data); } } @@ -68,7 +70,7 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode, @Override public String getName() { - return "StripePaymentsModule"; + return "StripePayments"; } @ReactMethod(isBlockingSynchronousMethod = true) @@ -92,8 +94,13 @@ public boolean isCardValid(ReadableMap cardParams) { } @ReactMethod - public void confirmPayment(String secret, ReadableMap cardParams, final Promise promise) { - + public void confirmPayment(String secret, ReadableMap cardParams, boolean createCardWithParams, final Promise promise) { + current = "Payment"; + stripe = new Stripe( + reactContext, + PaymentConfiguration.getInstance(reactContext).getPublishableKey() + ); + if(createCardWithParams){ PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( cardParams.getString("number"), cardParams.getInt("expMonth"), @@ -111,11 +118,24 @@ public void confirmPayment(String secret, ReadableMap cardParams, final Promise } paymentPromise = promise; - stripe = new Stripe( - reactContext, - PaymentConfiguration.getInstance(reactContext).getPublishableKey() - ); + stripe.confirmPayment(getCurrentActivity(), confirmParams); + }else{ + + if (cardParams.getString("payment_method") == null) { + promise.reject("", "StripeModule.invalidPaymentIntentParams"); + return; + } + paymentPromise = promise; + + stripe.confirmPayment( + getCurrentActivity(), + ConfirmPaymentIntentParams.createWithPaymentMethodId( + cardParams.getString("payment_method"), + secret + ) + ); + } } private static final class PaymentResultCallback implements ApiResultCallback { @@ -141,7 +161,7 @@ public void onSuccess(PaymentIntentResult result) { } else if (status == PaymentIntent.Status.Canceled) { promise.reject("StripeModule.cancelled", ""); } else { - promise.reject("StripeModule.failed", status.toString()); + promise.reject("StripeModule.failed", paymentIntent.getLastPaymentError().getMessage()); } } @@ -151,27 +171,31 @@ public void onError(Exception e) { } } @ReactMethod - public void setupCard(String secret, ReadableMap cardParams, final Promise promise) { + public void confirmSetup(String secret, ReadableMap cardParams, final Promise promise) { current = "Setup"; PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( cardParams.getString("number"), - cardParams.getInt("expMonth"), - cardParams.getInt("expYear"), + cardParams.getInt("exp_month"), + cardParams.getInt("exp_year"), cardParams.getString("cvc"), null, - nul + null ); PaymentMethod.BillingDetails billingDetails = (new PaymentMethod.BillingDetails.Builder()).setEmail(cardParams.getString("email")).build(); // PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card); + if(card == null){ + promise.reject("", "StripeModule.invalidCardParams"); + return; + } PaymentMethodCreateParams params = PaymentMethodCreateParams.create(card, billingDetails); - ConfirmSetupIntentParams confirmParams = ConfirmSetupIntentParams.create(params, secret); - - if (params == null) { promise.reject("", "StripeModule.invalidSetupIntentParams"); return; } + ConfirmSetupIntentParams confirmParams = ConfirmSetupIntentParams.create(params, secret); + + setupPromise = promise; stripe = new Stripe( @@ -204,7 +228,7 @@ public void onSuccess(SetupIntentResult result) { } else if (status == SetupIntent.Status.Canceled) { promise.reject("StripeModule.cancelled", ""); } else { - promise.reject("StripeModule.failed", status.toString()); + promise.reject("StripeModule.failed", setupIntent.getLastSetupError().getMessage()); } } @Override diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsPackage.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsPackage.java index 0b7c5f4..2547fed 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsPackage.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsPackage.java @@ -13,10 +13,7 @@ public class StripePaymentsPackage implements ReactPackage { @Override public List createNativeModules(ReactApplicationContext reactContext) { - List modules = new ArrayList<>(); - modules.add(new StripePaymentsModule(reactContext)); - // modules.add(new StripeSetupModule(reactContext)); - return modules; + return Arrays.asList(new StripePaymentsModule(reactContext)); } @Override diff --git a/build/index.d.ts b/build/index.d.ts index 746400e..58bc09c 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -11,10 +11,16 @@ export interface PaymentResult { id: string; paymentMethodId: string; } +export interface SetupIntentResult { + id: string; + paymentMethodId: string; + liveMode: boolean; +} declare class Stripe { _stripeInitialized: boolean; setOptions: (options: InitParams) => void; - confirmPayment(clientSecret: string, cardDetails: CardDetails): Promise; + confirmPayment(clientSecret: string, cardDetails: CardDetails, createWithCardParams: boolean): Promise; + confirmSetup(clientSecret: string, cardDetails: CardDetails): Promise; isCardValid(cardDetails: CardDetails): boolean; } declare const _default: Stripe; diff --git a/build/index.js b/build/index.js index 57743a5..97ea38e 100644 --- a/build/index.js +++ b/build/index.js @@ -12,8 +12,11 @@ var Stripe = /** @class */ (function () { _this._stripeInitialized = true; }; } - Stripe.prototype.confirmPayment = function (clientSecret, cardDetails) { - return StripePayments.confirmPayment(clientSecret, cardDetails); + Stripe.prototype.confirmPayment = function (clientSecret, cardDetails, createWithCardParams) { + return StripePayments.confirmPayment(clientSecret, cardDetails, createWithCardParams); + }; + Stripe.prototype.confirmSetup = function (clientSecret, cardDetails) { + return StripePayments.confirmSetup(clientSecret, cardDetails); }; Stripe.prototype.isCardValid = function (cardDetails) { return StripePayments.isCardValid(cardDetails) == true; diff --git a/build/index.js.map b/build/index.js.map index 87ed857..2955c6a 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAErC,IAAA,6CAAc,CAAmB;AAkBzC;IAAA;QAAA,iBAgBC;QAfC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IASH,CAAC;IAPC,+BAAc,GAAd,UAAe,YAAoB,EAAE,WAAwB;QAC3D,OAAO,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IACjE,CAAC;IAED,4BAAW,GAAX,UAAY,WAAwB;QAClC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AAhBD,IAgBC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAErC,IAAA,6CAAc,CAAmB;AAuBzC;IAAA;QAAA,iBAmBC;QAlBC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IAYH,CAAC;IAVC,+BAAc,GAAd,UAAe,YAAoB,EAAE,WAAwB,EAAE,oBAA6B;QAC1F,OAAO,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAA;IACvF,CAAC;IACD,6BAAY,GAAZ,UAAa,YAAoB,EAAE,WAAwB;QACzD,OAAO,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IAC/D,CAAC;IAED,4BAAW,GAAX,UAAY,WAAwB;QAClC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AAnBD,IAmBC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file diff --git a/lib/index.tsx b/lib/index.tsx index 2065079..e70b900 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -17,6 +17,11 @@ export interface PaymentResult { id: string, paymentMethodId: string, } +export interface SetupIntentResult { + id: string, + paymentMethodId: string, + liveMode: boolean +} class Stripe { _stripeInitialized = false @@ -27,8 +32,11 @@ class Stripe { this._stripeInitialized = true; } - confirmPayment(clientSecret: string, cardDetails: CardDetails): Promise { - return StripePayments.confirmPayment(clientSecret, cardDetails) + confirmPayment(clientSecret: string, cardDetails: CardDetails, createWithCardParams: boolean): Promise { + return StripePayments.confirmPayment(clientSecret, cardDetails, createWithCardParams) + } + confirmSetup(clientSecret: string, cardDetails: CardDetails): Promise{ + return StripePayments.confirmSetup(clientSecret, cardDetails) } isCardValid(cardDetails: CardDetails): boolean { From 1073bf8eaf79b767308ef5425bf3a1e30e8f3be2 Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Mon, 24 Aug 2020 00:00:50 +0800 Subject: [PATCH 08/69] Add setupPayment iOS --- ios/StripePayments.m | 62 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/ios/StripePayments.m b/ios/StripePayments.m index d0142c2..1ef2983 100644 --- a/ios/StripePayments.m +++ b/ios/StripePayments.m @@ -22,6 +22,68 @@ @implementation StripePayments return [NSString stringWithFormat:@"%@", @(result)]; } +RCT_EXPORT_METHOD(setupPayment:(NSString *)clientSecret cardParams:(NSDictionary *)cardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + if (cardParams.email + && cardParams.number + && cardParams.expMonth + && cardParams.expYear + && cardParams.cardCvc + && cardParams.postalCode + && clientSecret) + { + // Collect card params + STPCardParams *card = [[STPCardParams alloc] init]; + card.number = [RCTConvert NSString:cardParams[@"number"]]; + card.expYear = [[RCTConvert NSNumber:cardParams[@"expYear"]] unsignedIntegerValue]; + card.expMonth = [[RCTConvert NSNumber:cardParams[@"expMonth"]] unsignedIntegerValue]; + card.cvc = [RCTConvert NSString:cardParams[@"cvc"]]; + + // Collect the customer's email to know which customer the PaymentMethod belongs to + STPPaymentMethodBillingDetails *billingDetails = [[STPPaymentMethodBillingDetails alloc] init]; + billingDetails.email = [RCTConvert NSString:cardParams[@"email"]]; + billingDetails.address.postalCode = [RCTConvert NSString:cardParams[@"postalCode"]]; + + // Create SetupIntent confirm parameters with the above + STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:card billingDetails:billingDetails metadata:nil]; + SSTPSetupIntentConfirmParams *setupIntentParams = [STPSetupIntentConfirmParams initWithClientSecret:clientSecret]; + setupIntentParams.paymentMethodParams = paymentMethodParams; + + // Submit payment intent + STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler]; + [paymentHandler setupPayment:setupIntentConfirmParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPSetupIntent *setupIntent, NSError *error) { + dispatch_async(dispatch_get_main_queue(), ^{ + switch (status) { + case STPPaymentHandlerActionStatusFailed: { + reject(@"StripeModule.failed", error.localizedDescription, nil); + break; + } + case STPPaymentHandlerActionStatusCanceled: { + reject(@"StripeModule.cancelled", @"", nil); + break; + } + case STPPaymentHandlerActionStatusSucceeded: { + resolve(@{ + @"id": setupIntent.paymentMethodID, + @"customer": setupIntent.customerID, + @"liveMode": setupIntent.liveMode, + @"last4": paymentMethodParams.last4, + @"exp_month": paymentMethodParams.exp_month, + @"exp_year": paymentMethodParams.exp_year + }); + break; + } + default: + reject(@"StripeModule.unknown", error.localizedDescription, nil); + break; + } + }); + }]; + } else { + reject(@"StripeModule.failed", @"Insufficient card parameters", nil); + } +} + RCT_EXPORT_METHOD(confirmPayment:(NSString *)secret cardParams:(NSDictionary *)cardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { // Collect card details From 1c238927e1c9aec4e12c0f9970ad5763943d1026 Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Tue, 25 Aug 2020 17:18:47 +0800 Subject: [PATCH 09/69] Fix broken code for iOS confirmSetup --- ios/StripePayments.m | 45 ++++++++++++++++++++++---------------------- 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/ios/StripePayments.m b/ios/StripePayments.m index 1ef2983..eeff888 100644 --- a/ios/StripePayments.m +++ b/ios/StripePayments.m @@ -22,16 +22,16 @@ @implementation StripePayments return [NSString stringWithFormat:@"%@", @(result)]; } -RCT_EXPORT_METHOD(setupPayment:(NSString *)clientSecret cardParams:(NSDictionary *)cardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +RCT_EXPORT_METHOD(confirmSetup:(NSString *)clientSecret cardParams:(NSDictionary *)cardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { - if (cardParams.email - && cardParams.number - && cardParams.expMonth - && cardParams.expYear - && cardParams.cardCvc - && cardParams.postalCode - && clientSecret) - { +// if (cardParams.email +// && cardParams.number +// && cardParams.expMonth +// && cardParams.expYear +// && cardParams.cardCvc +// && cardParams.postalCode +// && clientSecret) +// { // Collect card params STPCardParams *card = [[STPCardParams alloc] init]; card.number = [RCTConvert NSString:cardParams[@"number"]]; @@ -45,13 +45,14 @@ @implementation StripePayments billingDetails.address.postalCode = [RCTConvert NSString:cardParams[@"postalCode"]]; // Create SetupIntent confirm parameters with the above - STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:card billingDetails:billingDetails metadata:nil]; - SSTPSetupIntentConfirmParams *setupIntentParams = [STPSetupIntentConfirmParams initWithClientSecret:clientSecret]; - setupIntentParams.paymentMethodParams = paymentMethodParams; + STPPaymentMethodCardParams *paymentMethodCardParams =[[STPPaymentMethodCardParams alloc] initWithCardSourceParams:card]; + STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:paymentMethodCardParams billingDetails:billingDetails metadata:nil]; + STPSetupIntentConfirmParams *setupIntentConfirmParams = [[STPSetupIntentConfirmParams alloc] initWithClientSecret:clientSecret]; + setupIntentConfirmParams.paymentMethodParams = paymentMethodParams; // Submit payment intent STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler]; - [paymentHandler setupPayment:setupIntentConfirmParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPSetupIntent *setupIntent, NSError *error) { + [paymentHandler confirmSetupIntent:setupIntentConfirmParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPSetupIntent *setupIntent, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ switch (status) { case STPPaymentHandlerActionStatusFailed: { @@ -64,12 +65,12 @@ @implementation StripePayments } case STPPaymentHandlerActionStatusSucceeded: { resolve(@{ - @"id": setupIntent.paymentMethodID, - @"customer": setupIntent.customerID, - @"liveMode": setupIntent.liveMode, - @"last4": paymentMethodParams.last4, - @"exp_month": paymentMethodParams.exp_month, - @"exp_year": paymentMethodParams.exp_year + @"id": [setupIntent paymentMethodID], + @"customer": [setupIntent customerID], + @"liveMode": @([setupIntent livemode]), + @"last4": [[paymentMethodParams card] last4], + @"exp_month": [[paymentMethodParams card] expMonth], + @"exp_year": [[paymentMethodParams card] expYear] }); break; } @@ -79,9 +80,9 @@ @implementation StripePayments } }); }]; - } else { - reject(@"StripeModule.failed", @"Insufficient card parameters", nil); - } +// } else { +// reject(@"StripeModule.failed", @"Insufficient card parameters", nil); +// } } RCT_EXPORT_METHOD(confirmPayment:(NSString *)secret cardParams:(NSDictionary *)cardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) From 72e50b6bffcbebc046c5d29b9e182fff77e1ea6b Mon Sep 17 00:00:00 2001 From: sagar_shakya Date: Tue, 25 Aug 2020 20:39:30 +0545 Subject: [PATCH 10/69] Enabled multidex on Android --- android/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/android/build.gradle b/android/build.gradle index e0585e9..dacf78d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -49,6 +49,7 @@ android { targetSdkVersion safeExtGet('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION) versionCode 1 versionName "1.0" + multiDexEnabled true } lintOptions { abortOnError false @@ -74,6 +75,7 @@ dependencies { //noinspection GradleDynamicVersion implementation 'com.facebook.react:react-native:+' // From node_modules implementation 'com.stripe:stripe-android:14.2.1' + implementation 'com.android.support:multidex:1.0.3' } def configureReactNativePom(def pom) { From 8cc372126f783603f06d718d545adb90b270d43c Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Wed, 26 Aug 2020 17:43:38 +0800 Subject: [PATCH 11/69] Complete confirmPayment for iOS --- ios/StripePayments.m | 115 +++++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 59 deletions(-) diff --git a/ios/StripePayments.m b/ios/StripePayments.m index eeff888..e937705 100644 --- a/ios/StripePayments.m +++ b/ios/StripePayments.m @@ -24,65 +24,62 @@ @implementation StripePayments RCT_EXPORT_METHOD(confirmSetup:(NSString *)clientSecret cardParams:(NSDictionary *)cardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { -// if (cardParams.email -// && cardParams.number -// && cardParams.expMonth -// && cardParams.expYear -// && cardParams.cardCvc -// && cardParams.postalCode -// && clientSecret) -// { - // Collect card params - STPCardParams *card = [[STPCardParams alloc] init]; - card.number = [RCTConvert NSString:cardParams[@"number"]]; - card.expYear = [[RCTConvert NSNumber:cardParams[@"expYear"]] unsignedIntegerValue]; - card.expMonth = [[RCTConvert NSNumber:cardParams[@"expMonth"]] unsignedIntegerValue]; - card.cvc = [RCTConvert NSString:cardParams[@"cvc"]]; - - // Collect the customer's email to know which customer the PaymentMethod belongs to - STPPaymentMethodBillingDetails *billingDetails = [[STPPaymentMethodBillingDetails alloc] init]; - billingDetails.email = [RCTConvert NSString:cardParams[@"email"]]; - billingDetails.address.postalCode = [RCTConvert NSString:cardParams[@"postalCode"]]; - - // Create SetupIntent confirm parameters with the above - STPPaymentMethodCardParams *paymentMethodCardParams =[[STPPaymentMethodCardParams alloc] initWithCardSourceParams:card]; - STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:paymentMethodCardParams billingDetails:billingDetails metadata:nil]; - STPSetupIntentConfirmParams *setupIntentConfirmParams = [[STPSetupIntentConfirmParams alloc] initWithClientSecret:clientSecret]; - setupIntentConfirmParams.paymentMethodParams = paymentMethodParams; - - // Submit payment intent - STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler]; - [paymentHandler confirmSetupIntent:setupIntentConfirmParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPSetupIntent *setupIntent, NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - switch (status) { - case STPPaymentHandlerActionStatusFailed: { - reject(@"StripeModule.failed", error.localizedDescription, nil); - break; - } - case STPPaymentHandlerActionStatusCanceled: { - reject(@"StripeModule.cancelled", @"", nil); - break; - } - case STPPaymentHandlerActionStatusSucceeded: { - resolve(@{ - @"id": [setupIntent paymentMethodID], - @"customer": [setupIntent customerID], - @"liveMode": @([setupIntent livemode]), - @"last4": [[paymentMethodParams card] last4], - @"exp_month": [[paymentMethodParams card] expMonth], - @"exp_year": [[paymentMethodParams card] expYear] - }); - break; - } - default: - reject(@"StripeModule.unknown", error.localizedDescription, nil); - break; - } - }); - }]; -// } else { -// reject(@"StripeModule.failed", @"Insufficient card parameters", nil); -// } + + // Collect card params + STPCardParams *card = [[STPCardParams alloc] init]; + card.number = [RCTConvert NSString:cardParams[@"number"]]; + card.expYear = [[RCTConvert NSNumber:cardParams[@"exp_year"]] unsignedIntegerValue]; + card.expMonth = [[RCTConvert NSNumber:cardParams[@"exp_month"]] unsignedIntegerValue]; + card.cvc = [RCTConvert NSString:cardParams[@"cvc"]]; + RCTLogInfo(@"Message: %@", card); + + // Collect the customer's email to know which customer the PaymentMethod belongs to + STPPaymentMethodBillingDetails *billingDetails = [[STPPaymentMethodBillingDetails alloc] init]; + billingDetails.email = [RCTConvert NSString:cardParams[@"email"]]; + billingDetails.address.postalCode = [RCTConvert NSString:cardParams[@"postalCode"]]; + + // Create SetupIntent confirm parameters with the above + STPPaymentMethodCardParams *paymentMethodCardParams =[[STPPaymentMethodCardParams alloc] initWithCardSourceParams:card]; + STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:paymentMethodCardParams billingDetails:billingDetails metadata:nil]; + STPSetupIntentConfirmParams *setupIntentConfirmParams = [[STPSetupIntentConfirmParams alloc] initWithClientSecret:clientSecret]; + setupIntentConfirmParams.paymentMethodParams = paymentMethodParams; + + // Submit payment intent + STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler]; + [paymentHandler confirmSetupIntent:setupIntentConfirmParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPSetupIntent *setupIntent, NSError *error) { + dispatch_async(dispatch_get_main_queue(), ^{ + switch (status) { + case STPPaymentHandlerActionStatusFailed: { + reject(@"StripeModule.failed", error.localizedDescription, nil); + break; + } + case STPPaymentHandlerActionStatusCanceled: { + reject(@"StripeModule.cancelled", @"", nil); + break; + } + case STPPaymentHandlerActionStatusSucceeded: { + NSString *customerID = [setupIntent customerID]; + if (!customerID) { + customerID = [NSString string]; + } + + resolve(@{ + @"id": [setupIntent paymentMethodID], + @"exp_month": [[paymentMethodParams card] expMonth], + @"exp_year": [[paymentMethodParams card] expYear], + @"last4": [[paymentMethodParams card] last4], + @"created": [NSNumber numberWithDouble:[[setupIntent created] timeIntervalSince1970]], + @"liveMode": @([setupIntent livemode]), + }); + break; + } + default: + reject(@"StripeModule.unknown", error.localizedDescription, nil); + break; + } + }); + }]; + } RCT_EXPORT_METHOD(confirmPayment:(NSString *)secret cardParams:(NSDictionary *)cardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) From 03966894026c9a9f377259015ceb0e90798d2dc3 Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Wed, 26 Aug 2020 18:14:58 +0800 Subject: [PATCH 12/69] Add card provider --- lib/index.tsx | 22 +++++++++++++++++++--- package-lock.json | 5 +++++ package.json | 3 +++ tsconfig.json | 3 ++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/lib/index.tsx b/lib/index.tsx index e70b900..65f14e9 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -1,4 +1,5 @@ import { NativeModules } from 'react-native'; +import creditCardType from 'credit-card-type'; const { StripePayments } = NativeModules; @@ -17,10 +18,13 @@ export interface PaymentResult { id: string, paymentMethodId: string, } + export interface SetupIntentResult { - id: string, paymentMethodId: string, - liveMode: boolean + liveMode: boolean, + last4: string, + created: number, + brand: string } class Stripe { @@ -35,8 +39,20 @@ class Stripe { confirmPayment(clientSecret: string, cardDetails: CardDetails, createWithCardParams: boolean): Promise { return StripePayments.confirmPayment(clientSecret, cardDetails, createWithCardParams) } + confirmSetup(clientSecret: string, cardDetails: CardDetails): Promise{ - return StripePayments.confirmSetup(clientSecret, cardDetails) + const nativeSetupIntentResult = StripePayments.confirmSetup(clientSecret, cardDetails); + const cardNumber = cardDetails.number; + const cardType = creditCardType(cardNumber); + let brand = ""; + if (cardType.length > 0) { + brand = cardType[0].type; + } + + return { + ...nativeSetupIntentResult, + brand + } } isCardValid(cardDetails: CardDetails): boolean { diff --git a/package-lock.json b/package-lock.json index 8a5b32a..0bd463d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2050,6 +2050,11 @@ "parse-json": "^4.0.0" } }, + "credit-card-type": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/credit-card-type/-/credit-card-type-9.0.1.tgz", + "integrity": "sha512-GtJr+IyIUN67fRXJGIFTw192kgAAneqZ0DDpKKM78Nh32jwfcuTVzJRe3xioECPZybiKHGIHGsbXg//Hu6PKSQ==" + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", diff --git a/package.json b/package.json index 5e04191..94e1fd5 100644 --- a/package.json +++ b/package.json @@ -50,5 +50,8 @@ "react": "^16.9.0", "react-native": ">=0.60", "typescript": "^3.9.6" + }, + "dependencies": { + "credit-card-type": "^9.0.1" } } diff --git a/tsconfig.json b/tsconfig.json index 37ddaf4..dd5b25e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,7 +17,8 @@ "suppressImplicitAnyIndexErrors": true, "noUnusedLocals": true, "noUnusedParameters": true, - "skipLibCheck": true + "skipLibCheck": true, + "allowSyntheticDefaultImports": true }, "include": ["lib"], "exclude": ["node_modules", "build"] From 4a47a8b8ad2954ccc8de8a5332c1b92b2bdac756 Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Wed, 26 Aug 2020 18:22:17 +0800 Subject: [PATCH 13/69] Build for card provider --- build/index.d.ts | 4 +++- build/index.js | 21 ++++++++++++++++++++- build/index.js.map | 2 +- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/build/index.d.ts b/build/index.d.ts index 58bc09c..5202a84 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -12,9 +12,11 @@ export interface PaymentResult { paymentMethodId: string; } export interface SetupIntentResult { - id: string; paymentMethodId: string; liveMode: boolean; + last4: string; + created: number; + brand: string; } declare class Stripe { _stripeInitialized: boolean; diff --git a/build/index.js b/build/index.js index 97ea38e..4371ad9 100644 --- a/build/index.js +++ b/build/index.js @@ -1,4 +1,16 @@ +var __assign = (this && this.__assign) || function () { + __assign = Object.assign || function(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) + t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); +}; import { NativeModules } from 'react-native'; +import creditCardType from 'credit-card-type'; var StripePayments = NativeModules.StripePayments; var Stripe = /** @class */ (function () { function Stripe() { @@ -16,7 +28,14 @@ var Stripe = /** @class */ (function () { return StripePayments.confirmPayment(clientSecret, cardDetails, createWithCardParams); }; Stripe.prototype.confirmSetup = function (clientSecret, cardDetails) { - return StripePayments.confirmSetup(clientSecret, cardDetails); + var nativeSetupIntentResult = StripePayments.confirmSetup(clientSecret, cardDetails); + var cardNumber = cardDetails.number; + var cardType = creditCardType(cardNumber); + var brand = ""; + if (cardType.length > 0) { + brand = cardType[0].type; + } + return __assign(__assign({}, nativeSetupIntentResult), { brand: brand }); }; Stripe.prototype.isCardValid = function (cardDetails) { return StripePayments.isCardValid(cardDetails) == true; diff --git a/build/index.js.map b/build/index.js.map index 2955c6a..8eeccca 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAErC,IAAA,6CAAc,CAAmB;AAuBzC;IAAA;QAAA,iBAmBC;QAlBC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IAYH,CAAC;IAVC,+BAAc,GAAd,UAAe,YAAoB,EAAE,WAAwB,EAAE,oBAA6B;QAC1F,OAAO,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAA;IACvF,CAAC;IACD,6BAAY,GAAZ,UAAa,YAAoB,EAAE,WAAwB;QACzD,OAAO,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,CAAA;IAC/D,CAAC;IAED,4BAAW,GAAX,UAAY,WAAwB;QAClC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AAnBD,IAmBC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA0BzC;IAAA;QAAA,iBA+BC;QA9BC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IAwBH,CAAC;IAtBC,+BAAc,GAAd,UAAe,YAAoB,EAAE,WAAwB,EAAE,oBAA6B;QAC1F,OAAO,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAA;IACvF,CAAC;IAED,6BAAY,GAAZ,UAAa,YAAoB,EAAE,WAAwB;QACzD,IAAM,uBAAuB,GAAG,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACvF,IAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;QACtC,IAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SAC1B;QAED,6BACK,uBAAuB,KAC1B,KAAK,OAAA,IACN;IACH,CAAC;IAED,4BAAW,GAAX,UAAY,WAAwB;QAClC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AA/BD,IA+BC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file From fe8555b9d9ff7c984dddc36ea2b639a6dc7b4ea3 Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Wed, 26 Aug 2020 18:34:34 +0800 Subject: [PATCH 14/69] Fix card provider --- build/index.js | 61 ++++++++++++++++++++++++++++++++++++++++------ build/index.js.map | 2 +- lib/index.tsx | 6 ++--- 3 files changed, 57 insertions(+), 12 deletions(-) diff --git a/build/index.js b/build/index.js index 4371ad9..0cbd611 100644 --- a/build/index.js +++ b/build/index.js @@ -9,6 +9,42 @@ var __assign = (this && this.__assign) || function () { }; return __assign.apply(this, arguments); }; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __generator = (this && this.__generator) || function (thisArg, body) { + var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; + return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; + function verb(n) { return function (v) { return step([n, v]); }; } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) try { + if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; + if (y = 0, t) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: case 1: t = op; break; + case 4: _.label++; return { value: op[1], done: false }; + case 5: _.label++; y = op[1]; op = [0]; continue; + case 7: op = _.ops.pop(); _.trys.pop(); continue; + default: + if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } + if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } + if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } + if (t[2]) _.ops.pop(); + _.trys.pop(); continue; + } + op = body.call(thisArg, _); + } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } + if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; + } +}; import { NativeModules } from 'react-native'; import creditCardType from 'credit-card-type'; var StripePayments = NativeModules.StripePayments; @@ -28,14 +64,23 @@ var Stripe = /** @class */ (function () { return StripePayments.confirmPayment(clientSecret, cardDetails, createWithCardParams); }; Stripe.prototype.confirmSetup = function (clientSecret, cardDetails) { - var nativeSetupIntentResult = StripePayments.confirmSetup(clientSecret, cardDetails); - var cardNumber = cardDetails.number; - var cardType = creditCardType(cardNumber); - var brand = ""; - if (cardType.length > 0) { - brand = cardType[0].type; - } - return __assign(__assign({}, nativeSetupIntentResult), { brand: brand }); + return __awaiter(this, void 0, void 0, function () { + var nativeSetupIntentResult, cardNumber, cardType, brand; + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, StripePayments.confirmSetup(clientSecret, cardDetails)]; + case 1: + nativeSetupIntentResult = _a.sent(); + cardNumber = cardDetails.number; + cardType = creditCardType(cardNumber); + brand = ""; + if (cardType.length > 0) { + brand = cardType[0].type; + } + return [2 /*return*/, __assign(__assign({}, nativeSetupIntentResult), { brand: brand })]; + } + }); + }); }; Stripe.prototype.isCardValid = function (cardDetails) { return StripePayments.isCardValid(cardDetails) == true; diff --git a/build/index.js.map b/build/index.js.map index 8eeccca..1430a2b 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA0BzC;IAAA;QAAA,iBA+BC;QA9BC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IAwBH,CAAC;IAtBC,+BAAc,GAAd,UAAe,YAAoB,EAAE,WAAwB,EAAE,oBAA6B;QAC1F,OAAO,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAA;IACvF,CAAC;IAED,6BAAY,GAAZ,UAAa,YAAoB,EAAE,WAAwB;QACzD,IAAM,uBAAuB,GAAG,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QACvF,IAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;QACtC,IAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,KAAK,GAAG,EAAE,CAAC;QACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SAC1B;QAED,6BACK,uBAAuB,KAC1B,KAAK,OAAA,IACN;IACH,CAAC;IAED,4BAAW,GAAX,UAAY,WAAwB;QAClC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AA/BD,IA+BC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA0BzC;IAAA;QAAA,iBA+BC;QA9BC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IAwBH,CAAC;IAtBC,+BAAc,GAAd,UAAe,YAAoB,EAAE,WAAwB,EAAE,oBAA6B;QAC1F,OAAO,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAA;IACvF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,WAAwB;;;;;4BAC/B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,EAAA;;wBAAtF,uBAAuB,GAAG,SAA4D;wBACtF,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;wBAChC,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBAED,4CACK,uBAAuB,KAC1B,KAAK,OAAA,KACN;;;;KACF;IAED,4BAAW,GAAX,UAAY,WAAwB;QAClC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AA/BD,IA+BC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file diff --git a/lib/index.tsx b/lib/index.tsx index 65f14e9..1a32941 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -39,9 +39,9 @@ class Stripe { confirmPayment(clientSecret: string, cardDetails: CardDetails, createWithCardParams: boolean): Promise { return StripePayments.confirmPayment(clientSecret, cardDetails, createWithCardParams) } - - confirmSetup(clientSecret: string, cardDetails: CardDetails): Promise{ - const nativeSetupIntentResult = StripePayments.confirmSetup(clientSecret, cardDetails); + + async confirmSetup(clientSecret: string, cardDetails: CardDetails): Promise{ + const nativeSetupIntentResult = await StripePayments.confirmSetup(clientSecret, cardDetails); const cardNumber = cardDetails.number; const cardType = creditCardType(cardNumber); let brand = ""; From 542e48d77f11aa1c77d8c76d7cb4804418bccef8 Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Thu, 27 Aug 2020 02:52:26 +0800 Subject: [PATCH 15/69] Update confirmPayment to use createWithCardParams for iOS --- build/index.d.ts | 8 ++++---- build/index.js | 10 +++++----- build/index.js.map | 2 +- ios/StripePayments.m | 32 ++++++++++++++++++++------------ lib/index.tsx | 14 +++++++------- 5 files changed, 37 insertions(+), 29 deletions(-) diff --git a/build/index.d.ts b/build/index.d.ts index 5202a84..d5d3e88 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -1,7 +1,7 @@ export interface InitParams { publishingKey: string; } -export interface CardDetails { +export interface CardParams { number: string; expMonth: number; expYear: number; @@ -21,9 +21,9 @@ export interface SetupIntentResult { declare class Stripe { _stripeInitialized: boolean; setOptions: (options: InitParams) => void; - confirmPayment(clientSecret: string, cardDetails: CardDetails, createWithCardParams: boolean): Promise; - confirmSetup(clientSecret: string, cardDetails: CardDetails): Promise; - isCardValid(cardDetails: CardDetails): boolean; + confirmPayment(clientSecret: string, cardParams: CardParams, createWithCardParams: boolean): Promise; + confirmSetup(clientSecret: string, cardParams: CardParams): Promise; + isCardValid(cardDetails: CardParams): boolean; } declare const _default: Stripe; export default _default; diff --git a/build/index.js b/build/index.js index 0cbd611..000ea05 100644 --- a/build/index.js +++ b/build/index.js @@ -60,18 +60,18 @@ var Stripe = /** @class */ (function () { _this._stripeInitialized = true; }; } - Stripe.prototype.confirmPayment = function (clientSecret, cardDetails, createWithCardParams) { - return StripePayments.confirmPayment(clientSecret, cardDetails, createWithCardParams); + Stripe.prototype.confirmPayment = function (clientSecret, cardParams, createWithCardParams) { + return StripePayments.confirmPayment(clientSecret, cardParams, createWithCardParams); }; - Stripe.prototype.confirmSetup = function (clientSecret, cardDetails) { + Stripe.prototype.confirmSetup = function (clientSecret, cardParams) { return __awaiter(this, void 0, void 0, function () { var nativeSetupIntentResult, cardNumber, cardType, brand; return __generator(this, function (_a) { switch (_a.label) { - case 0: return [4 /*yield*/, StripePayments.confirmSetup(clientSecret, cardDetails)]; + case 0: return [4 /*yield*/, StripePayments.confirmSetup(clientSecret, cardParams)]; case 1: nativeSetupIntentResult = _a.sent(); - cardNumber = cardDetails.number; + cardNumber = cardParams.number; cardType = creditCardType(cardNumber); brand = ""; if (cardType.length > 0) { diff --git a/build/index.js.map b/build/index.js.map index 1430a2b..ba2db5c 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA0BzC;IAAA;QAAA,iBA+BC;QA9BC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IAwBH,CAAC;IAtBC,+BAAc,GAAd,UAAe,YAAoB,EAAE,WAAwB,EAAE,oBAA6B;QAC1F,OAAO,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE,oBAAoB,CAAC,CAAA;IACvF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,WAAwB;;;;;4BAC/B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,EAAA;;wBAAtF,uBAAuB,GAAG,SAA4D;wBACtF,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC;wBAChC,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBAED,4CACK,uBAAuB,KAC1B,KAAK,OAAA,KACN;;;;KACF;IAED,4BAAW,GAAX,UAAY,WAAwB;QAClC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AA/BD,IA+BC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA0BzC;IAAA;QAAA,iBA+BC;QA9BC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IAwBH,CAAC;IAtBC,+BAAc,GAAd,UAAe,YAAoB,EAAE,UAAsB,EAAE,oBAA6B;QACxF,OAAO,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAA;IACtF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,UAAsB;;;;;4BAC7B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAArF,uBAAuB,GAAG,SAA2D;wBACrF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;wBAC/B,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBAED,4CACK,uBAAuB,KAC1B,KAAK,OAAA,KACN;;;;KACF;IAED,4BAAW,GAAX,UAAY,WAAuB;QACjC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AA/BD,IA+BC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file diff --git a/ios/StripePayments.m b/ios/StripePayments.m index e937705..0c99977 100644 --- a/ios/StripePayments.m +++ b/ios/StripePayments.m @@ -82,20 +82,28 @@ @implementation StripePayments } -RCT_EXPORT_METHOD(confirmPayment:(NSString *)secret cardParams:(NSDictionary *)cardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +RCT_EXPORT_METHOD(confirmPayment:(NSString *)secret cardParams:(NSDictionary *)cardParams createWithCardParams:(BOOL)createWithCardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { - // Collect card details - STPPaymentMethodCardParams *card = [[STPPaymentMethodCardParams alloc] init]; - card.number = [RCTConvert NSString:cardParams[@"number"]]; - card.expYear = [RCTConvert NSNumber:cardParams[@"expYear"]]; - card.expMonth = [RCTConvert NSNumber:cardParams[@"expMonth"]]; - card.cvc = [RCTConvert NSString:cardParams[@"cvc"]]; - STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:card billingDetails:nil metadata:nil]; - STPPaymentIntentParams *paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:secret]; - paymentIntentParams.paymentMethodParams = paymentMethodParams; - paymentIntentParams.setupFutureUsage = @(STPPaymentIntentSetupFutureUsageOnSession); + STPPaymentIntentParams *paymentIntentParams; + + if (!createWithCardParams) { + // Creates the payment intent for 3D secure 2 + paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:secret]; + paymentIntentParams.paymentMethodId = [RCTConvert NSString:cardParams[@"payment_method"]]; + } else { + // Collect card details + STPPaymentMethodCardParams *card = [[STPPaymentMethodCardParams alloc] init]; + card.number = [RCTConvert NSString:cardParams[@"number"]]; + card.expYear = [RCTConvert NSNumber:cardParams[@"expYear"]]; + card.expMonth = [RCTConvert NSNumber:cardParams[@"expMonth"]]; + card.cvc = [RCTConvert NSString:cardParams[@"cvc"]]; + STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:card billingDetails:nil metadata:nil]; + paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:secret]; + paymentIntentParams.paymentMethodParams = paymentMethodParams; + paymentIntentParams.setupFutureUsage = @(STPPaymentIntentSetupFutureUsageOnSession); + } - // Submit the payment + // Submit the payment intent STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler]; [paymentHandler confirmPayment:paymentIntentParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPPaymentIntent *paymentIntent, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ diff --git a/lib/index.tsx b/lib/index.tsx index 1a32941..20e2777 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -7,7 +7,7 @@ export interface InitParams { publishingKey: string } -export interface CardDetails { +export interface CardParams { number: string, expMonth: number, expYear: number, @@ -36,13 +36,13 @@ class Stripe { this._stripeInitialized = true; } - confirmPayment(clientSecret: string, cardDetails: CardDetails, createWithCardParams: boolean): Promise { - return StripePayments.confirmPayment(clientSecret, cardDetails, createWithCardParams) + confirmPayment(clientSecret: string, cardParams: CardParams, createWithCardParams: boolean): Promise { + return StripePayments.confirmPayment(clientSecret, cardParams, createWithCardParams) } - async confirmSetup(clientSecret: string, cardDetails: CardDetails): Promise{ - const nativeSetupIntentResult = await StripePayments.confirmSetup(clientSecret, cardDetails); - const cardNumber = cardDetails.number; + async confirmSetup(clientSecret: string, cardParams: CardParams): Promise{ + const nativeSetupIntentResult = await StripePayments.confirmSetup(clientSecret, cardParams); + const cardNumber = cardParams.number; const cardType = creditCardType(cardNumber); let brand = ""; if (cardType.length > 0) { @@ -55,7 +55,7 @@ class Stripe { } } - isCardValid(cardDetails: CardDetails): boolean { + isCardValid(cardDetails: CardParams): boolean { return StripePayments.isCardValid(cardDetails) == true; } } From 017cebc06ac5847f200c4259dfcb8a5954deff79 Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Fri, 28 Aug 2020 00:18:41 +0800 Subject: [PATCH 16/69] Split confirmPayment into confirmPaymentWithPaymentMethodId and confirmPaymentWithCardParams --- build/index.d.ts | 3 +- build/index.js | 7 +- build/index.js.map | 2 +- ios/StripePayments.m | 166 ++++++++++++++++++++++--------------------- lib/index.tsx | 8 ++- 5 files changed, 99 insertions(+), 87 deletions(-) diff --git a/build/index.d.ts b/build/index.d.ts index d5d3e88..d1ee5d7 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -21,7 +21,8 @@ export interface SetupIntentResult { declare class Stripe { _stripeInitialized: boolean; setOptions: (options: InitParams) => void; - confirmPayment(clientSecret: string, cardParams: CardParams, createWithCardParams: boolean): Promise; + confirmPaymentWithCardParams(clientSecret: string, cardParams: CardParams): Promise; + confirmPaymentWithPaymentMethodId(clientSecret: string, paymentMethodId: string): Promise; confirmSetup(clientSecret: string, cardParams: CardParams): Promise; isCardValid(cardDetails: CardParams): boolean; } diff --git a/build/index.js b/build/index.js index 000ea05..b22acc0 100644 --- a/build/index.js +++ b/build/index.js @@ -60,8 +60,11 @@ var Stripe = /** @class */ (function () { _this._stripeInitialized = true; }; } - Stripe.prototype.confirmPayment = function (clientSecret, cardParams, createWithCardParams) { - return StripePayments.confirmPayment(clientSecret, cardParams, createWithCardParams); + Stripe.prototype.confirmPaymentWithCardParams = function (clientSecret, cardParams) { + return StripePayments.confirmPaymentWithCardParams(clientSecret, cardParams); + }; + Stripe.prototype.confirmPaymentWithPaymentMethodId = function (clientSecret, paymentMethodId) { + return StripePayments.confirmPaymentWithPaymentMethodId(clientSecret, paymentMethodId); }; Stripe.prototype.confirmSetup = function (clientSecret, cardParams) { return __awaiter(this, void 0, void 0, function () { diff --git a/build/index.js.map b/build/index.js.map index ba2db5c..923f3e0 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA0BzC;IAAA;QAAA,iBA+BC;QA9BC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IAwBH,CAAC;IAtBC,+BAAc,GAAd,UAAe,YAAoB,EAAE,UAAsB,EAAE,oBAA6B;QACxF,OAAO,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,UAAU,EAAE,oBAAoB,CAAC,CAAA;IACtF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,UAAsB;;;;;4BAC7B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAArF,uBAAuB,GAAG,SAA2D;wBACrF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;wBAC/B,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBAED,4CACK,uBAAuB,KAC1B,KAAK,OAAA,KACN;;;;KACF;IAED,4BAAW,GAAX,UAAY,WAAuB;QACjC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AA/BD,IA+BC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA0BzC;IAAA;QAAA,iBAmCC;QAlCC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IA4BH,CAAC;IA1BC,6CAA4B,GAA5B,UAA6B,YAAoB,EAAE,UAAsB;QACvE,OAAO,cAAc,CAAC,4BAA4B,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAC9E,CAAC;IAED,kDAAiC,GAAjC,UAAkC,YAAoB,EAAE,eAAuB;QAC7E,OAAO,cAAc,CAAC,iCAAiC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,UAAsB;;;;;4BAC7B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAArF,uBAAuB,GAAG,SAA2D;wBACrF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;wBAC/B,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBAED,4CACK,uBAAuB,KAC1B,KAAK,OAAA,KACN;;;;KACF;IAED,4BAAW,GAAX,UAAY,WAAuB;QACjC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AAnCD,IAmCC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file diff --git a/ios/StripePayments.m b/ios/StripePayments.m index 0c99977..174f28d 100644 --- a/ios/StripePayments.m +++ b/ios/StripePayments.m @@ -25,87 +25,28 @@ @implementation StripePayments RCT_EXPORT_METHOD(confirmSetup:(NSString *)clientSecret cardParams:(NSDictionary *)cardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) { - // Collect card params - STPCardParams *card = [[STPCardParams alloc] init]; - card.number = [RCTConvert NSString:cardParams[@"number"]]; - card.expYear = [[RCTConvert NSNumber:cardParams[@"exp_year"]] unsignedIntegerValue]; - card.expMonth = [[RCTConvert NSNumber:cardParams[@"exp_month"]] unsignedIntegerValue]; - card.cvc = [RCTConvert NSString:cardParams[@"cvc"]]; - RCTLogInfo(@"Message: %@", card); - - // Collect the customer's email to know which customer the PaymentMethod belongs to - STPPaymentMethodBillingDetails *billingDetails = [[STPPaymentMethodBillingDetails alloc] init]; - billingDetails.email = [RCTConvert NSString:cardParams[@"email"]]; - billingDetails.address.postalCode = [RCTConvert NSString:cardParams[@"postalCode"]]; - - // Create SetupIntent confirm parameters with the above - STPPaymentMethodCardParams *paymentMethodCardParams =[[STPPaymentMethodCardParams alloc] initWithCardSourceParams:card]; - STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:paymentMethodCardParams billingDetails:billingDetails metadata:nil]; - STPSetupIntentConfirmParams *setupIntentConfirmParams = [[STPSetupIntentConfirmParams alloc] initWithClientSecret:clientSecret]; - setupIntentConfirmParams.paymentMethodParams = paymentMethodParams; - - // Submit payment intent - STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler]; - [paymentHandler confirmSetupIntent:setupIntentConfirmParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPSetupIntent *setupIntent, NSError *error) { - dispatch_async(dispatch_get_main_queue(), ^{ - switch (status) { - case STPPaymentHandlerActionStatusFailed: { - reject(@"StripeModule.failed", error.localizedDescription, nil); - break; - } - case STPPaymentHandlerActionStatusCanceled: { - reject(@"StripeModule.cancelled", @"", nil); - break; - } - case STPPaymentHandlerActionStatusSucceeded: { - NSString *customerID = [setupIntent customerID]; - if (!customerID) { - customerID = [NSString string]; - } - - resolve(@{ - @"id": [setupIntent paymentMethodID], - @"exp_month": [[paymentMethodParams card] expMonth], - @"exp_year": [[paymentMethodParams card] expYear], - @"last4": [[paymentMethodParams card] last4], - @"created": [NSNumber numberWithDouble:[[setupIntent created] timeIntervalSince1970]], - @"liveMode": @([setupIntent livemode]), - }); - break; - } - default: - reject(@"StripeModule.unknown", error.localizedDescription, nil); - break; - } - }); - }]; - -} - -RCT_EXPORT_METHOD(confirmPayment:(NSString *)secret cardParams:(NSDictionary *)cardParams createWithCardParams:(BOOL)createWithCardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) -{ - STPPaymentIntentParams *paymentIntentParams; - - if (!createWithCardParams) { - // Creates the payment intent for 3D secure 2 - paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:secret]; - paymentIntentParams.paymentMethodId = [RCTConvert NSString:cardParams[@"payment_method"]]; - } else { - // Collect card details - STPPaymentMethodCardParams *card = [[STPPaymentMethodCardParams alloc] init]; - card.number = [RCTConvert NSString:cardParams[@"number"]]; - card.expYear = [RCTConvert NSNumber:cardParams[@"expYear"]]; - card.expMonth = [RCTConvert NSNumber:cardParams[@"expMonth"]]; - card.cvc = [RCTConvert NSString:cardParams[@"cvc"]]; - STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:card billingDetails:nil metadata:nil]; - paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:secret]; - paymentIntentParams.paymentMethodParams = paymentMethodParams; - paymentIntentParams.setupFutureUsage = @(STPPaymentIntentSetupFutureUsageOnSession); - } + // Collect card params + STPCardParams *card = [[STPCardParams alloc] init]; + card.number = [RCTConvert NSString:cardParams[@"number"]]; + card.expYear = [[RCTConvert NSNumber:cardParams[@"exp_year"]] unsignedIntegerValue]; + card.expMonth = [[RCTConvert NSNumber:cardParams[@"exp_month"]] unsignedIntegerValue]; + card.cvc = [RCTConvert NSString:cardParams[@"cvc"]]; + RCTLogInfo(@"Message: %@", card); - // Submit the payment intent + // Collect the customer's email to know which customer the PaymentMethod belongs to + STPPaymentMethodBillingDetails *billingDetails = [[STPPaymentMethodBillingDetails alloc] init]; + billingDetails.email = [RCTConvert NSString:cardParams[@"email"]]; + billingDetails.address.postalCode = [RCTConvert NSString:cardParams[@"postalCode"]]; + + // Create SetupIntent confirm parameters with the above + STPPaymentMethodCardParams *paymentMethodCardParams =[[STPPaymentMethodCardParams alloc] initWithCardSourceParams:card]; + STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:paymentMethodCardParams billingDetails:billingDetails metadata:nil]; + STPSetupIntentConfirmParams *setupIntentConfirmParams = [[STPSetupIntentConfirmParams alloc] initWithClientSecret:clientSecret]; + setupIntentConfirmParams.paymentMethodParams = paymentMethodParams; + + // Submit payment intent STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler]; - [paymentHandler confirmPayment:paymentIntentParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPPaymentIntent *paymentIntent, NSError *error) { + [paymentHandler confirmSetupIntent:setupIntentConfirmParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPSetupIntent *setupIntent, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ switch (status) { case STPPaymentHandlerActionStatusFailed: { @@ -117,19 +58,82 @@ @implementation StripePayments break; } case STPPaymentHandlerActionStatusSucceeded: { + NSString *customerID = [setupIntent customerID]; + if (!customerID) { + customerID = [NSString string]; + } + resolve(@{ - @"id": paymentIntent.allResponseFields[@"id"], - @"paymentMethodId": paymentIntent.paymentMethodId + @"id": [setupIntent paymentMethodID], + @"exp_month": [[paymentMethodParams card] expMonth], + @"exp_year": [[paymentMethodParams card] expYear], + @"last4": [[paymentMethodParams card] last4], + @"created": [NSNumber numberWithDouble:[[setupIntent created] timeIntervalSince1970]], + @"liveMode": @([setupIntent livemode]), }); break; } default: + reject(@"StripeModule.unknown", error.localizedDescription, nil); break; } }); }]; } +RCT_EXPORT_METHOD(confirmPaymentWithPaymentMethodId:(NSString *)secret paymentMethodId:(NSString *)paymentMethodId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + // Creates the payment intent for 3D secure 2 + STPPaymentIntentParams *paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:secret]; + paymentIntentParams.paymentMethodId = [RCTConvert NSString:paymentMethodId]; + + [self stripeConfirmPayment:paymentIntentParams resolver:resolve rejecter:reject]; +} + +RCT_EXPORT_METHOD(confirmPaymentWithCardParams:(NSString *)secret cardParams:(NSDictionary *)cardParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) +{ + // Collect card details + STPPaymentMethodCardParams *card = [[STPPaymentMethodCardParams alloc] init]; + card.number = [RCTConvert NSString:cardParams[@"number"]]; + card.expYear = [RCTConvert NSNumber:cardParams[@"expYear"]]; + card.expMonth = [RCTConvert NSNumber:cardParams[@"expMonth"]]; + card.cvc = [RCTConvert NSString:cardParams[@"cvc"]]; + STPPaymentMethodParams *paymentMethodParams = [STPPaymentMethodParams paramsWithCard:card billingDetails:nil metadata:nil]; + STPPaymentIntentParams *paymentIntentParams = [[STPPaymentIntentParams alloc] initWithClientSecret:secret]; + paymentIntentParams.paymentMethodParams = paymentMethodParams; + paymentIntentParams.setupFutureUsage = @(STPPaymentIntentSetupFutureUsageOnSession); + + [self stripeConfirmPayment:paymentIntentParams resolver:resolve rejecter:reject]; +} + +- (void) stripeConfirmPayment:(STPPaymentIntentParams *)paymentIntentParams resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject +{ + STPPaymentHandler *paymentHandler = [STPPaymentHandler sharedHandler]; + [paymentHandler confirmPayment:paymentIntentParams withAuthenticationContext:self completion:^(STPPaymentHandlerActionStatus status, STPPaymentIntent *paymentIntent, NSError *error) { + dispatch_async(dispatch_get_main_queue(), ^{ + switch (status) { + case STPPaymentHandlerActionStatusFailed: { + reject(@"StripeModule.failed", error.localizedDescription, nil); + break; + } + case STPPaymentHandlerActionStatusCanceled: { + reject(@"StripeModule.cancelled", @"", nil); + break; + } + case STPPaymentHandlerActionStatusSucceeded: { + resolve(@{ + @"id": paymentIntent.allResponseFields[@"id"], + @"paymentMethodId": paymentIntent.paymentMethodId + }); + break; + } + default: + break; + } + }); + }]; +} + - (UIViewController *)authenticationPresentingViewController { return RCTPresentedViewController(); diff --git a/lib/index.tsx b/lib/index.tsx index 20e2777..2a5f44c 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -36,8 +36,12 @@ class Stripe { this._stripeInitialized = true; } - confirmPayment(clientSecret: string, cardParams: CardParams, createWithCardParams: boolean): Promise { - return StripePayments.confirmPayment(clientSecret, cardParams, createWithCardParams) + confirmPaymentWithCardParams(clientSecret: string, cardParams: CardParams): Promise { + return StripePayments.confirmPaymentWithCardParams(clientSecret, cardParams) + } + + confirmPaymentWithPaymentMethodId(clientSecret: string, paymentMethodId: string): Promise { + return StripePayments.confirmPaymentWithPaymentMethodId(clientSecret, paymentMethodId); } async confirmSetup(clientSecret: string, cardParams: CardParams): Promise{ From f0e4a463e132c8519d152f4d7be23c3c4e118ecf Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Fri, 28 Aug 2020 00:49:17 +0800 Subject: [PATCH 17/69] Update README.md --- README.md | 57 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 49 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 1ab48d7..1b4293a 100644 --- a/README.md +++ b/README.md @@ -20,21 +20,23 @@ The library ships with platform native code that needs to be compiled together w ## Usage -### Setup - -First of all you have to obtain Stripe account [publishabe key](https://stripe.com/docs/keys). And then you need to set it for module. +To use the module, import it first. ```javascript import stripe from 'react-native-stripe-payments'; +``` +### Setup + +First of all you have to obtain a Stripe account [publishable key](https://stripe.com/docs/keys), which you need to set it for the module. + +```javascript stripe.setOptions({ publishingKey: 'STRIPE_PUBLISHING_KEY' }); ``` ### Validate the given card details ```javascript -import stripe from 'react-native-stripe-payments'; - const isCardValid = stripe.isCardValid({ number: '4242424242424242', expMonth: 10, @@ -42,21 +44,60 @@ const isCardValid = stripe.isCardValid({ cvc: '888', }); ``` +The argument for isCardValid is of type `CardParams`, which is used across the other APIs. -### One-time payments +### Set up a payment method for future payments using Setup Intent ```javascript -import stripe from 'react-native-stripe-payments'; +stripe.confirmSetup('client_secret_from_backend', cardParams) + .then(result => { + // result of type SetupIntentResult + // { + // paymentMethodId, + // liveMode, + // last4, + // created, + // brand + // } + }) + .catch(err => + // error performing payment + ) +``` +The `brand` is the provider of the card, and we use the [module](https://www.npmjs.com/package/credit-card-type) `credit-card-type` to achieve that. + +### One-time payment using the `id` of a `PaymentMethod` + +```javascript +stripe.confirmPaymentWithPaymentMethodId('client_secret_from_backend', paymentMethodId) + .then(result => { + // result of type PaymentResult + // { + // id, + // paymentMethodId + // } + }) + .catch(err => + // error performing payment + ) +``` + +### One-time payment using `cardParams` +```javascript const cardDetails = { number: '4242424242424242', expMonth: 10, expYear: 21, cvc: '888', } -stripe.confirmPayment('client_secret_from_backend', cardDetails) +stripe.confirmPaymentWithCardParams('client_secret_from_backend', cardParams) .then(result => { // result of type PaymentResult + // { + // id, + // paymentMethodId + // } }) .catch(err => // error performing payment From 8993ad7d2a853011f8c5324590eca122ea95371d Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Fri, 28 Aug 2020 00:50:29 +0800 Subject: [PATCH 18/69] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1b4293a..9edf3bd 100644 --- a/README.md +++ b/README.md @@ -44,9 +44,9 @@ const isCardValid = stripe.isCardValid({ cvc: '888', }); ``` -The argument for isCardValid is of type `CardParams`, which is used across the other APIs. +The argument for `isCardValid` is of type `CardParams`, which is used across the other APIs. -### Set up a payment method for future payments using Setup Intent +### Set up a payment method for future payments (Setup Intent) ```javascript stripe.confirmSetup('client_secret_from_backend', cardParams) From a4f886bcb65c40b4fd8e5b7319caa2d6627b2746 Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Thu, 27 Aug 2020 19:37:57 +0200 Subject: [PATCH 19/69] Update README.md --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 9edf3bd..326ea82 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,3 @@ stripe.confirmPaymentWithCardParams('client_secret_from_backend', cardParams) // error performing payment ) ``` - -### Reusing cards - -Not supported yet, though as we're highly invested in development of our product which depends on this library we'll do it as soon as possible! From 3384ec968205b6af9fd079808468b50f60f72fd3 Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Mon, 31 Aug 2020 02:29:47 +0800 Subject: [PATCH 20/69] Split StripePaymentsModule.java confirmPayment --- .../stripepayments/StripePaymentsModule.java | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index 147e8b5..abd01db 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -83,7 +83,7 @@ public void init(String publishableKey) { @ReactMethod(isBlockingSynchronousMethod = true) public boolean isCardValid(ReadableMap cardParams) { - Card card = new Card.Builder( + Card card = new Card.Builder( cardParams.getString("number"), cardParams.getInt("expMonth"), cardParams.getInt("expYear"), @@ -94,13 +94,13 @@ public boolean isCardValid(ReadableMap cardParams) { } @ReactMethod - public void confirmPayment(String secret, ReadableMap cardParams, boolean createCardWithParams, final Promise promise) { + public void confirmPaymentWithCardParams(String secret, ReadableMap cardParams, final Promise promise) { current = "Payment"; stripe = new Stripe( reactContext, PaymentConfiguration.getInstance(reactContext).getPublishableKey() ); - if(createCardWithParams){ + PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( cardParams.getString("number"), cardParams.getInt("expMonth"), @@ -120,22 +120,29 @@ public void confirmPayment(String secret, ReadableMap cardParams, boolean create paymentPromise = promise; stripe.confirmPayment(getCurrentActivity(), confirmParams); - }else{ + } + + @ReactMethod + public void confirmPaymentWithPaymentMethodId(String secret, String paymentMethodId, final Promise promise) { + current = "Payment"; + stripe = new Stripe( + reactContext, + PaymentConfiguration.getInstance(reactContext).getPublishableKey() + ); - if (cardParams.getString("payment_method") == null) { + if (paymentMethodId == null) { promise.reject("", "StripeModule.invalidPaymentIntentParams"); return; } paymentPromise = promise; - stripe.confirmPayment( + stripe.confirmPayment( getCurrentActivity(), ConfirmPaymentIntentParams.createWithPaymentMethodId( - cardParams.getString("payment_method"), + paymentMethodId, secret - ) - ); - } + ) + ); } private static final class PaymentResultCallback implements ApiResultCallback { From a42f6cd87a49354faa23eeb215d674acece92742 Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Fri, 4 Sep 2020 11:08:00 +0100 Subject: [PATCH 21/69] Updated Pod Minimum Target --- react-native-stripe-payments.podspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/react-native-stripe-payments.podspec b/react-native-stripe-payments.podspec index 2f2f6a3..1f5d205 100644 --- a/react-native-stripe-payments.podspec +++ b/react-native-stripe-payments.podspec @@ -12,7 +12,7 @@ Pod::Spec.new do |s| s.homepage = "https://github.com/Fitpassu/react-native-stripe-payments" s.license = { :type => "MIT", :file => "LICENSE" } s.authors = { "Viktoras Laukevičius" => "viktoras.laukevicius@yahoo.com" } - s.platforms = { :ios => "11.0" } + s.platforms = { :ios => "10.0" } s.source = { :git => "https://github.com/Fitpassu/react-native-stripe-payments.git", :tag => "#{s.version}" } s.source_files = "ios/**/*.{h,c,m,swift}" From fa95bd5735c620af735d8b6558055999d25f948d Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Fri, 4 Sep 2020 12:31:59 +0100 Subject: [PATCH 22/69] Updated to be more inline with the iOS implementation --- .../java/com/fitpassu/stripepayments/StripePaymentsModule.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index abd01db..ef5612b 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -229,8 +229,7 @@ public void onSuccess(SetupIntentResult result) { status == SetupIntent.Status.Processing ) { WritableMap map = Arguments.createMap(); - map.putString("id", setupIntent.getId()); - map.putString("paymentMethodId", setupIntent.getPaymentMethodId()); + map.putString("id", setupIntent.getPaymentMethodId()); promise.resolve(map); } else if (status == SetupIntent.Status.Canceled) { promise.reject("StripeModule.cancelled", ""); From d5df02a3d03ae1aa0965cf707ca6d6aaf3ab779b Mon Sep 17 00:00:00 2001 From: Amogh J Date: Fri, 4 Sep 2020 20:09:57 +0530 Subject: [PATCH 23/69] Update confirmSetupIntent return object --- build/index.d.ts | 4 +++- build/index.js | 4 +++- build/index.js.map | 2 +- lib/index.tsx | 8 ++++++-- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/build/index.d.ts b/build/index.d.ts index d1ee5d7..2ce4586 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -12,7 +12,9 @@ export interface PaymentResult { paymentMethodId: string; } export interface SetupIntentResult { - paymentMethodId: string; + id: string; + exp_month: string; + exp_year: string; liveMode: boolean; last4: string; created: number; diff --git a/build/index.js b/build/index.js index b22acc0..0c60ab9 100644 --- a/build/index.js +++ b/build/index.js @@ -80,7 +80,9 @@ var Stripe = /** @class */ (function () { if (cardType.length > 0) { brand = cardType[0].type; } - return [2 /*return*/, __assign(__assign({}, nativeSetupIntentResult), { brand: brand })]; + delete cardParams['cvc']; + delete cardParams['number']; + return [2 /*return*/, __assign(__assign(__assign({}, nativeSetupIntentResult), cardParams), { brand: brand })]; } }); }); diff --git a/build/index.js.map b/build/index.js.map index 923f3e0..ded1aec 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA0BzC;IAAA;QAAA,iBAmCC;QAlCC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IA4BH,CAAC;IA1BC,6CAA4B,GAA5B,UAA6B,YAAoB,EAAE,UAAsB;QACvE,OAAO,cAAc,CAAC,4BAA4B,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAC9E,CAAC;IAED,kDAAiC,GAAjC,UAAkC,YAAoB,EAAE,eAAuB;QAC7E,OAAO,cAAc,CAAC,iCAAiC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,UAAsB;;;;;4BAC7B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAArF,uBAAuB,GAAG,SAA2D;wBACrF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;wBAC/B,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBAED,4CACK,uBAAuB,KAC1B,KAAK,OAAA,KACN;;;;KACF;IAED,4BAAW,GAAX,UAAY,WAAuB;QACjC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AAnCD,IAmCC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA4BzC;IAAA;QAAA,iBAqCC;QApCC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IA8BH,CAAC;IA5BC,6CAA4B,GAA5B,UAA6B,YAAoB,EAAE,UAAsB;QACvE,OAAO,cAAc,CAAC,4BAA4B,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAC9E,CAAC;IAED,kDAAiC,GAAjC,UAAkC,YAAoB,EAAE,eAAuB;QAC7E,OAAO,cAAc,CAAC,iCAAiC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,UAAsB;;;;;4BAC7B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAArF,uBAAuB,GAAG,SAA2D;wBACrF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;wBAC/B,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBACD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;wBACxB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAA;wBAC3B,qDACK,uBAAuB,GACvB,UAAU,KACb,KAAK,OAAA,KACN;;;;KACF;IAED,4BAAW,GAAX,UAAY,WAAuB;QACjC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AArCD,IAqCC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file diff --git a/lib/index.tsx b/lib/index.tsx index 2a5f44c..b9b7c0c 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -20,7 +20,9 @@ export interface PaymentResult { } export interface SetupIntentResult { - paymentMethodId: string, + id: string, + exp_month: string, + exp_year: string, liveMode: boolean, last4: string, created: number, @@ -52,9 +54,11 @@ class Stripe { if (cardType.length > 0) { brand = cardType[0].type; } - + delete cardParams['cvc'] + delete cardParams['number'] return { ...nativeSetupIntentResult, + ...cardParams, brand } } From 393b94a767b10a6693eee73465746b9f400a2b44 Mon Sep 17 00:00:00 2001 From: Amogh J Date: Fri, 4 Sep 2020 20:22:48 +0530 Subject: [PATCH 24/69] last4 added --- lib/index.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/index.tsx b/lib/index.tsx index b9b7c0c..3325da5 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -56,6 +56,7 @@ class Stripe { } delete cardParams['cvc'] delete cardParams['number'] + cardParams['last4'] = cardNumber.substr(cardNumber.length - 4); return { ...nativeSetupIntentResult, ...cardParams, From d8a39f309aad59254d68d070186356b005727624 Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Fri, 4 Sep 2020 22:58:53 +0800 Subject: [PATCH 25/69] Build for Amogh's commit --- build/index.js | 1 + build/index.js.map | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/build/index.js b/build/index.js index 0c60ab9..149dffb 100644 --- a/build/index.js +++ b/build/index.js @@ -82,6 +82,7 @@ var Stripe = /** @class */ (function () { } delete cardParams['cvc']; delete cardParams['number']; + cardParams['last4'] = cardNumber.substr(cardNumber.length - 4); return [2 /*return*/, __assign(__assign(__assign({}, nativeSetupIntentResult), cardParams), { brand: brand })]; } }); diff --git a/build/index.js.map b/build/index.js.map index ded1aec..dab83bc 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA4BzC;IAAA;QAAA,iBAqCC;QApCC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IA8BH,CAAC;IA5BC,6CAA4B,GAA5B,UAA6B,YAAoB,EAAE,UAAsB;QACvE,OAAO,cAAc,CAAC,4BAA4B,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAC9E,CAAC;IAED,kDAAiC,GAAjC,UAAkC,YAAoB,EAAE,eAAuB;QAC7E,OAAO,cAAc,CAAC,iCAAiC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,UAAsB;;;;;4BAC7B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAArF,uBAAuB,GAAG,SAA2D;wBACrF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;wBAC/B,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBACD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;wBACxB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAA;wBAC3B,qDACK,uBAAuB,GACvB,UAAU,KACb,KAAK,OAAA,KACN;;;;KACF;IAED,4BAAW,GAAX,UAAY,WAAuB;QACjC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AArCD,IAqCC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA4BzC;IAAA;QAAA,iBAsCC;QArCC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IA+BH,CAAC;IA7BC,6CAA4B,GAA5B,UAA6B,YAAoB,EAAE,UAAsB;QACvE,OAAO,cAAc,CAAC,4BAA4B,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAC9E,CAAC;IAED,kDAAiC,GAAjC,UAAkC,YAAoB,EAAE,eAAuB;QAC7E,OAAO,cAAc,CAAC,iCAAiC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,UAAsB;;;;;4BAC7B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAArF,uBAAuB,GAAG,SAA2D;wBACrF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;wBAC/B,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBACD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;wBACxB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAA;wBAC3B,UAAU,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAC/D,qDACK,uBAAuB,GACvB,UAAU,KACb,KAAK,OAAA,KACN;;;;KACF;IAED,4BAAW,GAAX,UAAY,WAAuB;QACjC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AAtCD,IAsCC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file From 57d1e317f0e8e3fe626095178c3f611e814da831 Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Fri, 4 Sep 2020 16:03:47 +0100 Subject: [PATCH 26/69] Removed Redundant values from iOS --- ios/StripePayments.m | 3 --- 1 file changed, 3 deletions(-) diff --git a/ios/StripePayments.m b/ios/StripePayments.m index 174f28d..753a143 100644 --- a/ios/StripePayments.m +++ b/ios/StripePayments.m @@ -65,9 +65,6 @@ @implementation StripePayments resolve(@{ @"id": [setupIntent paymentMethodID], - @"exp_month": [[paymentMethodParams card] expMonth], - @"exp_year": [[paymentMethodParams card] expYear], - @"last4": [[paymentMethodParams card] last4], @"created": [NSNumber numberWithDouble:[[setupIntent created] timeIntervalSince1970]], @"liveMode": @([setupIntent livemode]), }); From 824493ea84cae64f9a1e3d15f5784ede510faa49 Mon Sep 17 00:00:00 2001 From: Amogh J Date: Fri, 4 Sep 2020 21:04:30 +0530 Subject: [PATCH 27/69] Updating setupIntentResult object --- .../stripepayments/StripePaymentsModule.java | 1 + lib/index.tsx | 15 ++++++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index ef5612b..736d0d3 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -230,6 +230,7 @@ public void onSuccess(SetupIntentResult result) { ) { WritableMap map = Arguments.createMap(); map.putString("id", setupIntent.getPaymentMethodId()); + map.putString("liveMode", setupIntent.isLiveMode()); promise.resolve(map); } else if (status == SetupIntent.Status.Canceled) { promise.reject("StripeModule.cancelled", ""); diff --git a/lib/index.tsx b/lib/index.tsx index 3325da5..3070490 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -54,14 +54,15 @@ class Stripe { if (cardType.length > 0) { brand = cardType[0].type; } - delete cardParams['cvc'] - delete cardParams['number'] - cardParams['last4'] = cardNumber.substr(cardNumber.length - 4); - return { - ...nativeSetupIntentResult, - ...cardParams, - brand + let setupIntentResult = { + exp_month: cardParams.expMonth, + exp_year: cardParams.expYear, + last4: cardNumber.substr(cardNumber.length - 4), + created: cardParams.number, + brand: brand, + ...nativeSetupIntentResult } + return setupIntentResult } isCardValid(cardDetails: CardParams): boolean { From a932d06db1e36c5ea54028abef717ac4abfac22b Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Fri, 4 Sep 2020 16:41:42 +0100 Subject: [PATCH 28/69] Built Typescript files --- build/index.js | 8 +++----- build/index.js.map | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/build/index.js b/build/index.js index 149dffb..8334a70 100644 --- a/build/index.js +++ b/build/index.js @@ -68,7 +68,7 @@ var Stripe = /** @class */ (function () { }; Stripe.prototype.confirmSetup = function (clientSecret, cardParams) { return __awaiter(this, void 0, void 0, function () { - var nativeSetupIntentResult, cardNumber, cardType, brand; + var nativeSetupIntentResult, cardNumber, cardType, brand, setupIntentResult; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, StripePayments.confirmSetup(clientSecret, cardParams)]; @@ -80,10 +80,8 @@ var Stripe = /** @class */ (function () { if (cardType.length > 0) { brand = cardType[0].type; } - delete cardParams['cvc']; - delete cardParams['number']; - cardParams['last4'] = cardNumber.substr(cardNumber.length - 4); - return [2 /*return*/, __assign(__assign(__assign({}, nativeSetupIntentResult), cardParams), { brand: brand })]; + setupIntentResult = __assign({ exp_month: cardParams.expMonth, exp_year: cardParams.expYear, last4: cardNumber.substr(cardNumber.length - 4), created: cardParams.number, brand: brand }, nativeSetupIntentResult); + return [2 /*return*/, setupIntentResult]; } }); }); diff --git a/build/index.js.map b/build/index.js.map index dab83bc..2c540de 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA4BzC;IAAA;QAAA,iBAsCC;QArCC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IA+BH,CAAC;IA7BC,6CAA4B,GAA5B,UAA6B,YAAoB,EAAE,UAAsB;QACvE,OAAO,cAAc,CAAC,4BAA4B,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAC9E,CAAC;IAED,kDAAiC,GAAjC,UAAkC,YAAoB,EAAE,eAAuB;QAC7E,OAAO,cAAc,CAAC,iCAAiC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,UAAsB;;;;;4BAC7B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAArF,uBAAuB,GAAG,SAA2D;wBACrF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;wBAC/B,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBACD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAA;wBACxB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAA;wBAC3B,UAAU,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;wBAC/D,qDACK,uBAAuB,GACvB,UAAU,KACb,KAAK,OAAA,KACN;;;;KACF;IAED,4BAAW,GAAX,UAAY,WAAuB;QACjC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AAtCD,IAsCC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA4BzC;IAAA;QAAA,iBAuCC;QAtCC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IAgCH,CAAC;IA9BC,6CAA4B,GAA5B,UAA6B,YAAoB,EAAE,UAAsB;QACvE,OAAO,cAAc,CAAC,4BAA4B,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAC9E,CAAC;IAED,kDAAiC,GAAjC,UAAkC,YAAoB,EAAE,eAAuB;QAC7E,OAAO,cAAc,CAAC,iCAAiC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,UAAsB;;;;;4BAC7B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAArF,uBAAuB,GAAG,SAA2D;wBACrF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;wBAC/B,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBACG,iBAAiB,cACnB,SAAS,EAAE,UAAU,CAAC,QAAQ,EAC9B,QAAQ,EAAE,UAAU,CAAC,OAAO,EAC5B,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAC/C,OAAO,EAAE,UAAU,CAAC,MAAM,EAC1B,KAAK,EAAE,KAAK,IACT,uBAAuB,CAC3B,CAAA;wBACD,sBAAO,iBAAiB,EAAA;;;;KACzB;IAED,4BAAW,GAAX,UAAY,WAAuB;QACjC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AAvCD,IAuCC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file From e9b713408a6b2c9c066baf638afdd69c168378c9 Mon Sep 17 00:00:00 2001 From: Amogh J Date: Fri, 4 Sep 2020 21:16:54 +0530 Subject: [PATCH 29/69] Returning created from Native Android --- .../java/com/fitpassu/stripepayments/StripePaymentsModule.java | 1 + lib/index.tsx | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index 736d0d3..b4c61ac 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -231,6 +231,7 @@ public void onSuccess(SetupIntentResult result) { WritableMap map = Arguments.createMap(); map.putString("id", setupIntent.getPaymentMethodId()); map.putString("liveMode", setupIntent.isLiveMode()); + map.putString("created", setupIntent.getCreated()); promise.resolve(map); } else if (status == SetupIntent.Status.Canceled) { promise.reject("StripeModule.cancelled", ""); diff --git a/lib/index.tsx b/lib/index.tsx index 3070490..45cea5f 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -58,7 +58,6 @@ class Stripe { exp_month: cardParams.expMonth, exp_year: cardParams.expYear, last4: cardNumber.substr(cardNumber.length - 4), - created: cardParams.number, brand: brand, ...nativeSetupIntentResult } From d903fdcf88c0c91e4736dddd18f048d83dd178a1 Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Fri, 4 Sep 2020 16:48:53 +0100 Subject: [PATCH 30/69] Built Typescript files --- build/index.js | 2 +- build/index.js.map | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build/index.js b/build/index.js index 8334a70..8ec99f1 100644 --- a/build/index.js +++ b/build/index.js @@ -80,7 +80,7 @@ var Stripe = /** @class */ (function () { if (cardType.length > 0) { brand = cardType[0].type; } - setupIntentResult = __assign({ exp_month: cardParams.expMonth, exp_year: cardParams.expYear, last4: cardNumber.substr(cardNumber.length - 4), created: cardParams.number, brand: brand }, nativeSetupIntentResult); + setupIntentResult = __assign({ exp_month: cardParams.expMonth, exp_year: cardParams.expYear, last4: cardNumber.substr(cardNumber.length - 4), brand: brand }, nativeSetupIntentResult); return [2 /*return*/, setupIntentResult]; } }); diff --git a/build/index.js.map b/build/index.js.map index 2c540de..7274c18 100644 --- a/build/index.js.map +++ b/build/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA4BzC;IAAA;QAAA,iBAuCC;QAtCC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IAgCH,CAAC;IA9BC,6CAA4B,GAA5B,UAA6B,YAAoB,EAAE,UAAsB;QACvE,OAAO,cAAc,CAAC,4BAA4B,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAC9E,CAAC;IAED,kDAAiC,GAAjC,UAAkC,YAAoB,EAAE,eAAuB;QAC7E,OAAO,cAAc,CAAC,iCAAiC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,UAAsB;;;;;4BAC7B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAArF,uBAAuB,GAAG,SAA2D;wBACrF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;wBAC/B,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBACG,iBAAiB,cACnB,SAAS,EAAE,UAAU,CAAC,QAAQ,EAC9B,QAAQ,EAAE,UAAU,CAAC,OAAO,EAC5B,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAC/C,OAAO,EAAE,UAAU,CAAC,MAAM,EAC1B,KAAK,EAAE,KAAK,IACT,uBAAuB,CAC3B,CAAA;wBACD,sBAAO,iBAAiB,EAAA;;;;KACzB;IAED,4BAAW,GAAX,UAAY,WAAuB;QACjC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AAvCD,IAuCC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.tsx"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAEtC,IAAA,cAAc,GAAK,aAAa,eAAlB,CAAmB;AA4BzC;IAAA;QAAA,iBAsCC;QArCC,uBAAkB,GAAG,KAAK,CAAA;QAE1B,eAAU,GAAG,UAAC,OAAmB;YAC/B,IAAI,KAAI,CAAC,kBAAkB,EAAE;gBAAE,OAAO;aAAE;YACxC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;YAC3C,KAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;QACjC,CAAC,CAAA;IA+BH,CAAC;IA7BC,6CAA4B,GAA5B,UAA6B,YAAoB,EAAE,UAAsB;QACvE,OAAO,cAAc,CAAC,4BAA4B,CAAC,YAAY,EAAE,UAAU,CAAC,CAAA;IAC9E,CAAC;IAED,kDAAiC,GAAjC,UAAkC,YAAoB,EAAE,eAAuB;QAC7E,OAAO,cAAc,CAAC,iCAAiC,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC;IAEK,6BAAY,GAAlB,UAAmB,YAAoB,EAAE,UAAsB;;;;;4BAC7B,qBAAM,cAAc,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,EAAA;;wBAArF,uBAAuB,GAAG,SAA2D;wBACrF,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;wBAC/B,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;wBACxC,KAAK,GAAG,EAAE,CAAC;wBACf,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;4BACvB,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;yBAC1B;wBACG,iBAAiB,cACnB,SAAS,EAAE,UAAU,CAAC,QAAQ,EAC9B,QAAQ,EAAE,UAAU,CAAC,OAAO,EAC5B,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,EAC/C,KAAK,EAAE,KAAK,IACT,uBAAuB,CAC3B,CAAA;wBACD,sBAAO,iBAAiB,EAAA;;;;KACzB;IAED,4BAAW,GAAX,UAAY,WAAuB;QACjC,OAAO,cAAc,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACzD,CAAC;IACH,aAAC;AAAD,CAAC,AAtCD,IAsCC;AAED,eAAe,IAAI,MAAM,EAAE,CAAC"} \ No newline at end of file From 7a71db94b4ce3c779e3e6281e77d562efac64209 Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Fri, 4 Sep 2020 17:05:41 +0100 Subject: [PATCH 31/69] Updated exp month / year to match TS --- .../com/fitpassu/stripepayments/StripePaymentsModule.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index b4c61ac..1616d73 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -182,8 +182,8 @@ public void confirmSetup(String secret, ReadableMap cardParams, final Promise pr current = "Setup"; PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( cardParams.getString("number"), - cardParams.getInt("exp_month"), - cardParams.getInt("exp_year"), + cardParams.getInt("expMonth"), + cardParams.getInt("expYear"), cardParams.getString("cvc"), null, null From 0e462e028932014e44f3842a0e6ad1bdf5b73a93 Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Fri, 4 Sep 2020 17:06:18 +0100 Subject: [PATCH 32/69] Updated exp month / year --- ios/StripePayments.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ios/StripePayments.m b/ios/StripePayments.m index 753a143..da31946 100644 --- a/ios/StripePayments.m +++ b/ios/StripePayments.m @@ -28,8 +28,8 @@ @implementation StripePayments // Collect card params STPCardParams *card = [[STPCardParams alloc] init]; card.number = [RCTConvert NSString:cardParams[@"number"]]; - card.expYear = [[RCTConvert NSNumber:cardParams[@"exp_year"]] unsignedIntegerValue]; - card.expMonth = [[RCTConvert NSNumber:cardParams[@"exp_month"]] unsignedIntegerValue]; + card.expYear = [[RCTConvert NSNumber:cardParams[@"expYear"]] unsignedIntegerValue]; + card.expMonth = [[RCTConvert NSNumber:cardParams[@"expMonth"]] unsignedIntegerValue]; card.cvc = [RCTConvert NSString:cardParams[@"cvc"]]; RCTLogInfo(@"Message: %@", card); From b08f87864695459597cb938a4ca7cad04409136c Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Fri, 4 Sep 2020 17:06:30 +0100 Subject: [PATCH 33/69] Updated exp month / year From f792d09935554e5248ae9cb10fed6f2973f44128 Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Fri, 4 Sep 2020 17:08:23 +0100 Subject: [PATCH 34/69] Updated TS definitions --- lib/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/index.tsx b/lib/index.tsx index 45cea5f..3a3e950 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -23,7 +23,7 @@ export interface SetupIntentResult { id: string, exp_month: string, exp_year: string, - liveMode: boolean, + live_mode: boolean, last4: string, created: number, brand: string From 759b7c188cde03365f126724e525c0e3d7cc70f5 Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Fri, 4 Sep 2020 17:09:01 +0100 Subject: [PATCH 35/69] Built Typescript files --- build/index.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/index.d.ts b/build/index.d.ts index 2ce4586..ab8a502 100644 --- a/build/index.d.ts +++ b/build/index.d.ts @@ -15,7 +15,7 @@ export interface SetupIntentResult { id: string; exp_month: string; exp_year: string; - liveMode: boolean; + live_mode: boolean; last4: string; created: number; brand: string; From 90fc76340a9150330e79ddff92186d8437438419 Mon Sep 17 00:00:00 2001 From: Luke Brandon Farrell Date: Fri, 4 Sep 2020 17:17:18 +0100 Subject: [PATCH 36/69] Fixed Types on Return Methods --- .../com/fitpassu/stripepayments/StripePaymentsModule.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index 1616d73..5b23c83 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -230,8 +230,8 @@ public void onSuccess(SetupIntentResult result) { ) { WritableMap map = Arguments.createMap(); map.putString("id", setupIntent.getPaymentMethodId()); - map.putString("liveMode", setupIntent.isLiveMode()); - map.putString("created", setupIntent.getCreated()); + map.putBoolean("liveMode", setupIntent.isLiveMode()); + map.putDouble("created", setupIntent.getCreated()); promise.resolve(map); } else if (status == SetupIntent.Status.Canceled) { promise.reject("StripeModule.cancelled", ""); From d70643554bd2cdfdd13440009908fb9f55b56483 Mon Sep 17 00:00:00 2001 From: Amogh J Date: Fri, 4 Sep 2020 21:51:28 +0530 Subject: [PATCH 37/69] Android native debug --- .../com/fitpassu/stripepayments/StripePaymentsModule.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index 1616d73..5b23c83 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -230,8 +230,8 @@ public void onSuccess(SetupIntentResult result) { ) { WritableMap map = Arguments.createMap(); map.putString("id", setupIntent.getPaymentMethodId()); - map.putString("liveMode", setupIntent.isLiveMode()); - map.putString("created", setupIntent.getCreated()); + map.putBoolean("liveMode", setupIntent.isLiveMode()); + map.putDouble("created", setupIntent.getCreated()); promise.resolve(map); } else if (status == SetupIntent.Status.Canceled) { promise.reject("StripeModule.cancelled", ""); From 6c675b09adcb67cf7040ce9dc421164452f1a2b1 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 6 Sep 2020 04:17:26 +0000 Subject: [PATCH 38/69] docs: update README.md [skip ci] --- README.md | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/README.md b/README.md index 326ea82..7ab6231 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,7 @@ ![React Native Stripe payments](https://raw.githubusercontent.com/Fitpassu/react-native-stripe-payments/master/react-native-stripe-payments.png) + +[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) + A well typed React Native library providing support for Stripe payments on both iOS and Android. @@ -103,3 +106,22 @@ stripe.confirmPaymentWithCardParams('client_secret_from_backend', cardParams) // error performing payment ) ``` + +## Contributors ✨ + +Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)): + + + + + + + + +

Luke Brandon Farrell

💻 🚇 📆
+ + + + + +This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome! \ No newline at end of file From be8134f2366185235019f5dad1f318658495453b Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 6 Sep 2020 04:17:27 +0000 Subject: [PATCH 39/69] docs: create .all-contributorsrc [skip ci] --- .all-contributorsrc | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .all-contributorsrc diff --git a/.all-contributorsrc b/.all-contributorsrc new file mode 100644 index 0000000..ff42791 --- /dev/null +++ b/.all-contributorsrc @@ -0,0 +1,26 @@ +{ + "files": [ + "README.md" + ], + "imageSize": 100, + "commit": false, + "contributors": [ + { + "login": "lukebrandonfarrell", + "name": "Luke Brandon Farrell", + "avatar_url": "https://avatars3.githubusercontent.com/u/18139277?v=4", + "profile": "http://www.lukebrandonfarrell.com", + "contributions": [ + "code", + "infra", + "projectManagement" + ] + } + ], + "contributorsPerLine": 7, + "projectName": "react-native-stripe-payments", + "projectOwner": "aspect-apps", + "repoType": "github", + "repoHost": "https://github.com", + "skipCi": true +} From 66572565f40677c1674aca9c589fc1bb37e43736 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 6 Sep 2020 04:30:01 +0000 Subject: [PATCH 40/69] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7ab6231..64a6ed6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![React Native Stripe payments](https://raw.githubusercontent.com/Fitpassu/react-native-stripe-payments/master/react-native-stripe-payments.png) -[![All Contributors](https://img.shields.io/badge/all_contributors-1-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) A well typed React Native library providing support for Stripe payments on both iOS and Android. @@ -117,6 +117,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d +

Luke Brandon Farrell

💻 🚇 📆

Chester Sim

📖 💻
From 50bcf1f7335b31fc074418e0cb3bbeafe1d7c41f Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 6 Sep 2020 04:30:02 +0000 Subject: [PATCH 41/69] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index ff42791..dffcb45 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -15,6 +15,16 @@ "infra", "projectManagement" ] + }, + { + "login": "ChesterSim", + "name": "Chester Sim", + "avatar_url": "https://avatars2.githubusercontent.com/u/12388321?v=4", + "profile": "https://github.com/ChesterSim", + "contributions": [ + "doc", + "code" + ] } ], "contributorsPerLine": 7, From cf3d99a421f543b024be261579eae7f338b20e02 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 6 Sep 2020 04:30:41 +0000 Subject: [PATCH 42/69] docs: update README.md [skip ci] --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 64a6ed6..b77b733 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![React Native Stripe payments](https://raw.githubusercontent.com/Fitpassu/react-native-stripe-payments/master/react-native-stripe-payments.png) -[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg?style=flat-square)](#contributors-) +[![All Contributors](https://img.shields.io/badge/all_contributors-3-orange.svg?style=flat-square)](#contributors-) A well typed React Native library providing support for Stripe payments on both iOS and Android. @@ -118,6 +118,7 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
Luke Brandon Farrell

💻 🚇 📆
Chester Sim

📖 💻 +
Amogh Jahagirdar

📖 💻 From c6fcb2183f4eb2b07e818cfdcda69a32de552387 Mon Sep 17 00:00:00 2001 From: "allcontributors[bot]" <46447321+allcontributors[bot]@users.noreply.github.com> Date: Sun, 6 Sep 2020 04:30:42 +0000 Subject: [PATCH 43/69] docs: update .all-contributorsrc [skip ci] --- .all-contributorsrc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.all-contributorsrc b/.all-contributorsrc index dffcb45..dfaf3f0 100644 --- a/.all-contributorsrc +++ b/.all-contributorsrc @@ -25,6 +25,16 @@ "doc", "code" ] + }, + { + "login": "amogh-jrules", + "name": "Amogh Jahagirdar", + "avatar_url": "https://avatars3.githubusercontent.com/u/31567169?v=4", + "profile": "https://jramogh.co", + "contributions": [ + "doc", + "code" + ] } ], "contributorsPerLine": 7, From 78fb9faecc1f2ed05ca32190835da6fead18d263 Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Tue, 8 Sep 2020 19:33:19 +0300 Subject: [PATCH 44/69] wip --- android/build.gradle | 2 +- .../BridgeEphemeralKeyProvider.java | 69 +++++++++++++++++++ .../stripepayments/StripePaymentsModule.java | 25 +++++++ 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java diff --git a/android/build.gradle b/android/build.gradle index dacf78d..4a8496d 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -74,7 +74,7 @@ repositories { dependencies { //noinspection GradleDynamicVersion implementation 'com.facebook.react:react-native:+' // From node_modules - implementation 'com.stripe:stripe-android:14.2.1' + implementation 'com.stripe:stripe-android:15.1.0' implementation 'com.android.support:multidex:1.0.3' } diff --git a/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java b/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java new file mode 100644 index 0000000..887e4a5 --- /dev/null +++ b/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java @@ -0,0 +1,69 @@ +package com.fitpassu.stripepayments; + +import com.stripe.android.EphemeralKeyProvider; +import com.stripe.android.EphemeralKeyUpdateListener; + +import com.facebook.react.bridge.ReactApplicationContext; +import com.facebook.react.modules.core.DeviceEventManagerModule; +import com.facebook.react.bridge.WritableMap; +import com.facebook.react.bridge.Arguments; + + +/** + * + * Ephemeral Key Provider that works with the JS thread through the bridge + * + */ +public class BridgeEphemeralKeyProvider implements EphemeralKeyProvider, EphemeralKeyUpdateListener { + private ReactApplicationContext reactContext; + private EphemeralKeyUpdateListener pendingKeyUpdateListener; //will hold the key update listener between the time when the event is raised and the JS responds back with the key + + //save the context for future use + BridgeEphemeralKeyProvider(ReactApplicationContext context) { + this.reactContext = context; + } + + @Override + public void createEphemeralKey( + String apiVersion, + final EphemeralKeyUpdateListener keyUpdateListener) { + + //build params to send to the JS thread + WritableMap params = Arguments.createMap(); + params.putString("apiVersion", apiVersion); + + this.pendingKeyUpdateListener = keyUpdateListener; + + //async call the JS land + reactContext + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit("CreateStripeEphemeralKey", params); + } + + /** + * + * Called from the JS land once we have the key + * + */ + @Override + public void onKeyUpdate(String stripeResponseJson){ + if(this.pendingKeyUpdateListener != null) { + this.pendingKeyUpdateListener.onKeyUpdate(stripeResponseJson); + this.pendingKeyUpdateListener = null; //release the memory. the listener is not used anymore + } + } + + + /** + * + * Called from the JS land once we have the key + * + */ + @Override + public void onKeyUpdateFailure(int responseCode, String message) { + if(this.pendingKeyUpdateListener != null) { + this.pendingKeyUpdateListener.onKeyUpdateFailure(responseCode, message); + this.pendingKeyUpdateListener = null; //release the memory. the listener is not used anymore + } + } +} \ No newline at end of file diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index 5b23c83..aae20cb 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -23,6 +23,7 @@ import com.stripe.android.model.ConfirmPaymentIntentParams; import com.stripe.android.model.PaymentIntent; import com.stripe.android.model.PaymentMethodCreateParams; +import com.stripe.android.CustomerSession; import com.stripe.android.model.SetupIntent; import com.stripe.android.SetupIntentResult; @@ -33,6 +34,7 @@ public class StripePaymentsModule extends ReactContextBaseJavaModule { private static ReactApplicationContext reactContext; + private BridgeEphemeralKeyProvider ephemeralKeyProvider; private Stripe stripe; private Promise paymentPromise, setupPromise; @@ -66,6 +68,8 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode, context.addActivityEventListener(activityListener); reactContext = context; + + this.ephemeralKeyProvider = new BridgeEphemeralKeyProvider(reactContext); } @Override @@ -244,4 +248,25 @@ public void onError(Exception e) { promise.reject("StripeModule.failed", e.toString()); } } + + @ReactMethod + public void onEphemeralKeyUpdate(String rawKey) { + this.ephemeralKeyProvider.onKeyUpdate(rawKey); + } + + @ReactMethod + public void onEphemeralKeyUpdateFailure(Integer responseCode,String message) { + this.ephemeralKeyProvider.onKeyUpdateFailure(responseCode, message); + } + + + @ReactMethod + public void initCustomerSession() { + CustomerSession.initCustomerSession(reactContext, this.ephemeralKeyProvider); + } + + @ReactMethod + public void endCustomerSession() { + CustomerSession.endCustomerSession(); + } } From beaeb9f539ea9660f2ac875ac74bcd8b8694a8f8 Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Tue, 8 Sep 2020 19:34:35 +0300 Subject: [PATCH 45/69] index --- lib/index.tsx | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/lib/index.tsx b/lib/index.tsx index 3a3e950..943a219 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -1,5 +1,9 @@ import { NativeModules } from 'react-native'; import creditCardType from 'credit-card-type'; +import { + NativeEventEmitter, + EmitterSubscription, +} from "react-native"; const { StripePayments } = NativeModules; @@ -29,12 +33,17 @@ export interface SetupIntentResult { brand: string } +export type createEphemeralKeyCallback = (apiVersion: string) => string; + class Stripe { _stripeInitialized = false + eventEmitter: NativeEventEmitter; + ephemeralKeyListener?: EmitterSubscription; setOptions = (options: InitParams) => { if (this._stripeInitialized) { return; } StripePayments.init(options.publishingKey); + this.eventEmitter = new NativeEventEmitter(StripePayments); this._stripeInitialized = true; } @@ -67,6 +76,33 @@ class Stripe { isCardValid(cardDetails: CardParams): boolean { return StripePayments.isCardValid(cardDetails) == true; } + + /*** + * + * Customer session management + * + */ + initCustomerSession(createEphemeralKey: createEphemeralKeyCallback) { + //we communicate with the native side with events, as that is the only way to be able + //to call the callback multiple times (each time the ephemeral key expires) + this.ephemeralKeyListener = this.eventEmitter.addListener( + "CreateStripeEphemeralKey", + (apiVersion: string) => { + const rawKey = createEphemeralKey(apiVersion); + StripePayments.onEphemeralKeyUpdate(rawKey); + } + ); + + //this will internally call the CreateStripeEphemeralKey every time when needed + return StripePayments.initCustomerSession(); + } + + endCustomerSession() { + if (this.ephemeralKeyListener) { + this.ephemeralKeyListener.remove(); //Removes the listener + } + return StripePayments.endCustomerSession(); + } } export default new Stripe(); From d10ee43f079fbfd8e3e49a5dcf8718617f97b58a Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Wed, 9 Sep 2020 16:52:09 +0300 Subject: [PATCH 46/69] finish POC --- .../BridgeEphemeralKeyProvider.java | 33 ++++++++-- .../stripepayments/StripePaymentsModule.java | 66 ++++++++++++++++++- lib/index.tsx | 32 +++++++-- 3 files changed, 120 insertions(+), 11 deletions(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java b/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java index 887e4a5..bd9698f 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java +++ b/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java @@ -7,6 +7,7 @@ import com.facebook.react.modules.core.DeviceEventManagerModule; import com.facebook.react.bridge.WritableMap; import com.facebook.react.bridge.Arguments; +import com.facebook.react.bridge.UiThreadUtil; /** @@ -46,10 +47,20 @@ public void createEphemeralKey( * */ @Override - public void onKeyUpdate(String stripeResponseJson){ + public void onKeyUpdate(final String stripeResponseJson){ if(this.pendingKeyUpdateListener != null) { - this.pendingKeyUpdateListener.onKeyUpdate(stripeResponseJson); - this.pendingKeyUpdateListener = null; //release the memory. the listener is not used anymore + final EphemeralKeyUpdateListener keyUpdateListener = pendingKeyUpdateListener; + + // + // we need to make sure the listener is updated on the UI thread + // + UiThreadUtil.runOnUiThread(new Runnable() { + @Override + public void run() { + keyUpdateListener.onKeyUpdate(stripeResponseJson); + }}); + + this.pendingKeyUpdateListener = null; //avoid memory leaks. the listener is not used anymore } } @@ -60,10 +71,20 @@ public void onKeyUpdate(String stripeResponseJson){ * */ @Override - public void onKeyUpdateFailure(int responseCode, String message) { + public void onKeyUpdateFailure(final int responseCode, final String message) { if(this.pendingKeyUpdateListener != null) { - this.pendingKeyUpdateListener.onKeyUpdateFailure(responseCode, message); - this.pendingKeyUpdateListener = null; //release the memory. the listener is not used anymore + final EphemeralKeyUpdateListener keyUpdateListener = pendingKeyUpdateListener; + + // + // we need to make sure the listener is updated on the UI thread + // + UiThreadUtil.runOnUiThread(new Runnable() { + @Override + public void run() { + keyUpdateListener.onKeyUpdateFailure(responseCode, message); + }}); + + this.pendingKeyUpdateListener = null; //avoid memory leaks. the listener is not used anymore } } } \ No newline at end of file diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index aae20cb..dc4d575 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.content.Intent; +import androidx.activity.ComponentActivity; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.Promise; @@ -13,6 +14,7 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ActivityEventListener; import com.facebook.react.bridge.BaseActivityEventListener; +import com.facebook.react.bridge.UiThreadUtil; import com.facebook.react.bridge.WritableMap; import com.stripe.android.ApiResultCallback; @@ -24,6 +26,9 @@ import com.stripe.android.model.PaymentIntent; import com.stripe.android.model.PaymentMethodCreateParams; import com.stripe.android.CustomerSession; +import com.stripe.android.PaymentSession; +import com.stripe.android.PaymentSessionConfig; +import com.stripe.android.PaymentSessionData; import com.stripe.android.model.SetupIntent; import com.stripe.android.SetupIntentResult; @@ -255,7 +260,7 @@ public void onEphemeralKeyUpdate(String rawKey) { } @ReactMethod - public void onEphemeralKeyUpdateFailure(Integer responseCode,String message) { + public void onEphemeralKeyUpdateFailure(Integer responseCode, String message) { this.ephemeralKeyProvider.onKeyUpdateFailure(responseCode, message); } @@ -265,6 +270,65 @@ public void initCustomerSession() { CustomerSession.initCustomerSession(reactContext, this.ephemeralKeyProvider); } + @ReactMethod + public void presentPaymentMethodSelection() { + + // + // + // + UiThreadUtil.runOnUiThread(new Runnable() { + @Override + public void run() { + + final PaymentSession paymentSession = new PaymentSession( + (ComponentActivity) getCurrentActivity(), + new PaymentSessionConfig.Builder() + + // collect shipping information + .setShippingInfoRequired(false) + + // collect shipping method + .setShippingMethodsRequired(false) + + .build() + ); + + paymentSession.init( + new PaymentSession.PaymentSessionListener() { + @Override + public void onCommunicatingStateChanged( + boolean isCommunicating + ) { + // update UI, such as hiding or showing a progress bar + } + + @Override + public void onError( + int errorCode, + String errorMessage + ) { + // handle error + } + + @Override + public void onPaymentSessionDataChanged( + PaymentSessionData data + ) { + final PaymentMethod paymentMethod = data.getPaymentMethod(); + // use paymentMethod + } + } + ); + + //TODO: add payment method types as param + //TODO: show the amount, so people can remember what they are going to pay + paymentSession.setCartTotal(14.3); + + paymentSession.presentPaymentMethodSelection(null); + } + }); + } + @ReactMethod public void endCustomerSession() { CustomerSession.endCustomerSession(); diff --git a/lib/index.tsx b/lib/index.tsx index 943a219..1bab02b 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -33,7 +33,9 @@ export interface SetupIntentResult { brand: string } -export type createEphemeralKeyCallback = (apiVersion: string) => string; +export type createEphemeralKeyCallback = ( + apiVersion: string +) => Promise; class Stripe { _stripeInitialized = false @@ -83,13 +85,31 @@ class Stripe { * */ initCustomerSession(createEphemeralKey: createEphemeralKeyCallback) { + invariant(this.eventEmitter, "Stripe SDK is not initialized"); + + //we already have a listner setup, so remove it + //this can happen especially during dev when certain UI components refresh + if (this.ephemeralKeyListener) { + console.log("remove prev listener"); + this.ephemeralKeyListener.remove(); + } + //we communicate with the native side with events, as that is the only way to be able //to call the callback multiple times (each time the ephemeral key expires) this.ephemeralKeyListener = this.eventEmitter.addListener( "CreateStripeEphemeralKey", - (apiVersion: string) => { - const rawKey = createEphemeralKey(apiVersion); - StripePayments.onEphemeralKeyUpdate(rawKey); + async (apiVersion: string) => { + try { + const rawKey = await createEphemeralKey(apiVersion); + console.log("generated key", rawKey); + StripePayments.onEphemeralKeyUpdate(rawKey); + } catch (e) { + console.log("generated key failed", e.code, e.message); + StripePayments.onEphemeralKeyUpdateFailure( + 0, + e?.message ?? "UNKOWN ERROR" + ); + } } ); @@ -97,6 +117,10 @@ class Stripe { return StripePayments.initCustomerSession(); } + presentPaymentMethodSelection() { + return StripePayments.presentPaymentMethodSelection(); + } + endCustomerSession() { if (this.ephemeralKeyListener) { this.ephemeralKeyListener.remove(); //Removes the listener From 6d987b4f0cf179fc9e8c3b71df99db416e0f5b5c Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Wed, 9 Sep 2020 23:42:55 +0300 Subject: [PATCH 47/69] add support for payment method type --- .../stripepayments/StripePaymentsModule.java | 48 ++++++++++++++----- lib/index.tsx | 31 +++++++++++- 2 files changed, 66 insertions(+), 13 deletions(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index dc4d575..5776262 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -1,6 +1,11 @@ package com.fitpassu.stripepayments; import java.lang.String; +import java.util.List; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; import android.app.Activity; import android.content.Intent; @@ -12,6 +17,7 @@ import com.facebook.react.bridge.ReactContextBaseJavaModule; import com.facebook.react.bridge.ReactMethod; import com.facebook.react.bridge.ReadableMap; +import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ActivityEventListener; import com.facebook.react.bridge.BaseActivityEventListener; import com.facebook.react.bridge.UiThreadUtil; @@ -254,6 +260,19 @@ public void onError(Exception e) { } } + @Override + public Map getConstants() { + final Map constants = new HashMap<>(); + constants.put("PaymentMethod", Collections.unmodifiableMap(new HashMap() { + { + for (PaymentMethod.Type type : PaymentMethod.Type.values()) { + put(type.code, type.name()); + } + } + })); + return constants; + } + @ReactMethod public void onEphemeralKeyUpdate(String rawKey) { this.ephemeralKeyProvider.onKeyUpdate(rawKey); @@ -271,7 +290,7 @@ public void initCustomerSession() { } @ReactMethod - public void presentPaymentMethodSelection() { + public void presentPaymentMethodSelection(final ReadableArray paymentMethodTypes) { // // @@ -280,17 +299,28 @@ public void presentPaymentMethodSelection() { @Override public void run() { - final PaymentSession paymentSession = new PaymentSession( - (ComponentActivity) getCurrentActivity(), - new PaymentSessionConfig.Builder() - + PaymentSessionConfig.Builder config = new PaymentSessionConfig.Builder() + // collect shipping information .setShippingInfoRequired(false) // collect shipping method - .setShippingMethodsRequired(false) + .setShippingMethodsRequired(false); - .build() + + //convert the JS enum to Stripe SDK enums + if (paymentMethodTypes != null) { + List result = new ArrayList(paymentMethodTypes.size()); + for (int i = 0; i < paymentMethodTypes.size(); i++) { + result.add(PaymentMethod.Type.valueOf(paymentMethodTypes.getString(i))); + } + + config.setPaymentMethodTypes(result); + } + + PaymentSession paymentSession = new PaymentSession( + (ComponentActivity) getCurrentActivity(), + config.build() ); paymentSession.init( @@ -320,10 +350,6 @@ public void onPaymentSessionDataChanged( } ); - //TODO: add payment method types as param - //TODO: show the amount, so people can remember what they are going to pay - paymentSession.setCartTotal(14.3); - paymentSession.presentPaymentMethodSelection(null); } }); diff --git a/lib/index.tsx b/lib/index.tsx index 1bab02b..5b35088 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -37,6 +37,23 @@ export type createEphemeralKeyCallback = ( apiVersion: string ) => Promise; +export enum PaymentMethodType { + Alipay = "Alipay", + AuBecsDebit = "AuBecsDebit", + BacsDebit = "BacsDebit", + Bancontact = "Bancontact", + Card = "Card", + CardPresent = "CardPresent", + Eps = "Eps", + Fpx = "Fpx", + Giropay = "Giropay", + Ideal = "Ideal", + Oxxo = "Oxxo", + P24 = "P24", + SepaDebit = "SepaDebit", + Sofort = "Sofort", +} + class Stripe { _stripeInitialized = false eventEmitter: NativeEventEmitter; @@ -117,8 +134,18 @@ class Stripe { return StripePayments.initCustomerSession(); } - presentPaymentMethodSelection() { - return StripePayments.presentPaymentMethodSelection(); + /** + * + * According to this + * https://github.com/stripe/stripe-android/blob/master/stripe/src/main/java/com/stripe/android/view/PaymentMethodsAdapter.kt#L78 + * The only payment methods supported by the basic integration is currently Card, Fpx + * + * @param paymentMethodTypes + */ + presentPaymentMethodSelection( + paymentMethodTypes: (PaymentMethodType.Card | PaymentMethodType.Fpx)[] + ) { + return StripePayments.presentPaymentMethodSelection(paymentMethodTypes); } endCustomerSession() { From ede2d3556169781134e5f5e72bf8004f1e2e38e9 Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Thu, 10 Sep 2020 00:16:42 +0300 Subject: [PATCH 48/69] improve dev ux by using invariant --- lib/index.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/lib/index.tsx b/lib/index.tsx index 5b35088..f8e2c3b 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -107,7 +107,6 @@ class Stripe { //we already have a listner setup, so remove it //this can happen especially during dev when certain UI components refresh if (this.ephemeralKeyListener) { - console.log("remove prev listener"); this.ephemeralKeyListener.remove(); } @@ -118,10 +117,9 @@ class Stripe { async (apiVersion: string) => { try { const rawKey = await createEphemeralKey(apiVersion); - console.log("generated key", rawKey); + invariant(rawKey, "EphemeralKey cannot be null"); //doing it here provides a better dev experience (as you see the red box) instead of a complete crash if we let the native side get it StripePayments.onEphemeralKeyUpdate(rawKey); } catch (e) { - console.log("generated key failed", e.code, e.message); StripePayments.onEphemeralKeyUpdateFailure( 0, e?.message ?? "UNKOWN ERROR" From 27b1a3e9d7d0e0c49e2f6aa43f39a4d67fd42afc Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Thu, 10 Sep 2020 00:30:50 +0300 Subject: [PATCH 49/69] fix handling of params to the ephemeralKey callback --- lib/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/index.tsx b/lib/index.tsx index f8e2c3b..e0d2a65 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -114,9 +114,9 @@ class Stripe { //to call the callback multiple times (each time the ephemeral key expires) this.ephemeralKeyListener = this.eventEmitter.addListener( "CreateStripeEphemeralKey", - async (apiVersion: string) => { + async (event: { apiVersion: string }) => { try { - const rawKey = await createEphemeralKey(apiVersion); + const rawKey = await createEphemeralKey(event.apiVersion); invariant(rawKey, "EphemeralKey cannot be null"); //doing it here provides a better dev experience (as you see the red box) instead of a complete crash if we let the native side get it StripePayments.onEphemeralKeyUpdate(rawKey); } catch (e) { From f9445a77ce912c79b58ca6bae7b376455eb9f17e Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Thu, 10 Sep 2020 00:43:11 +0300 Subject: [PATCH 50/69] properly transmit the ephemeralKey to the native side --- lib/index.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/index.tsx b/lib/index.tsx index e0d2a65..ce362f1 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -118,7 +118,9 @@ class Stripe { try { const rawKey = await createEphemeralKey(event.apiVersion); invariant(rawKey, "EphemeralKey cannot be null"); //doing it here provides a better dev experience (as you see the red box) instead of a complete crash if we let the native side get it - StripePayments.onEphemeralKeyUpdate(rawKey); + StripePayments.onEphemeralKeyUpdate( + typeof rawKey === "string" ? rawKey : JSON.stringify(rawKey) + ); } catch (e) { StripePayments.onEphemeralKeyUpdateFailure( 0, From 7fb8be1297932c932591898153813722c2783275 Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Thu, 10 Sep 2020 15:34:44 +0300 Subject: [PATCH 51/69] improve error handling --- lib/index.tsx | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/index.tsx b/lib/index.tsx index ce362f1..05be460 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -113,14 +113,19 @@ class Stripe { //we communicate with the native side with events, as that is the only way to be able //to call the callback multiple times (each time the ephemeral key expires) this.ephemeralKeyListener = this.eventEmitter.addListener( - "CreateStripeEphemeralKey", + "StripeModule.createEphemeralKey", async (event: { apiVersion: string }) => { try { const rawKey = await createEphemeralKey(event.apiVersion); - invariant(rawKey, "EphemeralKey cannot be null"); //doing it here provides a better dev experience (as you see the red box) instead of a complete crash if we let the native side get it - StripePayments.onEphemeralKeyUpdate( - typeof rawKey === "string" ? rawKey : JSON.stringify(rawKey) + //while we use typescript and such errors will be determined at compile time + //if somebody is using the module in JS, the app will simply crash, so + //provide a better dev experience (as you see the red box) + invariant(rawKey, "EphemeralKey cannot be null"); + invariant( + typeof rawKey === "string", + "EphemeralKey needs to be a string" ); + StripePayments.onEphemeralKeyUpdate(rawKey); } catch (e) { StripePayments.onEphemeralKeyUpdateFailure( 0, From 68b9792c8e99a3c8102478dc16c8a8a1699c2220 Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Thu, 10 Sep 2020 15:50:32 +0300 Subject: [PATCH 52/69] small rename --- .../com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java b/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java index bd9698f..1b03cea 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java +++ b/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java @@ -38,7 +38,7 @@ public void createEphemeralKey( //async call the JS land reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("CreateStripeEphemeralKey", params); + .emit("StripeModule.createEphemeralKey", params); } /** From cf89d998bf65f40e652dd99eb05ed636b2d19735 Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Sun, 13 Sep 2020 20:38:21 +0300 Subject: [PATCH 53/69] present payment methods works again --- lib/index.tsx | 54 ++++++++++++++++++++++++++++++++++------ lib/usePaymentSession.ts | 25 +++++++++++++++++++ 2 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 lib/usePaymentSession.ts diff --git a/lib/index.tsx b/lib/index.tsx index 05be460..2ccd0ef 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -4,6 +4,7 @@ import { NativeEventEmitter, EmitterSubscription, } from "react-native"; +import invariant from "invariant"; const { StripePayments } = NativeModules; @@ -54,15 +55,32 @@ export enum PaymentMethodType { Sofort = "Sofort", } -class Stripe { - _stripeInitialized = false +/* Partial implementation (Card only / for now) */ +export interface PaymentMethod { + id: string; + created: number; + liveMode: boolean; + card?: { + brandDisplayName: string; + expiryMonth: number; + expiryYear: number; + funding: string; + last4: string; + }; +} + +class Stripe extends NativeEventEmitter { + constructor() { + super(StripePayments); + } + + _stripeInitialized = false; eventEmitter: NativeEventEmitter; ephemeralKeyListener?: EmitterSubscription; setOptions = (options: InitParams) => { if (this._stripeInitialized) { return; } StripePayments.init(options.publishingKey); - this.eventEmitter = new NativeEventEmitter(StripePayments); this._stripeInitialized = true; } @@ -139,6 +157,17 @@ class Stripe { return StripePayments.initCustomerSession(); } + /** + * + * Start a payment session for the customer session + * @param paymentMethodTypes + */ + createPaymentSession( + paymentMethodTypes: (PaymentMethodType.Card | PaymentMethodType.Fpx)[] = [] + ) { + return StripePayments.createPaymentSession(paymentMethodTypes); + } + /** * * According to this @@ -147,10 +176,19 @@ class Stripe { * * @param paymentMethodTypes */ - presentPaymentMethodSelection( - paymentMethodTypes: (PaymentMethodType.Card | PaymentMethodType.Fpx)[] + presentPaymentMethodSelection() { + return StripePayments.presentPaymentMethodSelection(); + } + + /** + * + * + * @param paymentMethodTypes + */ + addPaymentMethod( + paymentMethodType: PaymentMethodType.Card | PaymentMethodType.Fpx ) { - return StripePayments.presentPaymentMethodSelection(paymentMethodTypes); + return StripePayments.addPaymentMethod(paymentMethodType); } endCustomerSession() { @@ -161,4 +199,6 @@ class Stripe { } } -export default new Stripe(); +const stripe = new Stripe(); //helps with autocomplete in VS Code + +export default stripe; diff --git a/lib/usePaymentSession.ts b/lib/usePaymentSession.ts new file mode 100644 index 0000000..df7c7b9 --- /dev/null +++ b/lib/usePaymentSession.ts @@ -0,0 +1,25 @@ +import { useEffect, useState } from "react"; +import stripe, { PaymentMethod } from "./index"; + +/** + * + * Manages the payment session and links it to React's lifecycle + * + */ +export default function usePaymentSession() { + const [paymentMethod, setPaymentMethod] = useState(); + + useEffect(() => { + //create a listener for paymentMethod + const listener = stripe.addListener( + "StripeModule.PaymentSession.onPaymentMethodSelected", + setPaymentMethod + ); + + stripe.createPaymentSession(); + + return listener.remove; //when ui is destroyed, stop listening anymore to this session + }, []); + + return paymentMethod; +} From 0b23313fce10f94c99d234e5843d8109193bd599 Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Sun, 13 Sep 2020 22:16:19 +0300 Subject: [PATCH 54/69] properly handle events --- .../BridgeEphemeralKeyProvider.java | 2 +- lib/index.tsx | 41 +++++++++++++++---- lib/usePaymentSession.ts | 8 ++-- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java b/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java index 1b03cea..8c1702b 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java +++ b/android/src/main/java/com/fitpassu/stripepayments/BridgeEphemeralKeyProvider.java @@ -38,7 +38,7 @@ public void createEphemeralKey( //async call the JS land reactContext .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) - .emit("StripeModule.createEphemeralKey", params); + .emit("stripeCreateEphemeralKey", params); } /** diff --git a/lib/index.tsx b/lib/index.tsx index 2ccd0ef..c37564e 100644 --- a/lib/index.tsx +++ b/lib/index.tsx @@ -69,11 +69,16 @@ export interface PaymentMethod { }; } -class Stripe extends NativeEventEmitter { - constructor() { - super(StripePayments); - } +//inspired from the Keyboard module +//https://github.com/facebook/react-native/blob/master/Libraries/Components/Keyboard/Keyboard.js +const eventEmitter = new NativeEventEmitter(NativeModules.StripePayments); + +export type StripeEventName = + | "stripeCreateEphemeralKey" + | "stripePaymentMethodSelected"; +export type StripeEvent = ""; +class Stripe { _stripeInitialized = false; eventEmitter: NativeEventEmitter; ephemeralKeyListener?: EmitterSubscription; @@ -120,8 +125,6 @@ class Stripe extends NativeEventEmitter { * */ initCustomerSession(createEphemeralKey: createEphemeralKeyCallback) { - invariant(this.eventEmitter, "Stripe SDK is not initialized"); - //we already have a listner setup, so remove it //this can happen especially during dev when certain UI components refresh if (this.ephemeralKeyListener) { @@ -130,8 +133,8 @@ class Stripe extends NativeEventEmitter { //we communicate with the native side with events, as that is the only way to be able //to call the callback multiple times (each time the ephemeral key expires) - this.ephemeralKeyListener = this.eventEmitter.addListener( - "StripeModule.createEphemeralKey", + this.ephemeralKeyListener = eventEmitter.addListener( + "stripeCreateEphemeralKey", async (event: { apiVersion: string }) => { try { const rawKey = await createEphemeralKey(event.apiVersion); @@ -197,6 +200,28 @@ class Stripe extends NativeEventEmitter { } return StripePayments.endCustomerSession(); } + + /** + * Event Listeners + */ + addListener( + eventName: "stripePaymentMethodSelected", + callback: (paymentMethod: PaymentMethod) => void + ): void; //while the native eventEmitter does return a EventSubscription, calling remove on it durin unmount will fail. This is how all @react-native-community/hooks work + addListener(eventName: StripeEventName, callback: (e: any) => void) { + return eventEmitter.addListener(eventName, callback); + } + + /** + * + */ + removeListener( + eventName: "stripePaymentMethodSelected", + callback: (paymentMethod: PaymentMethod) => void + ): void; + removeListener(eventName: StripeEventName, callback: (e: any) => void) { + return eventEmitter.removeListener(eventName, callback); + } } const stripe = new Stripe(); //helps with autocomplete in VS Code diff --git a/lib/usePaymentSession.ts b/lib/usePaymentSession.ts index df7c7b9..d22d8ef 100644 --- a/lib/usePaymentSession.ts +++ b/lib/usePaymentSession.ts @@ -11,14 +11,12 @@ export default function usePaymentSession() { useEffect(() => { //create a listener for paymentMethod - const listener = stripe.addListener( - "StripeModule.PaymentSession.onPaymentMethodSelected", - setPaymentMethod - ); + stripe.addListener("stripePaymentMethodSelected", setPaymentMethod); stripe.createPaymentSession(); - return listener.remove; //when ui is destroyed, stop listening anymore to this session + return () => + stripe.removeListener("stripePaymentMethodSelected", setPaymentMethod); //when ui is destroyed, stop listening anymore to this session }, []); return paymentMethod; From 24fb3c85c79d46e19f24121b78e0f0785b6cb757 Mon Sep 17 00:00:00 2001 From: Andrei Barabas Date: Mon, 14 Sep 2020 02:43:51 +0300 Subject: [PATCH 55/69] wip --- .../stripepayments/StripePaymentsModule.java | 151 +++++++++++++++--- .../stripe_add_payment_method_footer.xml | 16 ++ lib/index.tsx | 6 +- 3 files changed, 146 insertions(+), 27 deletions(-) create mode 100644 android/src/main/res/layout/stripe_add_payment_method_footer.xml diff --git a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java index 5776262..3774f9f 100644 --- a/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java +++ b/android/src/main/java/com/fitpassu/stripepayments/StripePaymentsModule.java @@ -41,34 +41,69 @@ import com.stripe.android.model.ConfirmSetupIntentParams; import com.stripe.android.model.PaymentMethod; import com.stripe.android.model.PaymentMethod.BillingDetails; +import com.stripe.android.view.AddPaymentMethodActivityStarter; +import com.facebook.react.modules.core.DeviceEventManagerModule; + +import android.util.Log; public class StripePaymentsModule extends ReactContextBaseJavaModule { + private static final String TAG = "StripePayments"; private static ReactApplicationContext reactContext; private BridgeEphemeralKeyProvider ephemeralKeyProvider; private Stripe stripe; - private Promise paymentPromise, setupPromise; - private String current= " temp_val"; + private Promise paymentPromise, setupPromise, addCardPromise; + private PaymentSession paymentSession; - boolean handled; private final ActivityEventListener activityListener = new BaseActivityEventListener() { @Override public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) { - if ((paymentPromise == null && setupPromise == null) || stripe == null) { - super.onActivityResult(activity, requestCode, resultCode, data); - return; - } - - if(current.equals("Payment")){ - handled = stripe.onPaymentResult(requestCode, data, new PaymentResultCallback(paymentPromise)); - }else if(current.equals("Setup")){ - handled = stripe.onSetupResult(requestCode, data, new SetupResultCallback(setupPromise)); + // + //Rewritten according to the official sample + //https://github.com/stripe-samples/sample-store-android/blob/5ab40e92dc9a2fb1881396dc5050e760d8e27c77/app/src/main/java/com/stripe/android/samplestore/PaymentActivity.kt#L151 + // + super.onActivityResult(activity, requestCode, resultCode, data); + + boolean isPaymentIntentResult = stripe != null && stripe.onPaymentResult(requestCode, data, new PaymentResultCallback(paymentPromise)); + Log.d(TAG, "onActivityResult: isPaymentIntent=" + isPaymentIntentResult + " data:" + data.toString()); + if(!isPaymentIntentResult) { + boolean isSetupIntentResult = stripe != null && stripe.onSetupResult(requestCode, data, new SetupResultCallback(setupPromise)); + Log.d(TAG, "onActivityResult: isSetupIntentResult=" + isPaymentIntentResult + " data:" + data.toString()); + if (!isSetupIntentResult && data != null && paymentSession != null) { + paymentSession.handlePaymentData(requestCode, resultCode, data); + } } - if (!handled){ - super.onActivityResult(activity, requestCode, resultCode, data); + /** + * handle the add payment results (if needed) + * see: https://github.com/stripe/stripe-android/blob/02f0a75b11143fb9618b482b6b0e2f9b28a9953f/stripe/src/main/java/com/stripe/android/view/PaymentMethodsActivity.kt#L174 + */ + if(requestCode == AddPaymentMethodActivityStarter.REQUEST_CODE && addCardPromise != null) { + + AddPaymentMethodActivityStarter.Result result = AddPaymentMethodActivityStarter.Result.fromIntent(data); + + if(result instanceof AddPaymentMethodActivityStarter.Result.Success) { + + AddPaymentMethodActivityStarter.Result.Success successResult = (AddPaymentMethodActivityStarter.Result.Success) result; + + WritableMap map = convertPaymentMethod(successResult.getPaymentMethod()); + + addCardPromise.resolve(map); + } else if (result instanceof AddPaymentMethodActivityStarter.Result.Canceled) { + addCardPromise.reject("StripeModule.cancelled", ""); + } else if (result instanceof AddPaymentMethodActivityStarter.Result.Failure) { + + AddPaymentMethodActivityStarter.Result.Failure failureResult = (AddPaymentMethodActivityStarter.Result.Failure) result; + + addCardPromise.reject("StripeModule.failed", failureResult.getException().getMessage()); + } + else { + // no-op + } + + addCardPromise = null; //release it } } }; @@ -85,7 +120,7 @@ public void onActivityResult(Activity activity, int requestCode, int resultCode, @Override public String getName() { - return "StripePayments"; + return TAG; } @ReactMethod(isBlockingSynchronousMethod = true) @@ -110,7 +145,6 @@ public boolean isCardValid(ReadableMap cardParams) { @ReactMethod public void confirmPaymentWithCardParams(String secret, ReadableMap cardParams, final Promise promise) { - current = "Payment"; stripe = new Stripe( reactContext, PaymentConfiguration.getInstance(reactContext).getPublishableKey() @@ -139,7 +173,6 @@ public void confirmPaymentWithCardParams(String secret, ReadableMap cardParams, @ReactMethod public void confirmPaymentWithPaymentMethodId(String secret, String paymentMethodId, final Promise promise) { - current = "Payment"; stripe = new Stripe( reactContext, PaymentConfiguration.getInstance(reactContext).getPublishableKey() @@ -194,7 +227,6 @@ public void onError(Exception e) { } @ReactMethod public void confirmSetup(String secret, ReadableMap cardParams, final Promise promise) { - current = "Setup"; PaymentMethodCreateParams.Card card = new PaymentMethodCreateParams.Card( cardParams.getString("number"), cardParams.getInt("expMonth"), @@ -290,10 +322,10 @@ public void initCustomerSession() { } @ReactMethod - public void presentPaymentMethodSelection(final ReadableArray paymentMethodTypes) { + public void createPaymentSession(final ReadableArray paymentMethodTypes) { // - // + // Stripe Payment Session Listeners work only on the main thread // UiThreadUtil.runOnUiThread(new Runnable() { @Override @@ -318,7 +350,7 @@ public void run() { config.setPaymentMethodTypes(result); } - PaymentSession paymentSession = new PaymentSession( + paymentSession = new PaymentSession( (ComponentActivity) getCurrentActivity(), config.build() ); @@ -343,20 +375,89 @@ public void onError( @Override public void onPaymentSessionDataChanged( PaymentSessionData data - ) { - final PaymentMethod paymentMethod = data.getPaymentMethod(); - // use paymentMethod + ) { + if (data.isPaymentReadyToCharge()) { + final PaymentMethod paymentMethod = data.getPaymentMethod(); + + WritableMap map = convertPaymentMethod(paymentMethod); + + //async call the JS land + reactContext + .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) + .emit("stripePaymentMethodSelected", map); + } } } ); + } + }); + } - paymentSession.presentPaymentMethodSelection(null); + @ReactMethod + public void presentPaymentMethodSelection(final String paymentMethodId, final Promise promise) { + + // + // Stripe Payment Session Listeners work only on the main thread + // + UiThreadUtil.runOnUiThread(new Runnable() { + @Override + public void run() { + + paymentSession.presentPaymentMethodSelection(paymentMethodId); } }); } + @ReactMethod + public void addPaymentMethod(String paymentMethodType, final Promise promise) { + + addCardPromise = promise; + new AddPaymentMethodActivityStarter(getCurrentActivity()) + .startForResult(new AddPaymentMethodActivityStarter.Args.Builder() + .setPaymentMethodType(PaymentMethod.Type.valueOf(paymentMethodType)) + .setShouldAttachToCustomer(true) + .setAddPaymentMethodFooter(R.layout.stripe_add_payment_method_footer) //just in case somebody wants to add a footer + + //TODO: make the footer an enum: "other_payment_methods" | "none" + .build() + ); + + //after the start, capture the other button and listen to it + //https://developer.android.com/guide/topics/ui/controls/button + +// promise.reject('cancel') + } + @ReactMethod public void endCustomerSession() { CustomerSession.endCustomerSession(); } + + /** + * + * Convert a payment method to a JS object so it can be sent across the bridge + * + */ + protected WritableMap convertPaymentMethod(PaymentMethod paymentMethod) { + + //finish the promise; + WritableMap map = Arguments.createMap(); + map.putString("id", paymentMethod.id); + map.putDouble("created", paymentMethod.created); + map.putBoolean("liveMode", paymentMethod.liveMode); + + if(paymentMethod.card != null) { + + WritableMap cardMap = Arguments.createMap(); + cardMap.putString("brand", paymentMethod.card.brand.getDisplayName()); //mimic the stripe.js model https://stripe.com/docs/api/cards/object#card_object-brand + cardMap.putInt("expiryMonth", paymentMethod.card.expiryMonth); + cardMap.putInt("expiryYear", paymentMethod.card.expiryYear); + cardMap.putString("funding", paymentMethod.card.funding); + cardMap.putString("last4", paymentMethod.card.last4); + + map.putMap("card", cardMap); + } + + return map; + } } diff --git a/android/src/main/res/layout/stripe_add_payment_method_footer.xml b/android/src/main/res/layout/stripe_add_payment_method_footer.xml new file mode 100644 index 0000000..c3b35bd --- /dev/null +++ b/android/src/main/res/layout/stripe_add_payment_method_footer.xml @@ -0,0 +1,16 @@ + + + +