diff --git a/automl_mlkit/.gitignore b/automl_mlkit/.gitignore deleted file mode 100644 index aab04fb..0000000 --- a/automl_mlkit/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.DS_Store -.dart_tool/ - -.packages -.pub/ - -build/ -example/pubspec.lock diff --git a/automl_mlkit/.metadata b/automl_mlkit/.metadata deleted file mode 100644 index 623f2ab..0000000 --- a/automl_mlkit/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: 8661d8aecd626f7f57ccbcb735553edc05a2e713 - channel: beta - -project_type: plugin diff --git a/automl_mlkit/CHANGELOG.md b/automl_mlkit/CHANGELOG.md deleted file mode 100644 index 41cc7d8..0000000 --- a/automl_mlkit/CHANGELOG.md +++ /dev/null @@ -1,3 +0,0 @@ -## 0.0.1 - -* TODO: Describe initial release. diff --git a/automl_mlkit/LICENSE b/automl_mlkit/LICENSE deleted file mode 100644 index ba75c69..0000000 --- a/automl_mlkit/LICENSE +++ /dev/null @@ -1 +0,0 @@ -TODO: Add your license here. diff --git a/automl_mlkit/README.md b/automl_mlkit/README.md deleted file mode 100644 index 763e071..0000000 --- a/automl_mlkit/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# automl_mlkit - -This is the flutter plugin used by the flutter app to interact with the -underlying AutoML Vision Edge in ML Kit SDKs. - -> Note: This flutter plugin does not offer the full API provided by the AutoML Vision Edge in ML Kit SDKs. For a fully featured plugin, keep an eye out for it in [official plugins repository](https://github.com/flutter/plugins/). diff --git a/automl_mlkit/android/.gitignore b/automl_mlkit/android/.gitignore deleted file mode 100644 index c6cbe56..0000000 --- a/automl_mlkit/android/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -*.iml -.gradle -/local.properties -/.idea/workspace.xml -/.idea/libraries -.DS_Store -/build -/captures diff --git a/automl_mlkit/android/build.gradle b/automl_mlkit/android/build.gradle deleted file mode 100644 index e4ee6fa..0000000 --- a/automl_mlkit/android/build.gradle +++ /dev/null @@ -1,42 +0,0 @@ -group 'com.google.automlkit.automl_mlkit' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' - } -} - -rootProject.allprojects { - repositories { - maven { - url '../third_party/m2repository' - } - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - - dependencies { - api 'com.google.firebase:firebase-ml-vision:20.0.0' - api 'com.google.firebase:firebase-ml-vision-automl:16.0.0' - } -} diff --git a/automl_mlkit/android/gradle.properties b/automl_mlkit/android/gradle.properties deleted file mode 100644 index 8bd86f6..0000000 --- a/automl_mlkit/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/automl_mlkit/android/gradle/wrapper/gradle-wrapper.jar b/automl_mlkit/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index f6b961f..0000000 Binary files a/automl_mlkit/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/automl_mlkit/android/gradle/wrapper/gradle-wrapper.properties b/automl_mlkit/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e806f81..0000000 --- a/automl_mlkit/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Wed Mar 13 11:06:17 PDT 2019 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/automl_mlkit/android/gradlew b/automl_mlkit/android/gradlew deleted file mode 100644 index cccdd3d..0000000 --- a/automl_mlkit/android/gradlew +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env sh - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/automl_mlkit/android/gradlew.bat b/automl_mlkit/android/gradlew.bat deleted file mode 100644 index e95643d..0000000 --- a/automl_mlkit/android/gradlew.bat +++ /dev/null @@ -1,84 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/automl_mlkit/android/settings.gradle b/automl_mlkit/android/settings.gradle deleted file mode 100644 index a9139d0..0000000 --- a/automl_mlkit/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'automl_mlkit' diff --git a/automl_mlkit/android/src/main/AndroidManifest.xml b/automl_mlkit/android/src/main/AndroidManifest.xml deleted file mode 100644 index 48f6170..0000000 --- a/automl_mlkit/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/automl_mlkit/android/src/main/java/com/google/automlkit/automl_mlkit/AutomlMlkitPlugin.java b/automl_mlkit/android/src/main/java/com/google/automlkit/automl_mlkit/AutomlMlkitPlugin.java deleted file mode 100644 index 5d9c956..0000000 --- a/automl_mlkit/android/src/main/java/com/google/automlkit/automl_mlkit/AutomlMlkitPlugin.java +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.automlkit.automl_mlkit; - -import android.net.Uri; -import android.os.SystemClock; -import androidx.annotation.NonNull; - -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.firebase.ml.common.FirebaseMLException; -import com.google.firebase.ml.common.modeldownload.FirebaseLocalModel; -import com.google.firebase.ml.common.modeldownload.FirebaseModelManager; -import com.google.firebase.ml.vision.FirebaseVision; -import com.google.firebase.ml.vision.common.FirebaseVisionImage; -import com.google.firebase.ml.vision.label.FirebaseVisionImageLabel; -import com.google.firebase.ml.vision.label.FirebaseVisionImageLabeler; -import com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceAutoMLImageLabelerOptions; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.MethodChannel.MethodCallHandler; -import io.flutter.plugin.common.MethodChannel.Result; -import io.flutter.plugin.common.PluginRegistry.Registrar; -import java.util.Map; - -public class AutomlMlkitPlugin implements MethodCallHandler { - - private final Registrar registrar; - - private FirebaseVisionImageLabeler labeler; - - private static final String RUN_MODEL_ON_IMAGE_METHOD = "runModelOnImage"; - private static final String LOAD_MODEL_FROM_CACHE_METHOD = "loadModelFromCache"; - private static final String MANIFEST_FILE = "manifest.json"; - - /** - * Plugin registration. - */ - public static void registerWith(Registrar registrar) { - final MethodChannel channel = new MethodChannel(registrar.messenger(), "automl_mlkit"); - channel.setMethodCallHandler(new AutomlMlkitPlugin(registrar)); - } - - private AutomlMlkitPlugin(Registrar registrar) { - this.registrar = registrar; - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - case LOAD_MODEL_FROM_CACHE_METHOD: { - // TODO: This should take a dataset name or model name. For now, just load the model - // from the cached dir - try { - String datasetName = call.argument("dataset"); - loadModelFromCache(datasetName, result); - } catch (Exception e) { - result.error("load_model", e.getMessage(), e); - } - break; - } - case RUN_MODEL_ON_IMAGE_METHOD: { - try { - String imagePath = call.argument("imagePath"); - runModelOnImage(imagePath, result); - } catch (Exception e) { - result.error("run_model_on_image", e.getMessage(), e); - } - break; - } - default: { - result.notImplemented(); - break; - } - } - } - - /** - * Creates a new labeler based on the contents of manifest.json in app's cache dir - */ - private void loadModelFromCache(String datasetName, Result result) throws Exception { - // create a new unique model name for MLKit - String modelName = datasetName + SystemClock.elapsedRealtime(); - - File datasetFolder = new File(registrar.context().getCacheDir(), datasetName); - File manifestJson = new File(datasetFolder, MANIFEST_FILE); - FirebaseLocalModel localModel = new FirebaseLocalModel.Builder(modelName) - .setFilePath(manifestJson.getAbsolutePath()) - .build(); - FirebaseModelManager.getInstance().registerLocalModel(localModel); - - // construct the options - FirebaseVisionOnDeviceAutoMLImageLabelerOptions labelerOptions = - new FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder() - .setLocalModelName(modelName) - .build(); - - labeler = FirebaseVision.getInstance().getOnDeviceAutoMLImageLabeler(labelerOptions); - result.success(null); - } - - /** - * Runs an inference on an image. Note: model needs to be loaded before an inference can be run - */ - private void runModelOnImage(String imagePath, final Result result) throws FirebaseMLException { - FirebaseVisionImage image; - - try { - image = readImageFromPath(imagePath); - } catch (IOException e) { - result.error("run_model_on_image", e.getMessage(), e); - return; - } - - labeler.processImage(image) - .addOnSuccessListener(new OnSuccessListener>() { - @Override - public void onSuccess(List firebaseVisionImageLabels) { - List> labels = new ArrayList<>(firebaseVisionImageLabels.size()); - for (FirebaseVisionImageLabel label : firebaseVisionImageLabels) { - Map labelData = new HashMap<>(); - labelData.put("confidence", (double) label.getConfidence()); - labelData.put("label", label.getText()); - labels.add(labelData); - } - result.success(labels); - } - }).addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("run_model_on_image", e.getMessage(), e); - } - }); - } - - // TODO: account for rotation - private FirebaseVisionImage readImageFromPath(String imagePath) throws IOException { - File imageFile = new File(imagePath); - return FirebaseVisionImage.fromFilePath(registrar.context(), Uri.fromFile(imageFile)); - } -} diff --git a/automl_mlkit/automl_mlkit.iml b/automl_mlkit/automl_mlkit.iml deleted file mode 100644 index 73e7ebd..0000000 --- a/automl_mlkit/automl_mlkit.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/automl_mlkit/example/.gitignore b/automl_mlkit/example/.gitignore deleted file mode 100644 index 07488ba..0000000 --- a/automl_mlkit/example/.gitignore +++ /dev/null @@ -1,70 +0,0 @@ -# Miscellaneous -*.class -*.log -*.pyc -*.swp -.DS_Store -.atom/ -.buildlog/ -.history -.svn/ - -# IntelliJ related -*.iml -*.ipr -*.iws -.idea/ - -# Visual Studio Code related -.vscode/ - -# Flutter/Dart/Pub related -**/doc/api/ -.dart_tool/ -.flutter-plugins -.packages -.pub-cache/ -.pub/ -/build/ - -# Android related -**/android/**/gradle-wrapper.jar -**/android/.gradle -**/android/captures/ -**/android/gradlew -**/android/gradlew.bat -**/android/local.properties -**/android/**/GeneratedPluginRegistrant.java - -# iOS/XCode related -**/ios/**/*.mode1v3 -**/ios/**/*.mode2v3 -**/ios/**/*.moved-aside -**/ios/**/*.pbxuser -**/ios/**/*.perspectivev3 -**/ios/**/*sync/ -**/ios/**/.sconsign.dblite -**/ios/**/.tags* -**/ios/**/.vagrant/ -**/ios/**/DerivedData/ -**/ios/**/Icon? -**/ios/**/Pods/ -**/ios/**/.symlinks/ -**/ios/**/profile -**/ios/**/xcuserdata -**/ios/.generated/ -**/ios/Flutter/App.framework -**/ios/Flutter/Flutter.framework -**/ios/Flutter/Generated.xcconfig -**/ios/Flutter/app.flx -**/ios/Flutter/app.zip -**/ios/Flutter/flutter_assets/ -**/ios/ServiceDefinitions.json -**/ios/Runner/GeneratedPluginRegistrant.* - -# Exceptions to above rules. -!**/ios/**/default.mode1v3 -!**/ios/**/default.mode2v3 -!**/ios/**/default.pbxuser -!**/ios/**/default.perspectivev3 -!/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages diff --git a/automl_mlkit/example/.metadata b/automl_mlkit/example/.metadata deleted file mode 100644 index a51d898..0000000 --- a/automl_mlkit/example/.metadata +++ /dev/null @@ -1,10 +0,0 @@ -# This file tracks properties of this Flutter project. -# Used by Flutter tool to assess capabilities and perform upgrades etc. -# -# This file should be version controlled and should not be manually edited. - -version: - revision: 8661d8aecd626f7f57ccbcb735553edc05a2e713 - channel: beta - -project_type: app diff --git a/automl_mlkit/example/README.md b/automl_mlkit/example/README.md deleted file mode 100644 index dedc3c0..0000000 --- a/automl_mlkit/example/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# automl_mlkit_example - -Demonstrates how to use the automl_mlkit plugin by preloading a tflite model with the SDK -and running inference on an image. - diff --git a/automl_mlkit/example/android/app/build.gradle b/automl_mlkit/example/android/app/build.gradle deleted file mode 100644 index 3fdace3..0000000 --- a/automl_mlkit/example/android/app/build.gradle +++ /dev/null @@ -1,63 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). - applicationId "com.google.automlkit.automl_mlkit_example" - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'com.android.support.test:runner:1.0.2' - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/automl_mlkit/example/android/app/src/debug/AndroidManifest.xml b/automl_mlkit/example/android/app/src/debug/AndroidManifest.xml deleted file mode 100644 index 3296e5e..0000000 --- a/automl_mlkit/example/android/app/src/debug/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/automl_mlkit/example/android/app/src/main/AndroidManifest.xml b/automl_mlkit/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 323d263..0000000 --- a/automl_mlkit/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - diff --git a/automl_mlkit/example/android/app/src/main/java/com/google/automlkit/automl_mlkit_example/MainActivity.java b/automl_mlkit/example/android/app/src/main/java/com/google/automlkit/automl_mlkit_example/MainActivity.java deleted file mode 100644 index c7d2e0e..0000000 --- a/automl_mlkit/example/android/app/src/main/java/com/google/automlkit/automl_mlkit_example/MainActivity.java +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.automlkit.automl_mlkit_example; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/automl_mlkit/example/android/app/src/main/res/drawable/launch_background.xml b/automl_mlkit/example/android/app/src/main/res/drawable/launch_background.xml deleted file mode 100644 index 304732f..0000000 --- a/automl_mlkit/example/android/app/src/main/res/drawable/launch_background.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - diff --git a/automl_mlkit/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/automl_mlkit/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4..0000000 Binary files a/automl_mlkit/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/automl_mlkit/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/automl_mlkit/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b7..0000000 Binary files a/automl_mlkit/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/automl_mlkit/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/automl_mlkit/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 09d4391..0000000 Binary files a/automl_mlkit/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/automl_mlkit/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/automl_mlkit/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d..0000000 Binary files a/automl_mlkit/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/automl_mlkit/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/automl_mlkit/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372e..0000000 Binary files a/automl_mlkit/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/automl_mlkit/example/android/app/src/main/res/values/styles.xml b/automl_mlkit/example/android/app/src/main/res/values/styles.xml deleted file mode 100644 index 00fa441..0000000 --- a/automl_mlkit/example/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - diff --git a/automl_mlkit/example/android/app/src/profile/AndroidManifest.xml b/automl_mlkit/example/android/app/src/profile/AndroidManifest.xml deleted file mode 100644 index 3296e5e..0000000 --- a/automl_mlkit/example/android/app/src/profile/AndroidManifest.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - diff --git a/automl_mlkit/example/android/build.gradle b/automl_mlkit/example/android/build.gradle deleted file mode 100644 index 7a4bee3..0000000 --- a/automl_mlkit/example/android/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' - classpath 'com.google.gms:google-services:4.2.0' - } -} - -allprojects { - repositories { - maven { - url "../../third_party/m2repository" - } - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/automl_mlkit/example/android/gradle.properties b/automl_mlkit/example/android/gradle.properties deleted file mode 100644 index 8bd86f6..0000000 --- a/automl_mlkit/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/automl_mlkit/example/android/gradle/wrapper/gradle-wrapper.properties b/automl_mlkit/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 2819f02..0000000 --- a/automl_mlkit/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,6 +0,0 @@ -#Fri Jun 23 08:50:38 CEST 2017 -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/automl_mlkit/example/android/settings.gradle b/automl_mlkit/example/android/settings.gradle deleted file mode 100644 index 5a2f14f..0000000 --- a/automl_mlkit/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/automl_mlkit/example/assets/dict.txt b/automl_mlkit/example/assets/dict.txt deleted file mode 100644 index d5d9996..0000000 --- a/automl_mlkit/example/assets/dict.txt +++ /dev/null @@ -1,4 +0,0 @@ -green -orange -purple -red diff --git a/automl_mlkit/example/assets/manifest.json b/automl_mlkit/example/assets/manifest.json deleted file mode 100644 index 7c75e80..0000000 --- a/automl_mlkit/example/assets/manifest.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "modelFile": "model.tflite", - "labelsFile": "dict.txt", - "modelType": "IMAGE_LABELING" -} \ No newline at end of file diff --git a/automl_mlkit/example/assets/model.tflite b/automl_mlkit/example/assets/model.tflite deleted file mode 100644 index f7bdbf0..0000000 Binary files a/automl_mlkit/example/assets/model.tflite and /dev/null differ diff --git a/automl_mlkit/example/ios/Flutter/AppFrameworkInfo.plist b/automl_mlkit/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 9367d48..0000000 --- a/automl_mlkit/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - MinimumOSVersion - 8.0 - - diff --git a/automl_mlkit/example/ios/Flutter/Debug.xcconfig b/automl_mlkit/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index e8efba1..0000000 --- a/automl_mlkit/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" -#include "Generated.xcconfig" diff --git a/automl_mlkit/example/ios/Flutter/Release.xcconfig b/automl_mlkit/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index 399e934..0000000 --- a/automl_mlkit/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" -#include "Generated.xcconfig" diff --git a/automl_mlkit/example/ios/Podfile b/automl_mlkit/example/ios/Podfile deleted file mode 100644 index 450db73..0000000 --- a/automl_mlkit/example/ios/Podfile +++ /dev/null @@ -1,79 +0,0 @@ -source 'sso://cpdc-internal/firebase' -source 'https://github.com/CocoaPods/Specs.git' - -# Uncomment this line to define a global platform for your project -platform :ios, '9.0' - -# CocoaPods analytics sends network stats synchronously affecting flutter build latency. -ENV['COCOAPODS_DISABLE_STATS'] = 'true' - -project 'Runner', { - 'Debug' => :debug, - 'Profile' => :release, - 'Release' => :release, -} - -def parse_KV_file(file, separator='=') - file_abs_path = File.expand_path(file) - if !File.exists? file_abs_path - return []; - end - pods_ary = [] - skip_line_start_symbols = ["#", "/"] - File.foreach(file_abs_path) { |line| - next if skip_line_start_symbols.any? { |symbol| line =~ /^\s*#{symbol}/ } - plugin = line.split(pattern=separator) - if plugin.length == 2 - podname = plugin[0].strip() - path = plugin[1].strip() - podpath = File.expand_path("#{path}", file_abs_path) - pods_ary.push({:name => podname, :path => podpath}); - else - puts "Invalid plugin specification: #{line}" - end - } - return pods_ary -end - -target 'Runner' do - use_frameworks! - - # Prepare symlinks folder. We use symlinks to avoid having Podfile.lock - # referring to absolute paths on developers' machines. - system('rm -rf .symlinks') - system('mkdir -p .symlinks/plugins') - - # Flutter Pods - generated_xcode_build_settings = parse_KV_file('./Flutter/Generated.xcconfig') - if generated_xcode_build_settings.empty? - puts "Generated.xcconfig must exist. If you're running pod install manually, make sure flutter packages get is executed first." - end - generated_xcode_build_settings.map { |p| - if p[:name] == 'FLUTTER_FRAMEWORK_DIR' - symlink = File.join('.symlinks', 'flutter') - File.symlink(File.dirname(p[:path]), symlink) - pod 'Flutter', :path => File.join(symlink, File.basename(p[:path])) - end - } - - # Plugin Pods - plugin_pods = parse_KV_file('../.flutter-plugins') - plugin_pods.map { |p| - symlink = File.join('.symlinks', 'plugins', p[:name]) - File.symlink(p[:path], symlink) - pod p[:name], :path => File.join(symlink, 'ios') - } -end - -post_install do |installer| - installer.pods_project.targets.each do |target| - target.build_configurations.each do |config| - config.build_settings['ENABLE_BITCODE'] = 'NO' - end - end -end - -pod 'Firebase/Core' -pod 'FirebaseMLCommon' -pod 'FirebaseMLVision' -pod 'FirebaseMLVisionAutoML' diff --git a/automl_mlkit/example/ios/Podfile.lock b/automl_mlkit/example/ios/Podfile.lock deleted file mode 100644 index 69cd3d9..0000000 --- a/automl_mlkit/example/ios/Podfile.lock +++ /dev/null @@ -1,173 +0,0 @@ -PODS: - - automl_mlkit (0.0.1): - - FirebaseCore - - FirebaseMLCommon - - FirebaseMLVision - - FirebaseMLVisionAutoML - - Flutter - - Firebase/Core (6.0.0): - - Firebase/CoreOnly - - FirebaseAnalytics (= 6.0.0) - - Firebase/CoreOnly (6.0.0): - - FirebaseCore (= 6.0.0) - - firebase_core (0.0.1): - - Firebase/Core - - Flutter - - FirebaseAnalytics (6.0.0): - - FirebaseCore (~> 6.0) - - FirebaseInstanceID (~> 4.0) - - GoogleAppMeasurement (= 6.0.0) - - GoogleUtilities/AppDelegateSwizzler (~> 5.2) - - GoogleUtilities/MethodSwizzler (~> 5.2) - - GoogleUtilities/Network (~> 5.2) - - "GoogleUtilities/NSData+zlib (~> 5.2)" - - nanopb (~> 0.3) - - FirebaseCore (6.0.0): - - GoogleUtilities/Environment (~> 5.2) - - GoogleUtilities/Logger (~> 5.2) - - FirebaseInstanceID (4.0.0): - - FirebaseCore (~> 6.0) - - GoogleUtilities/Environment (~> 5.2) - - GoogleUtilities/UserDefaults (~> 5.2) - - FirebaseMLCommon (0.16.0): - - FirebaseCore (~> 6.0) - - FirebaseInstanceID (~> 4.0) - - GoogleUtilities/UserDefaults (~> 5.3) - - GTMSessionFetcher/Core (~> 1.1) - - FirebaseMLVision (0.16.0): - - FirebaseCore (~> 6.0) - - FirebaseMLCommon (~> 0.16) - - GoogleAPIClientForREST/Core (~> 1.3) - - GoogleAPIClientForREST/Vision (~> 1.3) - - GoogleMobileVision/Detector (~> 1.4) - - FirebaseMLVisionAutoML (0.16.0): - - FirebaseCore (~> 6.0) - - FirebaseMLCommon (~> 0.16) - - FirebaseMLVision (~> 0.16) - - TensorFlowLite (= 1.13.1) - - Flutter (1.0.0) - - GoogleAPIClientForREST/Core (1.3.8): - - GTMSessionFetcher (>= 1.1.7) - - GoogleAPIClientForREST/Vision (1.3.8): - - GoogleAPIClientForREST/Core - - GTMSessionFetcher (>= 1.1.7) - - GoogleAppMeasurement (6.0.0): - - GoogleUtilities/AppDelegateSwizzler (~> 5.2) - - GoogleUtilities/MethodSwizzler (~> 5.2) - - GoogleUtilities/Network (~> 5.2) - - "GoogleUtilities/NSData+zlib (~> 5.2)" - - nanopb (~> 0.3) - - GoogleMobileVision/Detector (1.6.0): - - GoogleToolboxForMac/Logger (~> 2.1) - - "GoogleToolboxForMac/NSData+zlib (~> 2.1)" - - GTMSessionFetcher/Core (~> 1.1) - - Protobuf (~> 3.1) - - GoogleToolboxForMac/Defines (2.2.0) - - GoogleToolboxForMac/Logger (2.2.0): - - GoogleToolboxForMac/Defines (= 2.2.0) - - "GoogleToolboxForMac/NSData+zlib (2.2.0)": - - GoogleToolboxForMac/Defines (= 2.2.0) - - GoogleUtilities/AppDelegateSwizzler (5.8.0): - - GoogleUtilities/Environment - - GoogleUtilities/Logger - - GoogleUtilities/Network - - GoogleUtilities/Environment (5.8.0) - - GoogleUtilities/Logger (5.8.0): - - GoogleUtilities/Environment - - GoogleUtilities/MethodSwizzler (5.8.0): - - GoogleUtilities/Logger - - GoogleUtilities/Network (5.8.0): - - GoogleUtilities/Logger - - "GoogleUtilities/NSData+zlib" - - GoogleUtilities/Reachability - - "GoogleUtilities/NSData+zlib (5.8.0)" - - GoogleUtilities/Reachability (5.8.0): - - GoogleUtilities/Logger - - GoogleUtilities/UserDefaults (5.8.0): - - GoogleUtilities/Logger - - GTMSessionFetcher (1.2.1): - - GTMSessionFetcher/Full (= 1.2.1) - - GTMSessionFetcher/Core (1.2.1) - - GTMSessionFetcher/Full (1.2.1): - - GTMSessionFetcher/Core (= 1.2.1) - - image_picker (0.0.1): - - Flutter - - nanopb (0.3.901): - - nanopb/decode (= 0.3.901) - - nanopb/encode (= 0.3.901) - - nanopb/decode (0.3.901) - - nanopb/encode (0.3.901) - - path_provider (0.0.1): - - Flutter - - Protobuf (3.7.0) - - TensorFlowLite (1.13.1) - -DEPENDENCIES: - - automl_mlkit (from `.symlinks/plugins/automl_mlkit/ios`) - - Firebase/Core - - firebase_core (from `.symlinks/plugins/firebase_core/ios`) - - FirebaseMLCommon - - FirebaseMLVision - - FirebaseMLVisionAutoML - - Flutter (from `.symlinks/flutter/ios-release`) - - image_picker (from `.symlinks/plugins/image_picker/ios`) - - path_provider (from `.symlinks/plugins/path_provider/ios`) - -SPEC REPOS: - https://github.com/cocoapods/specs.git: - - GoogleAPIClientForREST - - GoogleMobileVision - - GoogleToolboxForMac - - GTMSessionFetcher - - nanopb - - Protobuf - - TensorFlowLite - sso://cpdc-internal/firebase: - - Firebase - - FirebaseAnalytics - - FirebaseCore - - FirebaseInstanceID - - FirebaseMLCommon - - FirebaseMLVision - - FirebaseMLVisionAutoML - - GoogleAppMeasurement - - GoogleUtilities - -EXTERNAL SOURCES: - automl_mlkit: - :path: ".symlinks/plugins/automl_mlkit/ios" - firebase_core: - :path: ".symlinks/plugins/firebase_core/ios" - Flutter: - :path: ".symlinks/flutter/ios-release" - image_picker: - :path: ".symlinks/plugins/image_picker/ios" - path_provider: - :path: ".symlinks/plugins/path_provider/ios" - -SPEC CHECKSUMS: - automl_mlkit: 1ded2ddd04042772f0bc3dcfee5e85ecae0a8da6 - Firebase: b4af63f09393c07875bdff9db2a47288f5485e07 - firebase_core: c96aa8b2fcf7f5167d32f22034f502f9304952b8 - FirebaseAnalytics: 26e558128f0816e8c5af556da94844a0626ddcef - FirebaseCore: d3625cd6ed3eb82bc3ef8faf5ecc560d3c2715d1 - FirebaseInstanceID: 73ca7cb6c60479c382a1e9f45e0caf50c87c759f - FirebaseMLCommon: be5022234dfda811c5ebd9e057dfeef824b8d63f - FirebaseMLVision: 381154c9919cf900a160421cce3aa9ce5d7a5401 - FirebaseMLVisionAutoML: 5a3d0f7de84075627bceb7bbc988a581315a069a - Flutter: 9d0fac939486c9aba2809b7982dfdbb47a7b0296 - GoogleAPIClientForREST: 5447a194eae517986cafe6421a5330b80b820591 - GoogleAppMeasurement: 23b6f01a6ac784eedebfc92e5ceb42c0291f6d14 - GoogleMobileVision: 31cfb4319fd0c03d80105680abd9eae9da5e3b47 - GoogleToolboxForMac: ff31605b7d66400dcec09bed5861689aebadda4d - GoogleUtilities: 79f2338a97e76d5fdfd813e3955a86c0f855c981 - GTMSessionFetcher: 32aeca0aa144acea523e1c8e053089dec2cb98ca - image_picker: ee00aab0487cedc80a304085219503cc6d0f2e22 - nanopb: 2901f78ea1b7b4015c860c2fdd1ea2fee1a18d48 - path_provider: 09407919825bfe3c2deae39453b7a5b44f467873 - Protobuf: 7a877b7f3e5964e3fce995e2eb323dbc6831bb5a - TensorFlowLite: 8b9dc4eb32eac0f8cb660c66bca7604da56dcc5a - -PODFILE CHECKSUM: 04cc329978480d05762a85a36a45f052493926b7 - -COCOAPODS: 1.5.3 diff --git a/automl_mlkit/example/ios/Runner.xcodeproj/project.pbxproj b/automl_mlkit/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index bfc813a..0000000 --- a/automl_mlkit/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,597 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; - 90AA34A3225715A900A4E572 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 90AA34A2225715A900A4E572 /* GoogleService-Info.plist */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - B6235BC7A0F5F3DBADA8FB15 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 875B930A497FC50F3D09863F /* Pods_Runner.framework */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 875B930A497FC50F3D09863F /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 90AA34A2225715A900A4E572 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - B6235BC7A0F5F3DBADA8FB15 /* Pods_Runner.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 3664F9CFA429CE9F3903E752 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 3664F9CFA429CE9F3903E752 /* Pods */, - FF13B40D82926507582D2AB2 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 90AA34A2225715A900A4E572 /* GoogleService-Info.plist */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */, - 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */, - 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, - 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - ); - name = "Supporting Files"; - sourceTree = ""; - }; - FF13B40D82926507582D2AB2 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 875B930A497FC50F3D09863F /* Pods_Runner.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - EB5C63AD491CDB8E65ED4BD0 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 0596CF372BD871B05B4A10A4 /* [CP] Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0910; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - DevelopmentTeam = TA9VLBVN24; - LastSwiftMigration = 0910; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - 90AA34A3225715A900A4E572 /* GoogleService-Info.plist in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 0596CF372BD871B05B4A10A4 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework", - "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", - "${BUILT_PRODUCTS_DIR}/GoogleAPIClientForREST/GoogleAPIClientForREST.framework", - "${BUILT_PRODUCTS_DIR}/GoogleToolboxForMac/GoogleToolboxForMac.framework", - "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", - "${BUILT_PRODUCTS_DIR}/Protobuf/Protobuf.framework", - "${BUILT_PRODUCTS_DIR}/image_picker/image_picker.framework", - "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", - "${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleAPIClientForREST.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleToolboxForMac.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - EB5C63AD491CDB8E65ED4BD0 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, - 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 249021D3217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Profile; - }; - 249021D4217E4FDB00AE95B9 /* Profile */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = TA9VLBVN24; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.automlkit.automlMlkitExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Profile; - }; - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = TA9VLBVN24; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.automlkit.automlMlkitExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = On; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CLANG_ENABLE_MODULES = YES; - CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)"; - DEVELOPMENT_TEAM = TA9VLBVN24; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.google.automlkit.automlMlkitExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; - SWIFT_SWIFT3_OBJC_INFERENCE = On; - SWIFT_VERSION = 4.0; - VERSIONING_SYSTEM = "apple-generic"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - 249021D3217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - 249021D4217E4FDB00AE95B9 /* Profile */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/automl_mlkit/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/automl_mlkit/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 1d526a1..0000000 --- a/automl_mlkit/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/automl_mlkit/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/automl_mlkit/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 786d6aa..0000000 --- a/automl_mlkit/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/automl_mlkit/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/automl_mlkit/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc1..0000000 --- a/automl_mlkit/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/automl_mlkit/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/automl_mlkit/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist deleted file mode 100644 index 18d9810..0000000 --- a/automl_mlkit/example/ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +++ /dev/null @@ -1,8 +0,0 @@ - - - - - IDEDidComputeMac32BitWarning - - - diff --git a/automl_mlkit/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/automl_mlkit/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index 949b678..0000000 --- a/automl_mlkit/example/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - BuildSystemType - Original - - diff --git a/automl_mlkit/example/ios/Runner/AppDelegate.swift b/automl_mlkit/example/ios/Runner/AppDelegate.swift deleted file mode 100644 index 58d9ef8..0000000 --- a/automl_mlkit/example/ios/Runner/AppDelegate.swift +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import UIKit -import Flutter -import Firebase - -@UIApplicationMain -@objc class AppDelegate: FlutterAppDelegate { - override func application( - _ application: UIApplication, - didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]? - ) -> Bool { - GeneratedPluginRegistrant.register(with: self) - FirebaseApp.configure() - return super.application(application, didFinishLaunchingWithOptions: launchOptions) - } -} diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d36b1fa..0000000 --- a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,122 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - }, - { - "size" : "1024x1024", - "idiom" : "ios-marketing", - "filename" : "Icon-App-1024x1024@1x.png", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png deleted file mode 100644 index 3d43d11..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf0..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 2ccbfd9..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 4cde121..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index dcdc230..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 2ccbfd9..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b86..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b86..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d16..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 6a84f41..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index d0e1f58..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json b/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json deleted file mode 100644 index 0bedcf2..0000000 --- a/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "images" : [ - { - "idiom" : "universal", - "filename" : "LaunchImage.png", - "scale" : "1x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@2x.png", - "scale" : "2x" - }, - { - "idiom" : "universal", - "filename" : "LaunchImage@3x.png", - "scale" : "3x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png deleted file mode 100644 index 9da19ea..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png deleted file mode 100644 index 9da19ea..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png b/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png deleted file mode 100644 index 9da19ea..0000000 Binary files a/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png and /dev/null differ diff --git a/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md b/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md deleted file mode 100644 index 89c2725..0000000 --- a/automl_mlkit/example/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Launch Screen Assets - -You can customize the launch screen with your own desired assets by replacing the image files in this directory. - -You can also do it by opening your Flutter project's Xcode project with `open ios/Runner.xcworkspace`, selecting `Runner/Assets.xcassets` in the Project Navigator and dropping in the desired images. \ No newline at end of file diff --git a/automl_mlkit/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/automl_mlkit/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f2e259c..0000000 --- a/automl_mlkit/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/automl_mlkit/example/ios/Runner/Base.lproj/Main.storyboard b/automl_mlkit/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c2851..0000000 --- a/automl_mlkit/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/automl_mlkit/example/ios/Runner/Info.plist b/automl_mlkit/example/ios/Runner/Info.plist deleted file mode 100644 index 16587de..0000000 --- a/automl_mlkit/example/ios/Runner/Info.plist +++ /dev/null @@ -1,45 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - automl_mlkit_example - CFBundlePackageType - APPL - CFBundleShortVersionString - $(FLUTTER_BUILD_NAME) - CFBundleSignature - ???? - CFBundleVersion - $(FLUTTER_BUILD_NUMBER) - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/automl_mlkit/example/ios/Runner/Runner-Bridging-Header.h b/automl_mlkit/example/ios/Runner/Runner-Bridging-Header.h deleted file mode 100644 index e0de5d4..0000000 --- a/automl_mlkit/example/ios/Runner/Runner-Bridging-Header.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2019 Google LLC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#import "GeneratedPluginRegistrant.h" \ No newline at end of file diff --git a/automl_mlkit/example/lib/main.dart b/automl_mlkit/example/lib/main.dart deleted file mode 100644 index 9f68260..0000000 --- a/automl_mlkit/example/lib/main.dart +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import 'dart:async'; -import 'dart:io'; - -import 'package:automl_mlkit/automl_mlkit.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter/services.dart' show rootBundle; -import 'package:image_picker/image_picker.dart'; -import 'package:path_provider/path_provider.dart'; - -void main() => runApp(MyApp()); - -class MyApp extends StatefulWidget { - @override - _MyAppState createState() => _MyAppState(); -} - -class _MyAppState extends State { - String _modelLoadStatus = 'unknown'; - File _imageFile; - String _inferenceResult; - - @override - void initState() { - super.initState(); - loadModel(); - } - - Future loadModel() async { - String dataset = "pens"; - await createLocalFiles(dataset); - String modelLoadStatus; - try { - await AutomlMlkit.loadModelFromCache(dataset: dataset); - modelLoadStatus = "AutoML model successfully loaded"; - } on PlatformException catch (e) { - modelLoadStatus = "Error loading model"; - print("error from platform on calling loadModelFromCache"); - print(e.toString()); - } - - // If the widget was removed from the tree while the asynchronous platform - // message was in flight, we want to discard the reply rather than calling - // setState to update our non-existent appearance. - if (!mounted) return; - - setState(() { - _modelLoadStatus = modelLoadStatus; - }); - } - - Future createLocalFiles(String folder) async { - Directory tempDir = await getTemporaryDirectory(); - final Directory modelDir = Directory("${tempDir.path}/$folder"); - if (!modelDir.existsSync()) { - modelDir.createSync(); - } - final filenames = ["manifest.json", "model.tflite", "dict.txt"]; - - for (String filename in filenames) { - final File file = File("${modelDir.path}/$filename"); - if (!file.existsSync()) { - print("Copying file: $filename"); - await copyFileFromAssets(filename, file); - } - } - } - - /// copies file from assets to dst file - Future copyFileFromAssets(String filename, File dstFile) async { - ByteData data = await rootBundle.load("assets/$filename"); - final buffer = data.buffer; - dstFile.writeAsBytesSync( - buffer.asUint8List(data.offsetInBytes, data.lengthInBytes)); - } - - Future loadImageAndInfer() async { - final File imageFile = - await ImagePicker.pickImage(source: ImageSource.gallery); - - if (imageFile == null) { - Scaffold.of(context) - .showSnackBar(SnackBar(content: Text("Can't read image"))); - return; - } - - final results = - await AutomlMlkit.runModelOnImage(imagePath: imageFile.path); - print("Got results" + results[0].toString()); - if (results.isEmpty) { - Scaffold.of(context) - .showSnackBar(SnackBar(content: Text("No labels found"))); - } else { - final label = results[0]["label"]; - final confidence = (results[0]["confidence"] * 100).toStringAsFixed(2); - setState(() { - _imageFile = imageFile; - _inferenceResult = "$label: $confidence \%"; - }); - } - } - - @override - Widget build(BuildContext context) { - return MaterialApp( - home: Scaffold( - appBar: AppBar( - title: const Text('Plugin App'), - ), - body: Builder( - builder: (BuildContext context) { - return Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - _inferenceResult == null - ? Container() - : Text( - "$_inferenceResult", - style: TextStyle(fontSize: 20), - ), - Padding( - padding: const EdgeInsets.all(8.0), - child: _imageFile == null - ? Container() - : Container( - height: 200, - child: Image.file(_imageFile), - ), - ), - FlatButton( - color: Colors.blue[600], - onPressed: loadImageAndInfer, - textColor: Colors.white, - child: Text("CHOOSE A PHOTO"), - ), - Padding( - padding: const EdgeInsets.symmetric(vertical: 28), - child: Text('Model load status: $_modelLoadStatus\n'), - ), - ], - ), - ); - }, - ), - ), - ); - } -} diff --git a/automl_mlkit/example/pubspec.yaml b/automl_mlkit/example/pubspec.yaml deleted file mode 100644 index 8a5374f..0000000 --- a/automl_mlkit/example/pubspec.yaml +++ /dev/null @@ -1,51 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -name: automl_mlkit_example -description: Demonstrates how to use the automl_mlkit plugin. -publish_to: 'none' - -environment: - sdk: ">=2.1.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - path_provider: ^0.5.0+1 - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. - cupertino_icons: ^0.1.2 - -dev_dependencies: - flutter_test: - sdk: flutter - - automl_mlkit: - path: ../ - firebase_core: ^0.3.0 - image_picker: 0.4.12 - - -# The following section is specific to Flutter. -flutter: - - uses-material-design: true - - # To add assets to your application, add an assets section, like this: - assets: - - assets/manifest.json - - assets/model.tflite - - assets/dict.txt - diff --git a/automl_mlkit/example/test/widget_test.dart b/automl_mlkit/example/test/widget_test.dart deleted file mode 100644 index 76089a7..0000000 --- a/automl_mlkit/example/test/widget_test.dart +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -import 'package:flutter/material.dart'; -import 'package:flutter_test/flutter_test.dart'; - -import 'package:automl_mlkit_example/main.dart'; - -void main() { - testWidgets('Verify Platform version', (WidgetTester tester) async { - // Build our app and trigger a frame. - await tester.pumpWidget(MyApp()); - - // Verify that platform version is retrieved. - expect( - find.byWidgetPredicate( - (Widget widget) => widget is Text && - widget.data.startsWith('Running on:'), - ), - findsOneWidget, - ); - }); -} diff --git a/automl_mlkit/ios/.gitignore b/automl_mlkit/ios/.gitignore deleted file mode 100644 index 710ec6c..0000000 --- a/automl_mlkit/ios/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -.idea/ -.vagrant/ -.sconsign.dblite -.svn/ - -.DS_Store -*.swp -profile - -DerivedData/ -build/ -GeneratedPluginRegistrant.h -GeneratedPluginRegistrant.m - -.generated/ - -*.pbxuser -*.mode1v3 -*.mode2v3 -*.perspectivev3 - -!default.pbxuser -!default.mode1v3 -!default.mode2v3 -!default.perspectivev3 - -xcuserdata - -*.moved-aside - -*.pyc -*sync/ -Icon? -.tags* - -/Flutter/Generated.xcconfig diff --git a/automl_mlkit/ios/Assets/.gitkeep b/automl_mlkit/ios/Assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/automl_mlkit/ios/Classes/AutomlMlkitPlugin.h b/automl_mlkit/ios/Classes/AutomlMlkitPlugin.h deleted file mode 100644 index 1319c85..0000000 --- a/automl_mlkit/ios/Classes/AutomlMlkitPlugin.h +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#import - -@interface AutomlMlkitPlugin : NSObject -@end diff --git a/automl_mlkit/ios/Classes/AutomlMlkitPlugin.m b/automl_mlkit/ios/Classes/AutomlMlkitPlugin.m deleted file mode 100644 index f33033e..0000000 --- a/automl_mlkit/ios/Classes/AutomlMlkitPlugin.m +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -#import "AutomlMlkitPlugin.h" - -@import FirebaseMLCommon; -@import FirebaseMLVision; -@import FirebaseMLVisionAutoML; - -@interface AutomlMlkitPlugin () -@property(nonatomic, retain) FlutterMethodChannel *channel; -@property(nonatomic, retain) FIRVisionImageLabeler *labeler; -@end - -@implementation AutomlMlkitPlugin - -+ (void) registerWithRegistrar:(NSObject*)registrar { - FlutterMethodChannel *channel = [FlutterMethodChannel methodChannelWithName:@"automl_mlkit" binaryMessenger:[registrar messenger]]; - AutomlMlkitPlugin *instance = [[AutomlMlkitPlugin alloc] init]; - [registrar addMethodCallDelegate:instance channel:channel]; -} - -- (void) handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"loadModelFromCache" isEqualToString:call.method]) { - NSString *datasetName = (NSString*) call.arguments[@"dataset"]; - NSURL *url = [[[self getCacheDirectory] URLByAppendingPathComponent:datasetName] URLByAppendingPathComponent:@"manifest.json"]; - - // construct model name using the dataset name and current timestamp - NSTimeInterval now = [[NSDate date] timeIntervalSince1970]; - NSString *intervalString = [NSString stringWithFormat:@"%f", now]; - NSString *modelName = [datasetName stringByAppendingString:intervalString]; - - // register the model - FIRLocalModel *localModel = [[FIRLocalModel alloc] initWithName:modelName path:url.path]; - [[FIRModelManager modelManager] registerLocalModel:localModel]; - FIRVisionOnDeviceAutoMLImageLabelerOptions *options = - [[FIRVisionOnDeviceAutoMLImageLabelerOptions alloc] initWithRemoteModelName:nil localModelName:modelName]; - _labeler = [[FIRVision vision] onDeviceAutoMLImageLabelerWithOptions:options]; - result(@"success"); - } - else if ([@"runModelOnImage" isEqualToString:call.method]) { - NSString *imagePath = (NSString*) call.arguments[@"imagePath"]; - UIImage *uiImage = [UIImage imageWithContentsOfFile:imagePath]; - FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage]; - [_labeler processImage:image - completion:^(NSArray *_Nullable labels, - NSError *_Nullable error) { - if (error != nil || labels == nil) { - FlutterError *flutterError = [FlutterError - errorWithCode:@"UNAVAILABLE" - message:@"Error while processing image" - details:error]; - result(flutterError); - } - NSMutableDictionary *labelsDict = [[NSMutableDictionary alloc] init]; - for (FIRVisionImageLabel *label in labels) { - labelsDict[@"label"] = label.text; - labelsDict[@"confidence"] = label.confidence; - } - result(@[labelsDict]); - }]; - - } - else { - result(FlutterMethodNotImplemented); - } -} - -- (NSURL*) getCacheDirectory { - NSFileManager *fm = [NSFileManager defaultManager]; - NSError *error = nil; - NSURL *cachesDirectory = [fm URLForDirectory:NSCachesDirectory - inDomain:NSUserDomainMask - appropriateForURL:nil - create:YES - error:&error]; - return cachesDirectory; -} - -@end diff --git a/automl_mlkit/ios/automl_mlkit.podspec b/automl_mlkit/ios/automl_mlkit.podspec deleted file mode 100644 index 8f85878..0000000 --- a/automl_mlkit/ios/automl_mlkit.podspec +++ /dev/null @@ -1,25 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# -Pod::Spec.new do |s| - s.name = 'automl_mlkit' - s.version = '0.0.1' - s.summary = 'A new flutter plugin project.' - s.description = <<-DESC -A new flutter plugin project. - DESC - s.homepage = 'http://example.com' - s.license = { :file => '../LICENSE' } - s.author = { 'Your Company' => 'email@example.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.dependency 'Flutter' - s.dependency 'FirebaseCore' - s.dependency 'FirebaseMLCommon' - s.dependency 'FirebaseMLVision' - s.dependency 'FirebaseMLVisionAutoML' - s.ios.deployment_target = '9.0' - s.static_framework = true -end - diff --git a/automl_mlkit/lib/automl_mlkit.dart b/automl_mlkit/lib/automl_mlkit.dart deleted file mode 100644 index 03bd2a0..0000000 --- a/automl_mlkit/lib/automl_mlkit.dart +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import 'dart:async'; - -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; - -class AutomlMlkit { - static const MethodChannel _channel = const MethodChannel('automl_mlkit'); - - /// Loads model from dataset folder in the app's cache dir - static Future loadModelFromCache({@required String dataset}) async { - return _channel.invokeMethod('loadModelFromCache', {"dataset": dataset}); - } - - static Future runModelOnImage({@required String imagePath}) async { - return _channel - .invokeMethod("runModelOnImage", {"imagePath": imagePath}); - } -} diff --git a/automl_mlkit/pubspec.lock b/automl_mlkit/pubspec.lock deleted file mode 100644 index 21ed00a..0000000 --- a/automl_mlkit/pubspec.lock +++ /dev/null @@ -1,147 +0,0 @@ -# Generated by pub -# See https://www.dartlang.org/tools/pub/glossary#lockfile -packages: - async: - dependency: transitive - description: - name: async - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.2" - collection: - dependency: transitive - description: - name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.14.11" - firebase_core: - dependency: "direct dev" - description: - name: firebase_core - url: "https://pub.dartlang.org" - source: hosted - version: "0.3.1+1" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - matcher: - dependency: transitive - description: - name: matcher - url: "https://pub.dartlang.org" - source: hosted - version: "0.12.3+1" - meta: - dependency: transitive - description: - name: meta - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.6" - path: - dependency: transitive - description: - name: path - url: "https://pub.dartlang.org" - source: hosted - version: "1.6.2" - pedantic: - dependency: transitive - description: - name: pedantic - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.0" - quiver: - dependency: transitive - description: - name: quiver - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.1" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_span: - dependency: transitive - description: - name: source_span - url: "https://pub.dartlang.org" - source: hosted - version: "1.5.5" - stack_trace: - dependency: transitive - description: - name: stack_trace - url: "https://pub.dartlang.org" - source: hosted - version: "1.9.3" - stream_channel: - dependency: transitive - description: - name: stream_channel - url: "https://pub.dartlang.org" - source: hosted - version: "1.6.8" - string_scanner: - dependency: transitive - description: - name: string_scanner - url: "https://pub.dartlang.org" - source: hosted - version: "1.0.4" - term_glyph: - dependency: transitive - description: - name: term_glyph - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.0" - test_api: - dependency: transitive - description: - name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.2.2" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" - source: hosted - version: "1.1.6" - vector_math: - dependency: transitive - description: - name: vector_math - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.8" -sdks: - dart: ">=2.2.0 <3.0.0" - flutter: ">=0.1.4 <2.0.0" diff --git a/automl_mlkit/pubspec.yaml b/automl_mlkit/pubspec.yaml deleted file mode 100644 index 297605e..0000000 --- a/automl_mlkit/pubspec.yaml +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2019 Google LLC -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -name: automl_mlkit -description: A flutter plugin for AutoML Vision in MLKit's capabilities. -version: 0.0.1 -author: -homepage: - -environment: - sdk: ">=2.1.0 <3.0.0" - -dependencies: - flutter: - sdk: flutter - -dev_dependencies: - flutter_test: - sdk: flutter - firebase_core: ^0.3.0 - -flutter: - plugin: - androidPackage: com.google.automlkit.automl_mlkit - pluginClass: AutomlMlkitPlugin diff --git a/automl_mlkit/test/automl_mlkit_test.dart b/automl_mlkit/test/automl_mlkit_test.dart deleted file mode 100644 index b463e16..0000000 --- a/automl_mlkit/test/automl_mlkit_test.dart +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2019 Google LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:automl_mlkit/automl_mlkit.dart'; - -void main() { - const MethodChannel channel = MethodChannel('automl_mlkit'); - - setUp(() { - channel.setMockMethodCallHandler((MethodCall methodCall) async { - return '42'; - }); - }); - - tearDown(() { - channel.setMockMethodCallHandler(null); - }); - - test('getPlatformVersion', () async { - expect(await AutomlMlkit.platformVersion, '42'); - }); -} diff --git a/firebase_auth/.gitignore b/firebase_auth/.gitignore deleted file mode 100644 index 3749ecc..0000000 --- a/firebase_auth/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -.DS_Store -.atom/ -.idea/ -.vscode/ - -.packages -.pub/ -.dart_tool/ -pubspec.lock - -Podfile -Podfile.lock -Pods/ -.symlinks/ -**/Flutter/App.framework/ -**/Flutter/Flutter.framework/ -**/Flutter/Generated.xcconfig -**/Flutter/flutter_assets/ -ServiceDefinitions.json -xcuserdata/ - -local.properties -keystore.properties -.gradle/ -gradlew -gradlew.bat -gradle-wrapper.jar -*.iml - -GeneratedPluginRegistrant.h -GeneratedPluginRegistrant.m -GeneratedPluginRegistrant.java -build/ -.flutter-plugins - -third_party diff --git a/firebase_auth/CHANGELOG.md b/firebase_auth/CHANGELOG.md deleted file mode 100644 index f76cb54..0000000 --- a/firebase_auth/CHANGELOG.md +++ /dev/null @@ -1,343 +0,0 @@ -## 0.8.4+5 - -* Increase Firebase/Auth CocoaPod dependency to '~> 5.19'. - -## 0.8.4+4 - -* Update FirebaseAuth CocoaPod dependency to ensure availability of `FIRAuthErrorUserInfoNameKey`. - -## 0.8.4+3 - -* Updated deprecated API usage on iOS to use non-deprecated versions. -* Updated FirebaseAuth CocoaPod dependency to ensure a minimum version of 5.0. - -## 0.8.4+2 - -* Fixes an error in the documentation of createUserWithEmailAndPassword. - -## 0.8.4+1 - -* Adds credential for email authentication with link. - -## 0.8.4 - -* Adds support for email link authentication. - -## 0.8.3 - -* Make providerId 'const String' to use in 'case' statement. - -## 0.8.2+1 - -* Fixed bug where `PhoneCodeAutoRetrievalTimeout` callback was never called. - -## 0.8.2 - -* Fixed `linkWithCredential` on Android. - -## 0.8.1+5 - -* Added a driver test. - -## 0.8.1+4 - -* Update README. -* Update the example app with separate pages for registration and sign-in. - -## 0.8.1+3 - -* Reduce compiler warnings in Android plugin -* Raise errors early when accessing methods that require a Firebase User - -## 0.8.1+2 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 0.8.1+1 - -* Remove categories. - -## 0.8.1 - -* Fixes Firebase auth phone sign-in for Android. - -## 0.8.0+3 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 0.8.0+2 - -* Update Google sign-in example in the README. - -## 0.8.0+1 - -* Update a broken dependency. - -## 0.8.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 0.7.0 - -* Introduce third-party auth provider classes that generate `AuthCredential`s -* **Breaking Change** Signing in, linking, and reauthenticating now require an `AuthCredential` -* **Breaking Change** Unlinking now uses providerId -* **Breaking Change** Moved reauthentication to FirebaseUser - -## 0.6.7 - -* `FirebaseAuth` and `FirebaseUser` are now fully documented. -* `PlatformExceptions` now report error codes as stated in docs. -* Credentials can now be unlinked from Accounts with new methods on `FirebaseUser`. - -## 0.6.6 - -* Users can now reauthenticate in response to operations that require a recent sign-in. - -## 0.6.5 - -* Fixing async method `verifyPhoneNumber`, that would never return even in a successful call. - -## 0.6.4 - -* Added support for Github signin and linking Github accounts to existing users. - -## 0.6.3 - -* Add multi app support. - -## 0.6.2+1 - -* Bump Android dependencies to latest. - -## 0.6.2 - -* Add access to user metadata. - -## 0.6.1 - -* Adding support for linkWithTwitterCredential in FirebaseAuth. - -## 0.6.0 - -* Added support for `updatePassword` in `FirebaseUser`. -* **Breaking Change** Moved `updateEmail` and `updateProfile` to `FirebaseUser`. - This brings the `firebase_auth` package inline with other implementations and documentation. - -## 0.5.20 - -* Replaced usages of guava's: ImmutableList and ImmutableMap with platform -Collections.unmodifiableList() and Collections.unmodifiableMap(). - -## 0.5.19 - -* Update test package dependency to pick up Dart 2 support. -* Modified dependency on google_sign_in to point to a published - version instead of a relative path. - -## 0.5.18 - -* Adding support for updateEmail in FirebaseAuth. - -## 0.5.17 - -* Adding support for FirebaseUser.delete. - -## 0.5.16 - -* Adding support for setLanguageCode in FirebaseAuth. - -## 0.5.15 - -* Bump Android and Firebase dependency versions. - -## 0.5.14 - -* Fixed handling of auto phone number verification. - -## 0.5.13 - -* Add support for phone number authentication. - -## 0.5.12 - -* Fixed ArrayIndexOutOfBoundsException in handleStopListeningAuthState - -## 0.5.11 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 0.5.10 - -* Updated iOS implementation to reflect Firebase API changes. - -## 0.5.9 - -* Added support for signing in with a Twitter account. - -## 0.5.8 - -* Added support to reload firebase user - -## 0.5.7 - -* Added support to sendEmailVerification - -## 0.5.6 - -* Added support for linkWithFacebookCredential - -## 0.5.5 - -* Updated Google Play Services dependencies to version 15.0.0. - -## 0.5.4 - -* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. - -## 0.5.3 - -* Secure fetchProvidersForEmail (no providers) - -## 0.5.2 - -* Fixed Dart 2 type error in fetchProvidersForEmail. - -## 0.5.1 - -* Added support to fetchProvidersForEmail - -## 0.5.0 - -* **Breaking change**. Set SDK constraints to match the Flutter beta release. - -## 0.4.7 - -* Fixed Dart 2 type errors. - -## 0.4.6 - -* Fixed Dart 2 type errors. - -## 0.4.5 - -* Enabled use in Swift projects. - -## 0.4.4 - -* Added support for sendPasswordResetEmail - -## 0.4.3 - -* Moved to the io.flutter.plugins organization. - -## 0.4.2 - -* Added support for changing user data - -## 0.4.1 - -* Simplified and upgraded Android project template to Android SDK 27. -* Updated package description. - -## 0.4.0 - -* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin - 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in - order to use this version of the plugin. Instructions can be found - [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). -* Relaxed GMS dependency to [11.4.0,12.0[ - -## 0.3.2 - -* Added FLT prefix to iOS types -* Change GMS dependency to 11.4.+ - -## 0.3.1 - -* Change GMS dependency to 11.+ - -## 0.3.0 - -* **Breaking Change**: Method FirebaseUser getToken was renamed to getIdToken. - -## 0.2.5 - -* Added support for linkWithCredential with Google credential - -## 0.2.4 - -* Added support for `signInWithCustomToken` -* Added `Stream onAuthStateChanged` event to listen when the user change - -## 0.2.3+1 - -* Aligned author name with rest of repo. - -## 0.2.3 - -* Remove dependency on Google/SignIn - -## 0.2.2 - -* Remove dependency on FirebaseUI - -## 0.2.1 - -* Added support for linkWithEmailAndPassword - -## 0.2.0 - -* **Breaking Change**: Method currentUser is async now. - -## 0.1.2 - -* Added support for signInWithFacebook - -## 0.1.1 - -* Updated to Firebase SDK to always use latest patch version for 11.0.x builds - -## 0.1.0 - -* Updated to Firebase SDK Version 11.0.1 -* **Breaking Change**: You need to add a maven section with the "https://maven.google.com" endpoint to the repository section of your `android/build.gradle`. For example: -```gradle -allprojects { - repositories { - jcenter() - maven { // NEW - url "https://maven.google.com" // NEW - } // NEW - } -} -``` - -## 0.0.4 - -* Add method getToken() to FirebaseUser - -## 0.0.3+1 - -* Updated README.md - -## 0.0.3 - -* Added support for createUserWithEmailAndPassword, signInWithEmailAndPassword, and signOut Firebase methods - -## 0.0.2+1 - -* Updated README.md - -## 0.0.2 - -* Bump buildToolsVersion to 25.0.3 - -## 0.0.1 - -* Initial Release diff --git a/firebase_auth/LICENSE b/firebase_auth/LICENSE deleted file mode 100755 index 000b461..0000000 --- a/firebase_auth/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/firebase_auth/README.md b/firebase_auth/README.md deleted file mode 100755 index 86af4ce..0000000 --- a/firebase_auth/README.md +++ /dev/null @@ -1,140 +0,0 @@ -# firebase_auth plugin -A Flutter plugin to use the [Firebase Authentication API](https://firebase.google.com/products/auth/). - -[![pub package](https://img.shields.io/pub/v/firebase_auth.svg)](https://pub.dartlang.org/packages/firebase_auth) - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage - -### Configure the Google sign-in plugin -The Google Sign-in plugin is required to use the firebase_auth plugin. Follow the [Google sign-in plugin installation instructions](https://pub.dartlang.org/packages/google_sign_in#pub-pkg-tab-installing). - -### Import the firebase_auth plugin -To use the firebase_auth plugin, follow the [plugin installation instructions](https://pub.dartlang.org/packages/firebase_auth#pub-pkg-tab-installing). - -### Android integration - -Enable the Google services by configuring the Gradle scripts as such. - -1. Add the classpath to the `[project]/android/build.gradle` file. -```gradle -dependencies { - // Example existing classpath - classpath 'com.android.tools.build:gradle:3.2.1' - // Add the google services classpath - classpath 'com.google.gms:google-services:4.2.0' -} -``` - -2. Add the apply plugin to the `[project]/android/app/build.gradle` file. -```gradle -// ADD THIS AT THE BOTTOM -apply plugin: 'com.google.gms.google-services' -``` - -*Note:* If this section is not completed you will get an error like this: -``` -java.lang.IllegalStateException: -Default FirebaseApp is not initialized in this process [package name]. -Make sure to call FirebaseApp.initializeApp(Context) first. -``` - -*Note:* When you are debugging on android, use a device or AVD with Google Play services. -Otherwise you will not be able to authenticate. - -### Use the plugin - -Add the following imports to your Dart code: -```dart -import 'package:firebase_auth/firebase_auth.dart'; -``` - -Initialize `GoogleSignIn` and `FirebaseAuth`: -```dart -final GoogleSignIn _googleSignIn = GoogleSignIn(); -final FirebaseAuth _auth = FirebaseAuth.instance; -``` - -You can now use the Firebase `_auth` to authenticate in your Dart code, e.g. -```dart -Future _handleSignIn() async { - final GoogleSignInAccount googleUser = await _googleSignIn.signIn(); - final GoogleSignInAuthentication googleAuth = await googleUser.authentication; - - final AuthCredential credential = GoogleAuthProvider.getCredential( - accessToken: googleAuth.accessToken, - idToken: googleAuth.idToken, - ); - - final FirebaseUser user = await _auth.signInWithCredential(credential); - print("signed in " + user.displayName); - return user; -} -``` - -Then from the sign in button onPress, call the `_handleSignIn` method using a future -callback for both the `FirebaseUser` and possible exception. -```dart -_handleSignIn() - .then((FirebaseUser user) => print(user)) - .catchError((e) => print(e)); -``` - -### Register a user - -```dart -final FirebaseUser user = await _auth.createUserWithEmailAndPassword( - email: 'an email', - password: 'a password', - ); -``` - -### Supported Firebase authentication methods - -* Google -* Email and Password -* Phone -* Anonymously -* GitHub -* Facebook -* Twitter - -### Phone Auth - -You can use Firebase Authentication to sign in a user by sending an SMS message to -the user's phone. The user signs in using a one-time code contained in the SMS message. - -### After authentication - -After a successful authentication, you will receive a `FirebaseUser` object. You can use this object to check if the email is verified, to update email, to send verification email and so on. See the [FirebaseUser](https://pub.dartlang.org/documentation/firebase_auth/latest/firebase_auth/FirebaseUser-class.html) API documentation for more details on the `FirebaseUser` object. - - -#### iOS setup - -1. Enable Phone as a Sign-In method in the [Firebase console](https://console.firebase.google.com/u/0/project/_/authentication/providers) - - - When testing you can add test phone numbers and verification codes to the Firebase console. - -1. [Enable App verification](https://firebase.google.com/docs/auth/ios/phone-auth#enable-app-verification) - -**Note:** App verification may use APNs, if using a simulator (where APNs does not work) or APNs is not setup on the -device you are using you must set the `URL Schemes` to the `REVERSE_CLIENT_ID` from the GoogleServices-Info.plist file. - -#### Android setup - -1. Enable Phone as a Sign-In method in the [Firebase console](https://console.firebase.google.com/u/0/project/_/authentication/providers) - - - When testing you can add test phone numbers and verification codes to the Firebase console. - -## Example - -See the [example application](https://github.com/firebase/mlkit-custom-image-classifier/tree/master/flutter-app) source -for a complete sample app using the Firebase authentication for Google Sign-In. - -## Issues and feedback - -Please file [issues](https://github.com/flutter/flutter/issues/new) -to send feedback or report a bug. Thank you! diff --git a/firebase_auth/android/build.gradle b/firebase_auth/android/build.gradle deleted file mode 100755 index 6b96e0e..0000000 --- a/firebase_auth/android/build.gradle +++ /dev/null @@ -1,51 +0,0 @@ -def PLUGIN = "firebase_auth"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - - -group 'io.flutter.plugins.firebaseauth' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.1' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-auth:17.0.0' - } -} diff --git a/firebase_auth/android/gradle.properties b/firebase_auth/android/gradle.properties deleted file mode 100755 index 8bd86f6..0000000 --- a/firebase_auth/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/firebase_auth/android/gradle/wrapper/gradle-wrapper.properties b/firebase_auth/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d..0000000 --- a/firebase_auth/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/firebase_auth/android/settings.gradle b/firebase_auth/android/settings.gradle deleted file mode 100755 index acfe185..0000000 --- a/firebase_auth/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_auth' diff --git a/firebase_auth/android/src/main/AndroidManifest.xml b/firebase_auth/android/src/main/AndroidManifest.xml deleted file mode 100755 index 13024e5..0000000 --- a/firebase_auth/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java b/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java deleted file mode 100755 index 6e194fb..0000000 --- a/firebase_auth/android/src/main/java/io/flutter/plugins/firebaseauth/FirebaseAuthPlugin.java +++ /dev/null @@ -1,772 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebaseauth; - -import android.net.Uri; -import android.util.SparseArray; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.Task; -import com.google.firebase.FirebaseApiNotAvailableException; -import com.google.firebase.FirebaseApp; -import com.google.firebase.FirebaseException; -import com.google.firebase.FirebaseNetworkException; -import com.google.firebase.FirebaseTooManyRequestsException; -import com.google.firebase.auth.ActionCodeSettings; -import com.google.firebase.auth.AuthCredential; -import com.google.firebase.auth.AuthResult; -import com.google.firebase.auth.EmailAuthProvider; -import com.google.firebase.auth.FacebookAuthProvider; -import com.google.firebase.auth.FirebaseAuth; -import com.google.firebase.auth.FirebaseAuth.AuthStateListener; -import com.google.firebase.auth.FirebaseAuthException; -import com.google.firebase.auth.FirebaseAuthInvalidCredentialsException; -import com.google.firebase.auth.FirebaseUser; -import com.google.firebase.auth.FirebaseUserMetadata; -import com.google.firebase.auth.GetTokenResult; -import com.google.firebase.auth.GithubAuthProvider; -import com.google.firebase.auth.GoogleAuthProvider; -import com.google.firebase.auth.PhoneAuthCredential; -import com.google.firebase.auth.PhoneAuthProvider; -import com.google.firebase.auth.PhoneAuthProvider.ForceResendingToken; -import com.google.firebase.auth.SignInMethodQueryResult; -import com.google.firebase.auth.TwitterAuthProvider; -import com.google.firebase.auth.UserInfo; -import com.google.firebase.auth.UserProfileChangeRequest; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.MethodChannel.MethodCallHandler; -import io.flutter.plugin.common.MethodChannel.Result; -import io.flutter.plugin.common.PluginRegistry; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.concurrent.TimeUnit; - -/** Flutter plugin for Firebase Auth. */ -public class FirebaseAuthPlugin implements MethodCallHandler { - private final PluginRegistry.Registrar registrar; - private final SparseArray authStateListeners = new SparseArray<>(); - private final SparseArray forceResendingTokens = new SparseArray<>(); - private final MethodChannel channel; - - // Handles are ints used as indexes into the sparse array of active observers - private int nextHandle = 0; - - public static void registerWith(PluginRegistry.Registrar registrar) { - MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_auth"); - channel.setMethodCallHandler(new FirebaseAuthPlugin(registrar, channel)); - } - - private FirebaseAuthPlugin(PluginRegistry.Registrar registrar, MethodChannel channel) { - this.registrar = registrar; - this.channel = channel; - FirebaseApp.initializeApp(registrar.context()); - } - - private FirebaseAuth getAuth(MethodCall call) { - Map arguments = call.arguments(); - String appName = (String) arguments.get("app"); - FirebaseApp app = FirebaseApp.getInstance(appName); - return FirebaseAuth.getInstance(app); - } - - @Override - public void onMethodCall(MethodCall call, Result result) { - switch (call.method) { - case "currentUser": - handleCurrentUser(call, result, getAuth(call)); - break; - case "signInAnonymously": - handleSignInAnonymously(call, result, getAuth(call)); - break; - case "createUserWithEmailAndPassword": - handleCreateUserWithEmailAndPassword(call, result, getAuth(call)); - break; - case "fetchSignInMethodsForEmail": - handleFetchSignInMethodsForEmail(call, result, getAuth(call)); - break; - case "sendPasswordResetEmail": - handleSendPasswordResetEmail(call, result, getAuth(call)); - break; - case "sendLinkToEmail": - handleSendLinkToEmail(call, result, getAuth(call)); - break; - case "isSignInWithEmailLink": - handleIsSignInWithEmailLink(call, result, getAuth(call)); - break; - case "signInWithEmailAndLink": - handleSignInWithEmailAndLink(call, result, getAuth(call)); - break; - case "sendEmailVerification": - handleSendEmailVerification(call, result, getAuth(call)); - break; - case "reload": - handleReload(call, result, getAuth(call)); - break; - case "delete": - handleDelete(call, result, getAuth(call)); - break; - case "signInWithCredential": - handleSignInWithCredential(call, result, getAuth(call)); - break; - case "signInWithCustomToken": - handleSignInWithCustomToken(call, result, getAuth(call)); - break; - case "signOut": - handleSignOut(call, result, getAuth(call)); - break; - case "getIdToken": - handleGetToken(call, result, getAuth(call)); - break; - case "reauthenticateWithCredential": - handleReauthenticateWithCredential(call, result, getAuth(call)); - break; - case "linkWithCredential": - handleLinkWithCredential(call, result, getAuth(call)); - break; - case "unlinkFromProvider": - handleUnlinkFromProvider(call, result, getAuth(call)); - break; - case "updateEmail": - handleUpdateEmail(call, result, getAuth(call)); - break; - case "updatePassword": - handleUpdatePassword(call, result, getAuth(call)); - break; - case "updateProfile": - handleUpdateProfile(call, result, getAuth(call)); - break; - case "startListeningAuthState": - handleStartListeningAuthState(call, result, getAuth(call)); - break; - case "stopListeningAuthState": - handleStopListeningAuthState(call, result, getAuth(call)); - break; - case "verifyPhoneNumber": - handleVerifyPhoneNumber(call, result, getAuth(call)); - break; - case "signInWithPhoneNumber": - handleSignInWithPhoneNumber(call, result, getAuth(call)); - break; - case "setLanguageCode": - handleSetLanguageCode(call, result, getAuth(call)); - break; - default: - result.notImplemented(); - break; - } - } - - private void handleSignInWithPhoneNumber( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String verificationId = arguments.get("verificationId"); - String smsCode = arguments.get("smsCode"); - - PhoneAuthCredential phoneAuthCredential = - PhoneAuthProvider.getCredential(verificationId, smsCode); - firebaseAuth - .signInWithCredential(phoneAuthCredential) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleVerifyPhoneNumber( - MethodCall call, Result result, final FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - final int handle = (int) arguments.get("handle"); - String phoneNumber = (String) arguments.get("phoneNumber"); - int timeout = (int) arguments.get("timeout"); - - PhoneAuthProvider.OnVerificationStateChangedCallbacks verificationCallbacks = - new PhoneAuthProvider.OnVerificationStateChangedCallbacks() { - @Override - public void onVerificationCompleted(PhoneAuthCredential phoneAuthCredential) { - firebaseAuth - .signInWithCredential(phoneAuthCredential) - .addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (task.isSuccessful()) { - Map arguments = new HashMap<>(); - arguments.put("handle", handle); - channel.invokeMethod("phoneVerificationCompleted", arguments); - } - } - }); - } - - @Override - public void onVerificationFailed(FirebaseException e) { - Map arguments = new HashMap<>(); - arguments.put("handle", handle); - arguments.put("exception", getVerifyPhoneNumberExceptionMap(e)); - channel.invokeMethod("phoneVerificationFailed", arguments); - } - - @Override - public void onCodeSent( - String verificationId, PhoneAuthProvider.ForceResendingToken forceResendingToken) { - Map arguments = new HashMap<>(); - arguments.put("handle", handle); - arguments.put("verificationId", verificationId); - arguments.put("forceResendingToken", forceResendingToken.hashCode()); - channel.invokeMethod("phoneCodeSent", arguments); - } - - @Override - public void onCodeAutoRetrievalTimeOut(String verificationId) { - Map arguments = new HashMap<>(); - arguments.put("handle", handle); - arguments.put("verificationId", verificationId); - channel.invokeMethod("phoneCodeAutoRetrievalTimeout", arguments); - } - }; - - if (call.argument("forceResendingToken") != null) { - int forceResendingTokenKey = (int) arguments.get("forceResendingToken"); - PhoneAuthProvider.ForceResendingToken forceResendingToken = - forceResendingTokens.get(forceResendingTokenKey); - PhoneAuthProvider.getInstance() - .verifyPhoneNumber( - phoneNumber, - timeout, - TimeUnit.MILLISECONDS, - registrar.activity(), - verificationCallbacks, - forceResendingToken); - } else { - PhoneAuthProvider.getInstance() - .verifyPhoneNumber( - phoneNumber, - timeout, - TimeUnit.MILLISECONDS, - registrar.activity(), - verificationCallbacks); - } - - result.success(null); - } - - private Map getVerifyPhoneNumberExceptionMap(FirebaseException e) { - String errorCode = "verifyPhoneNumberError"; - if (e instanceof FirebaseAuthInvalidCredentialsException) { - errorCode = "invalidCredential"; - } else if (e instanceof FirebaseAuthException) { - errorCode = "firebaseAuth"; - } else if (e instanceof FirebaseTooManyRequestsException) { - errorCode = "quotaExceeded"; - } else if (e instanceof FirebaseApiNotAvailableException) { - errorCode = "apiNotAvailable"; - } - - Map exceptionMap = new HashMap<>(); - exceptionMap.put("code", errorCode); - exceptionMap.put("message", e.getMessage()); - return exceptionMap; - } - - private void handleLinkWithCredential(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - @SuppressWarnings("unchecked") - AuthCredential credential = getCredential((Map) call.arguments); - - currentUser - .linkWithCredential(credential) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleCurrentUser( - @SuppressWarnings("unused") MethodCall call, final Result result, FirebaseAuth firebaseAuth) { - FirebaseUser user = firebaseAuth.getCurrentUser(); - if (user == null) { - result.success(null); - return; - } - Map userMap = mapFromUser(user); - result.success(userMap); - } - - private void handleSignInAnonymously( - @SuppressWarnings("unused") MethodCall call, Result result, FirebaseAuth firebaseAuth) { - firebaseAuth.signInAnonymously().addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleCreateUserWithEmailAndPassword( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String email = arguments.get("email"); - String password = arguments.get("password"); - - firebaseAuth - .createUserWithEmailAndPassword(email, password) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleFetchSignInMethodsForEmail( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String email = arguments.get("email"); - - firebaseAuth - .fetchSignInMethodsForEmail(email) - .addOnCompleteListener(new GetSignInMethodsCompleteListener(result)); - } - - private void handleSendPasswordResetEmail( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String email = arguments.get("email"); - - firebaseAuth - .sendPasswordResetEmail(email) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleSendLinkToEmail(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String email = arguments.get("email").toString(); - ActionCodeSettings actionCodeSettings = - ActionCodeSettings.newBuilder() - .setUrl(arguments.get("url").toString()) - .setHandleCodeInApp((Boolean) arguments.get("handleCodeInApp")) - .setIOSBundleId(arguments.get("iOSBundleID").toString()) - .setAndroidPackageName( - arguments.get("androidPackageName").toString(), - (Boolean) arguments.get("androidInstallIfNotAvailable"), - arguments.get("androidMinimumVersion").toString()) - .build(); - - firebaseAuth - .sendSignInLinkToEmail(email, actionCodeSettings) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleIsSignInWithEmailLink( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String link = arguments.get("link"); - Boolean isSignInWithEmailLink = firebaseAuth.isSignInWithEmailLink(link); - result.success(isSignInWithEmailLink); - } - - private void handleSignInWithEmailAndLink( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String email = arguments.get("email"); - String link = arguments.get("link"); - firebaseAuth - .signInWithEmailLink(email, link) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleSendEmailVerification( - @SuppressWarnings("unused") MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - currentUser.sendEmailVerification().addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleReload( - @SuppressWarnings("unused") MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - currentUser.reload().addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleDelete( - @SuppressWarnings("unused") MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - currentUser.delete().addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private AuthCredential getCredential(Map arguments) { - AuthCredential credential; - - @SuppressWarnings("unchecked") - Map data = (Map) arguments.get("data"); - - switch ((String) arguments.get("provider")) { - case EmailAuthProvider.PROVIDER_ID: - { - String email = data.get("email"); - if (data.containsKey("password")) { - String password = data.get("password"); - credential = EmailAuthProvider.getCredential(email, password); - } else { - String link = data.get("link"); - credential = EmailAuthProvider.getCredentialWithLink(email, link); - } - break; - } - case GoogleAuthProvider.PROVIDER_ID: - { - String idToken = data.get("idToken"); - String accessToken = data.get("accessToken"); - credential = GoogleAuthProvider.getCredential(idToken, accessToken); - break; - } - case FacebookAuthProvider.PROVIDER_ID: - { - String accessToken = data.get("accessToken"); - credential = FacebookAuthProvider.getCredential(accessToken); - break; - } - case TwitterAuthProvider.PROVIDER_ID: - { - String authToken = data.get("authToken"); - String authTokenSecret = data.get("authTokenSecret"); - credential = TwitterAuthProvider.getCredential(authToken, authTokenSecret); - break; - } - case GithubAuthProvider.PROVIDER_ID: - { - String token = data.get("token"); - credential = GithubAuthProvider.getCredential(token); - break; - } - case PhoneAuthProvider.PROVIDER_ID: - { - String accessToken = data.get("verificationId"); - String smsCode = data.get("smsCode"); - credential = PhoneAuthProvider.getCredential(accessToken, smsCode); - break; - } - default: - { - credential = null; - break; - } - } - return credential; - } - - private void handleSignInWithCredential( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - - @SuppressWarnings("unchecked") - AuthCredential credential = getCredential((Map) call.arguments()); - - firebaseAuth - .signInWithCredential(credential) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleReauthenticateWithCredential( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - @SuppressWarnings("unchecked") - AuthCredential credential = getCredential((Map) call.arguments()); - - currentUser - .reauthenticate(credential) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleUnlinkFromProvider(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - Map arguments = call.arguments(); - final String provider = arguments.get("provider"); - - currentUser.unlink(provider).addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleSignInWithCustomToken( - MethodCall call, final Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String token = arguments.get("token"); - - firebaseAuth - .signInWithCustomToken(token) - .addOnCompleteListener(new SignInCompleteListener(result)); - } - - private void handleSignOut( - @SuppressWarnings("unused") MethodCall call, final Result result, FirebaseAuth firebaseAuth) { - firebaseAuth.signOut(); - result.success(null); - } - - private void handleGetToken(MethodCall call, final Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - Map arguments = call.arguments(); - boolean refresh = arguments.get("refresh"); - - currentUser - .getIdToken(refresh) - .addOnCompleteListener( - new OnCompleteListener() { - public void onComplete(@NonNull Task task) { - if (task.isSuccessful() && task.getResult() != null) { - String idToken = task.getResult().getToken(); - result.success(idToken); - } else { - reportException(result, task.getException()); - } - } - }); - } - - private void handleUpdateEmail(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - Map arguments = call.arguments(); - final String email = arguments.get("email"); - - currentUser.updateEmail(email).addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleUpdatePassword(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - Map arguments = call.arguments(); - final String password = arguments.get("password"); - - currentUser - .updatePassword(password) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleUpdateProfile(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final FirebaseUser currentUser = firebaseAuth.getCurrentUser(); - if (currentUser == null) { - markUserRequired(result); - return; - } - - Map arguments = call.arguments(); - - UserProfileChangeRequest.Builder builder = new UserProfileChangeRequest.Builder(); - if (arguments.containsKey("displayName")) { - builder.setDisplayName(arguments.get("displayName")); - } - if (arguments.containsKey("photoUrl")) { - builder.setPhotoUri(Uri.parse(arguments.get("photoUrl"))); - } - - currentUser - .updateProfile(builder.build()) - .addOnCompleteListener(new TaskVoidCompleteListener(result)); - } - - private void handleStartListeningAuthState( - @SuppressWarnings("unused") MethodCall call, Result result, FirebaseAuth firebaseAuth) { - final int handle = nextHandle++; - FirebaseAuth.AuthStateListener listener = - new FirebaseAuth.AuthStateListener() { - @Override - public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { - FirebaseUser user = firebaseAuth.getCurrentUser(); - Map userMap = mapFromUser(user); - Map map = new HashMap<>(); - map.put("id", handle); - if (userMap != null) { - map.put("user", userMap); - } - channel.invokeMethod("onAuthStateChanged", Collections.unmodifiableMap(map)); - } - }; - firebaseAuth.addAuthStateListener(listener); - authStateListeners.append(handle, listener); - result.success(handle); - } - - private void handleStopListeningAuthState( - MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - Integer id = arguments.get("id"); - - FirebaseAuth.AuthStateListener listener = authStateListeners.get(id); - if (listener != null) { - firebaseAuth.removeAuthStateListener(listener); - authStateListeners.remove(id); - result.success(null); - } else { - reportException( - result, - new FirebaseAuthException( - "ERROR_LISTENER_NOT_FOUND", - String.format(Locale.US, "Listener with identifier '%d' not found.", id))); - } - } - - private void handleSetLanguageCode(MethodCall call, Result result, FirebaseAuth firebaseAuth) { - Map arguments = call.arguments(); - String language = arguments.get("language"); - - firebaseAuth.setLanguageCode(language); - result.success(null); - } - - private class SignInCompleteListener implements OnCompleteListener { - private final Result result; - - SignInCompleteListener(Result result) { - this.result = result; - } - - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful() || task.getResult() == null) { - reportException(result, task.getException()); - } else { - FirebaseUser user = task.getResult().getUser(); - Map userMap = Collections.unmodifiableMap(mapFromUser(user)); - result.success(userMap); - } - } - } - - private class TaskVoidCompleteListener implements OnCompleteListener { - private final Result result; - - TaskVoidCompleteListener(Result result) { - this.result = result; - } - - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { - reportException(result, task.getException()); - } else { - result.success(null); - } - } - } - - private class GetSignInMethodsCompleteListener - implements OnCompleteListener { - private final Result result; - - GetSignInMethodsCompleteListener(Result result) { - this.result = result; - } - - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful() || task.getResult() == null) { - reportException(result, task.getException()); - } else { - List providers = task.getResult().getSignInMethods(); - result.success(providers); - } - } - } - - private Map userInfoToMap(UserInfo userInfo) { - Map map = new HashMap<>(); - map.put("providerId", userInfo.getProviderId()); - map.put("uid", userInfo.getUid()); - if (userInfo.getDisplayName() != null) { - map.put("displayName", userInfo.getDisplayName()); - } - if (userInfo.getPhotoUrl() != null) { - map.put("photoUrl", userInfo.getPhotoUrl().toString()); - } - if (userInfo.getEmail() != null) { - map.put("email", userInfo.getEmail()); - } - if (userInfo.getPhoneNumber() != null) { - map.put("phoneNumber", userInfo.getPhoneNumber()); - } - return map; - } - - private Map mapFromUser(FirebaseUser user) { - if (user != null) { - List> providerData = new ArrayList<>(); - for (UserInfo userInfo : user.getProviderData()) { - // Ignore phone provider since firebase provider is a super set of the phone - // provider. - if (userInfo.getProviderId().equals("phone")) { - continue; - } - providerData.add(Collections.unmodifiableMap(userInfoToMap(userInfo))); - } - Map userMap = userInfoToMap(user); - final FirebaseUserMetadata metadata = user.getMetadata(); - if (metadata != null) { - userMap.put("creationTimestamp", metadata.getCreationTimestamp()); - userMap.put("lastSignInTimestamp", metadata.getLastSignInTimestamp()); - } - userMap.put("isAnonymous", user.isAnonymous()); - userMap.put("isEmailVerified", user.isEmailVerified()); - userMap.put("providerData", Collections.unmodifiableList(providerData)); - return Collections.unmodifiableMap(userMap); - } else { - return null; - } - } - - private void markUserRequired(Result result) { - result.error("USER_REQUIRED", "Please authenticate with Firebase first", null); - } - - private void reportException(Result result, @Nullable Exception exception) { - if (exception != null) { - if (exception instanceof FirebaseAuthException) { - final FirebaseAuthException authException = (FirebaseAuthException) exception; - result.error(authException.getErrorCode(), exception.getMessage(), null); - } else if (exception instanceof FirebaseApiNotAvailableException) { - result.error("ERROR_API_NOT_AVAILABLE", exception.getMessage(), null); - } else if (exception instanceof FirebaseTooManyRequestsException) { - result.error("ERROR_TOO_MANY_REQUESTS", exception.getMessage(), null); - } else if (exception instanceof FirebaseNetworkException) { - result.error("ERROR_NETWORK_REQUEST_FAILED", exception.getMessage(), null); - } else { - result.error(exception.getClass().getSimpleName(), exception.getMessage(), null); - } - } else { - result.error("ERROR_UNKNOWN", "An unknown error occurred.", null); - } - } -} diff --git a/firebase_auth/ios/Assets/.gitkeep b/firebase_auth/ios/Assets/.gitkeep deleted file mode 100755 index e69de29..0000000 diff --git a/firebase_auth/ios/Classes/FirebaseAuthPlugin.h b/firebase_auth/ios/Classes/FirebaseAuthPlugin.h deleted file mode 100644 index 1383a16..0000000 --- a/firebase_auth/ios/Classes/FirebaseAuthPlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -@interface FLTFirebaseAuthPlugin : NSObject -@end diff --git a/firebase_auth/ios/Classes/FirebaseAuthPlugin.m b/firebase_auth/ios/Classes/FirebaseAuthPlugin.m deleted file mode 100644 index 0aeabe6..0000000 --- a/firebase_auth/ios/Classes/FirebaseAuthPlugin.m +++ /dev/null @@ -1,399 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseAuthPlugin.h" - -#import "Firebase/Firebase.h" - -static NSString *getFlutterErrorCode(NSError *error) { - NSString *code = [error userInfo][FIRAuthErrorUserInfoNameKey]; - if (code != nil) { - return code; - } - return [NSString stringWithFormat:@"ERROR_%d", (int)error.code]; -} - -NSDictionary *toDictionary(id userInfo) { - return @{ - @"providerId" : userInfo.providerID, - @"displayName" : userInfo.displayName ?: [NSNull null], - @"uid" : userInfo.uid ?: [NSNull null], - @"photoUrl" : userInfo.photoURL.absoluteString ?: [NSNull null], - @"email" : userInfo.email ?: [NSNull null], - @"phoneNumber" : userInfo.phoneNumber ?: [NSNull null], - }; -} - -@interface FLTFirebaseAuthPlugin () -@property(nonatomic, retain) NSMutableDictionary *authStateChangeListeners; -@property(nonatomic, retain) FlutterMethodChannel *channel; -@end - -@implementation FLTFirebaseAuthPlugin - -// Handles are ints used as indexes into the NSMutableDictionary of active observers -int nextHandle = 0; - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_auth" - binaryMessenger:[registrar messenger]]; - FLTFirebaseAuthPlugin *instance = [[FLTFirebaseAuthPlugin alloc] init]; - instance.channel = channel; - instance.authStateChangeListeners = [[NSMutableDictionary alloc] init]; - [registrar addMethodCallDelegate:instance channel:channel]; -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - } - return self; -} - -- (FIRAuth *_Nullable)getAuth:(NSDictionary *)args { - NSString *appName = [args objectForKey:@"app"]; - return [FIRAuth authWithApp:[FIRApp appNamed:appName]]; -} - -// TODO(jackson): We should use the renamed versions of the following methods -// when they are available in the Firebase SDK that this plugin is dependent on. -// * fetchSignInMethodsForEmail:completion: -// * reauthenticateAndRetrieveDataWithCredential:completion: -// * linkAndRetrieveDataWithCredential:completion: -// * signInAndRetrieveDataWithCredential:completion: -// See discussion at https://github.com/flutter/plugins/pull/1487 -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Wdeprecated-declarations" -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - if ([@"currentUser" isEqualToString:call.method]) { - id __block listener = [[self getAuth:call.arguments] - addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) { - [self sendResult:result forUser:user error:nil]; - [auth removeAuthStateDidChangeListener:listener]; - }]; - } else if ([@"signInAnonymously" isEqualToString:call.method]) { - [[self getAuth:call.arguments] - signInAnonymouslyWithCompletion:^(FIRAuthDataResult *authResult, NSError *error) { - [self sendResult:result forUser:authResult.user error:error]; - }]; - } else if ([@"signInWithCredential" isEqualToString:call.method]) { - [[self getAuth:call.arguments] - signInAndRetrieveDataWithCredential:[self getCredential:call.arguments] - completion:^(FIRAuthDataResult *authResult, NSError *error) { - [self sendResult:result forUser:authResult.user error:error]; - }]; - } else if ([@"createUserWithEmailAndPassword" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - NSString *password = call.arguments[@"password"]; - [[self getAuth:call.arguments] - createUserWithEmail:email - password:password - completion:^(FIRAuthDataResult *authResult, NSError *error) { - [self sendResult:result forUser:authResult.user error:error]; - }]; - } else if ([@"fetchSignInMethodsForEmail" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - [[self getAuth:call.arguments] - fetchProvidersForEmail:email - completion:^(NSArray *providers, NSError *error) { - [self sendResult:result forObject:providers error:error]; - }]; - } else if ([@"sendEmailVerification" isEqualToString:call.method]) { - [[self getAuth:call.arguments].currentUser - sendEmailVerificationWithCompletion:^(NSError *_Nullable error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"reload" isEqualToString:call.method]) { - [[self getAuth:call.arguments].currentUser reloadWithCompletion:^(NSError *_Nullable error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"delete" isEqualToString:call.method]) { - [[self getAuth:call.arguments].currentUser deleteWithCompletion:^(NSError *_Nullable error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"sendPasswordResetEmail" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - [[self getAuth:call.arguments] sendPasswordResetWithEmail:email - completion:^(NSError *error) { - [self sendResult:result - forObject:nil - error:error]; - }]; - } else if ([@"sendLinkToEmail" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - FIRActionCodeSettings *actionCodeSettings = [FIRActionCodeSettings new]; - actionCodeSettings.URL = [NSURL URLWithString:call.arguments[@"url"]]; - actionCodeSettings.handleCodeInApp = call.arguments[@"handleCodeInApp"]; - [actionCodeSettings setIOSBundleID:call.arguments[@"iOSBundleID"]]; - [actionCodeSettings setAndroidPackageName:call.arguments[@"androidPackageName"] - installIfNotAvailable:call.arguments[@"androidInstallIfNotAvailable"] - minimumVersion:call.arguments[@"androidMinimumVersion"]]; - [[self getAuth:call.arguments] sendSignInLinkToEmail:email - actionCodeSettings:actionCodeSettings - completion:^(NSError *_Nullable error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"isSignInWithEmailLink" isEqualToString:call.method]) { - NSString *link = call.arguments[@"link"]; - BOOL status = [[self getAuth:call.arguments] isSignInWithEmailLink:link]; - [self sendResult:result forObject:[NSNumber numberWithBool:status] error:nil]; - } else if ([@"signInWithEmailAndLink" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - NSString *link = call.arguments[@"link"]; - [[self getAuth:call.arguments] - signInWithEmail:email - link:link - completion:^(FIRAuthDataResult *_Nullable authResult, NSError *_Nullable error) { - [self sendResult:result forUser:authResult.user error:error]; - }]; - } else if ([@"signInWithEmailAndPassword" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - NSString *password = call.arguments[@"password"]; - [[self getAuth:call.arguments] - signInWithEmail:email - password:password - completion:^(FIRAuthDataResult *authResult, NSError *error) { - [self sendResult:result forUser:authResult.user error:error]; - }]; - } else if ([@"signOut" isEqualToString:call.method]) { - NSError *signOutError; - BOOL status = [[self getAuth:call.arguments] signOut:&signOutError]; - if (!status) { - NSLog(@"Error signing out: %@", signOutError); - [self sendResult:result forObject:nil error:signOutError]; - } else { - [self sendResult:result forObject:nil error:nil]; - } - } else if ([@"getIdToken" isEqualToString:call.method]) { - [[self getAuth:call.arguments].currentUser - getIDTokenForcingRefresh:YES - completion:^(NSString *_Nullable token, NSError *_Nullable error) { - [self sendResult:result forObject:token error:error]; - }]; - } else if ([@"reauthenticateWithCredential" isEqualToString:call.method]) { - [[self getAuth:call.arguments].currentUser - reauthenticateAndRetrieveDataWithCredential:[self getCredential:call.arguments] - completion:^(FIRAuthDataResult *r, - NSError *_Nullable error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"linkWithCredential" isEqualToString:call.method]) { - [[self getAuth:call.arguments].currentUser - linkAndRetrieveDataWithCredential:[self getCredential:call.arguments] - completion:^(FIRAuthDataResult *r, NSError *error) { - [self sendResult:result forUser:r.user error:error]; - }]; - } else if ([@"unlinkFromProvider" isEqualToString:call.method]) { - NSString *provider = call.arguments[@"provider"]; - [[self getAuth:call.arguments].currentUser - unlinkFromProvider:provider - completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { - [self sendResult:result forUser:user error:error]; - }]; - } else if ([@"updateEmail" isEqualToString:call.method]) { - NSString *email = call.arguments[@"email"]; - [[self getAuth:call.arguments].currentUser updateEmail:email - completion:^(NSError *error) { - [self sendResult:result - forObject:nil - error:error]; - }]; - } else if ([@"updatePassword" isEqualToString:call.method]) { - NSString *password = call.arguments[@"password"]; - [[self getAuth:call.arguments].currentUser updatePassword:password - completion:^(NSError *error) { - [self sendResult:result - forObject:nil - error:error]; - }]; - } else if ([@"updateProfile" isEqualToString:call.method]) { - FIRUserProfileChangeRequest *changeRequest = - [[self getAuth:call.arguments].currentUser profileChangeRequest]; - if (call.arguments[@"displayName"]) { - changeRequest.displayName = call.arguments[@"displayName"]; - } - if (call.arguments[@"photoUrl"]) { - changeRequest.photoURL = [NSURL URLWithString:call.arguments[@"photoUrl"]]; - } - [changeRequest commitChangesWithCompletion:^(NSError *error) { - [self sendResult:result forObject:nil error:error]; - }]; - } else if ([@"signInWithCustomToken" isEqualToString:call.method]) { - NSString *token = call.arguments[@"token"]; - [[self getAuth:call.arguments] - signInWithCustomToken:token - completion:^(FIRAuthDataResult *authResult, NSError *error) { - [self sendResult:result forUser:authResult.user error:error]; - }]; - - } else if ([@"startListeningAuthState" isEqualToString:call.method]) { - NSNumber *identifier = [NSNumber numberWithInteger:nextHandle++]; - - FIRAuthStateDidChangeListenerHandle listener = [[self getAuth:call.arguments] - addAuthStateDidChangeListener:^(FIRAuth *_Nonnull auth, FIRUser *_Nullable user) { - NSMutableDictionary *response = [[NSMutableDictionary alloc] init]; - response[@"id"] = identifier; - if (user) { - response[@"user"] = [self dictionaryFromUser:user]; - } - [self.channel invokeMethod:@"onAuthStateChanged" arguments:response]; - }]; - [self.authStateChangeListeners setObject:listener forKey:identifier]; - result(identifier); - } else if ([@"stopListeningAuthState" isEqualToString:call.method]) { - NSNumber *identifier = - [NSNumber numberWithInteger:[call.arguments[@"id"] unsignedIntegerValue]]; - - FIRAuthStateDidChangeListenerHandle listener = self.authStateChangeListeners[identifier]; - if (listener) { - [[self getAuth:call.arguments] - removeAuthStateDidChangeListener:self.authStateChangeListeners]; - [self.authStateChangeListeners removeObjectForKey:identifier]; - result(nil); - } else { - result([FlutterError - errorWithCode:@"ERROR_LISTENER_NOT_FOUND" - message:[NSString stringWithFormat:@"Listener with identifier '%d' not found.", - identifier.intValue] - details:nil]); - } - } else if ([@"verifyPhoneNumber" isEqualToString:call.method]) { - NSString *phoneNumber = call.arguments[@"phoneNumber"]; - NSNumber *handle = call.arguments[@"handle"]; - [[FIRPhoneAuthProvider provider] - verifyPhoneNumber:phoneNumber - UIDelegate:nil - completion:^(NSString *verificationID, NSError *error) { - if (error) { - [self.channel invokeMethod:@"phoneVerificationFailed" - arguments:@{ - @"exception" : [self mapVerifyPhoneError:error], - @"handle" : handle - }]; - } else { - [self.channel - invokeMethod:@"phoneCodeSent" - arguments:@{@"verificationId" : verificationID, @"handle" : handle}]; - } - }]; - result(nil); - } else if ([@"signInWithPhoneNumber" isEqualToString:call.method]) { - NSString *verificationId = call.arguments[@"verificationId"]; - NSString *smsCode = call.arguments[@"smsCode"]; - - FIRPhoneAuthCredential *credential = - [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationId - verificationCode:smsCode]; - [[self getAuth:call.arguments] - signInAndRetrieveDataWithCredential:credential - completion:^(FIRAuthDataResult *r, NSError *_Nullable error) { - [self sendResult:result forUser:r.user error:error]; - }]; - } else if ([@"setLanguageCode" isEqualToString:call.method]) { - NSString *language = call.arguments[@"language"]; - [[self getAuth:call.arguments] setLanguageCode:language]; - [self sendResult:result forObject:nil error:nil]; - } else { - result(FlutterMethodNotImplemented); - } -} - -- (NSMutableDictionary *)dictionaryFromUser:(FIRUser *)user { - NSMutableArray *> *providerData = - [NSMutableArray arrayWithCapacity:user.providerData.count]; - for (id userInfo in user.providerData) { - [providerData addObject:toDictionary(userInfo)]; - } - - long creationDate = [user.metadata.creationDate timeIntervalSince1970]; - long lastSignInDate = [user.metadata.lastSignInDate timeIntervalSince1970]; - - NSMutableDictionary *userData = [toDictionary(user) mutableCopy]; - userData[@"creationTimestamp"] = [NSNumber numberWithLong:creationDate]; - userData[@"lastSignInTimestamp"] = [NSNumber numberWithInt:lastSignInDate]; - userData[@"isAnonymous"] = [NSNumber numberWithBool:user.isAnonymous]; - userData[@"isEmailVerified"] = [NSNumber numberWithBool:user.isEmailVerified]; - userData[@"providerData"] = providerData; - return userData; -} -#pragma clang diagnostic pop - -- (void)sendResult:(FlutterResult)result forUser:(FIRUser *)user error:(NSError *)error { - [self sendResult:result - forObject:(user != nil ? [self dictionaryFromUser:user] : nil) - error:error]; -} - -- (void)sendResult:(FlutterResult)result forObject:(NSObject *)object error:(NSError *)error { - if (error != nil) { - result([FlutterError errorWithCode:getFlutterErrorCode(error) - message:error.localizedDescription - details:nil]); - } else if (object == nil) { - result(nil); - } else { - result(object); - } -} - -- (id)mapVerifyPhoneError:(NSError *)error { - NSString *errorCode = @"verifyPhoneNumberError"; - - if (error.code == FIRAuthErrorCodeCaptchaCheckFailed) { - errorCode = @"captchaCheckFailed"; - } else if (error.code == FIRAuthErrorCodeQuotaExceeded) { - errorCode = @"quotaExceeded"; - } else if (error.code == FIRAuthErrorCodeInvalidPhoneNumber) { - errorCode = @"invalidPhoneNumber"; - } else if (error.code == FIRAuthErrorCodeMissingPhoneNumber) { - errorCode = @"missingPhoneNumber"; - } - return @{@"code" : errorCode, @"message" : error.localizedDescription}; -} - -- (FIRAuthCredential *)getCredential:(NSDictionary *)arguments { - NSString *provider = arguments[@"provider"]; - NSDictionary *data = arguments[@"data"]; - FIRAuthCredential *credential; - if ([FIREmailAuthProviderID isEqualToString:provider]) { - NSString *email = data[@"email"]; - if ([data objectForKey:@"password"]) { - NSString *password = data[@"password"]; - credential = [FIREmailAuthProvider credentialWithEmail:email password:password]; - } else { - NSString *link = data[@"link"]; - credential = [FIREmailAuthProvider credentialWithEmail:email link:link]; - } - } else if ([FIRGoogleAuthProviderID isEqualToString:provider]) { - NSString *idToken = data[@"idToken"]; - NSString *accessToken = data[@"accessToken"]; - credential = [FIRGoogleAuthProvider credentialWithIDToken:idToken accessToken:accessToken]; - } else if ([FIRFacebookAuthProviderID isEqualToString:provider]) { - NSString *accessToken = data[@"accessToken"]; - credential = [FIRFacebookAuthProvider credentialWithAccessToken:accessToken]; - } else if ([FIRTwitterAuthProviderID isEqualToString:provider]) { - NSString *authToken = data[@"authToken"]; - NSString *authTokenSecret = data[@"authTokenSecret"]; - credential = [FIRTwitterAuthProvider credentialWithToken:authToken secret:authTokenSecret]; - } else if ([FIRGitHubAuthProviderID isEqualToString:provider]) { - NSString *token = data[@"token"]; - credential = [FIRGitHubAuthProvider credentialWithToken:token]; - } else if ([FIRPhoneAuthProviderID isEqualToString:provider]) { - NSString *verificationId = data[@"verificationId"]; - NSString *smsCode = data[@"smsCode"]; - credential = [[FIRPhoneAuthProvider providerWithAuth:[self getAuth:arguments]] - credentialWithVerificationID:verificationId - verificationCode:smsCode]; - } else { - NSLog(@"Support for an auth provider with identifier '%@' is not implemented.", provider); - } - return credential; -} -@end diff --git a/firebase_auth/ios/firebase_auth.podspec b/firebase_auth/ios/firebase_auth.podspec deleted file mode 100755 index 09b1303..0000000 --- a/firebase_auth/ios/firebase_auth.podspec +++ /dev/null @@ -1,22 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# -Pod::Spec.new do |s| - s.name = 'firebase_auth' - s.version = '0.0.1' - s.summary = 'Firebase Auth plugin for Flutter.' - s.description = <<-DESC -Firebase Auth plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_auth' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.ios.deployment_target = '8.0' - s.dependency 'Flutter' - s.dependency 'Firebase/Auth' - s.dependency 'Firebase/Core' - s.static_framework = true -end diff --git a/firebase_auth/lib/firebase_auth.dart b/firebase_auth/lib/firebase_auth.dart deleted file mode 100755 index 1f31ead..0000000 --- a/firebase_auth/lib/firebase_auth.dart +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2018, the Flutter project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -library firebase_auth; - -import 'dart:async'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; - -part 'src/auth_provider/email_auth_provider.dart'; -part 'src/auth_provider/facebook_auth_provider.dart'; -part 'src/auth_provider/github_auth_provider.dart'; -part 'src/auth_provider/google_auth_provider.dart'; -part 'src/auth_provider/phone_auth_provider.dart'; -part 'src/auth_provider/twitter_auth_provider.dart'; -part 'src/auth_credential.dart'; -part 'src/auth_exception.dart'; -part 'src/firebase_auth.dart'; -part 'src/firebase_user.dart'; -part 'src/user_info.dart'; -part 'src/user_metadata.dart'; -part 'src/user_update_info.dart'; diff --git a/firebase_auth/lib/src/auth_credential.dart b/firebase_auth/lib/src/auth_credential.dart deleted file mode 100644 index 7240b04..0000000 --- a/firebase_auth/lib/src/auth_credential.dart +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2018, the Flutter project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -part of firebase_auth; - -/// Represents the credentials returned by calling the `getCredential` method of -/// an auth provider. -class AuthCredential { - AuthCredential._(this._provider, this._data); - final String _provider; - final Map _data; -} diff --git a/firebase_auth/lib/src/auth_exception.dart b/firebase_auth/lib/src/auth_exception.dart deleted file mode 100644 index bbdc746..0000000 --- a/firebase_auth/lib/src/auth_exception.dart +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -/// Generic exception related to Firebase Authentication. -/// Check the error code and message for more details. -class AuthException implements Exception { - const AuthException(this.code, this.message); - - final String code; - final String message; -} diff --git a/firebase_auth/lib/src/auth_provider/email_auth_provider.dart b/firebase_auth/lib/src/auth_provider/email_auth_provider.dart deleted file mode 100644 index 9709452..0000000 --- a/firebase_auth/lib/src/auth_provider/email_auth_provider.dart +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2018, the Flutter project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -part of firebase_auth; - -class EmailAuthProvider { - static const String providerId = 'password'; - - static AuthCredential getCredential({ - String email, - String password, - }) { - return AuthCredential._(providerId, { - 'email': email, - 'password': password, - }); - } - - static AuthCredential getCredentialWithLink({ - String email, - String link, - }) { - return AuthCredential._(providerId, { - 'email': email, - 'link': link, - }); - } -} diff --git a/firebase_auth/lib/src/auth_provider/facebook_auth_provider.dart b/firebase_auth/lib/src/auth_provider/facebook_auth_provider.dart deleted file mode 100644 index e52233e..0000000 --- a/firebase_auth/lib/src/auth_provider/facebook_auth_provider.dart +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2018, the Flutter project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -part of firebase_auth; - -class FacebookAuthProvider { - static const String providerId = 'facebook.com'; - - static AuthCredential getCredential({String accessToken}) { - return AuthCredential._( - providerId, - {'accessToken': accessToken}, - ); - } -} diff --git a/firebase_auth/lib/src/auth_provider/github_auth_provider.dart b/firebase_auth/lib/src/auth_provider/github_auth_provider.dart deleted file mode 100644 index 418f6f6..0000000 --- a/firebase_auth/lib/src/auth_provider/github_auth_provider.dart +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2018, the Flutter project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -part of firebase_auth; - -class GithubAuthProvider { - static const String providerId = 'github.com'; - - static AuthCredential getCredential({@required String token}) { - return AuthCredential._(providerId, {'token': token}); - } -} diff --git a/firebase_auth/lib/src/auth_provider/google_auth_provider.dart b/firebase_auth/lib/src/auth_provider/google_auth_provider.dart deleted file mode 100644 index 891bbeb..0000000 --- a/firebase_auth/lib/src/auth_provider/google_auth_provider.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2018, the Flutter project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -part of firebase_auth; - -class GoogleAuthProvider { - static const String providerId = 'google.com'; - - static AuthCredential getCredential({ - @required String idToken, - @required String accessToken, - }) { - return AuthCredential._(providerId, { - 'idToken': idToken, - 'accessToken': accessToken, - }); - } -} diff --git a/firebase_auth/lib/src/auth_provider/phone_auth_provider.dart b/firebase_auth/lib/src/auth_provider/phone_auth_provider.dart deleted file mode 100644 index 9ff5d94..0000000 --- a/firebase_auth/lib/src/auth_provider/phone_auth_provider.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2018, the Flutter project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -part of firebase_auth; - -class PhoneAuthProvider { - static const String providerId = 'phone'; - - static AuthCredential getCredential({ - @required String verificationId, - @required String smsCode, - }) { - return AuthCredential._(providerId, { - 'verificationId': verificationId, - 'smsCode': smsCode, - }); - } -} diff --git a/firebase_auth/lib/src/auth_provider/twitter_auth_provider.dart b/firebase_auth/lib/src/auth_provider/twitter_auth_provider.dart deleted file mode 100644 index 7a9656e..0000000 --- a/firebase_auth/lib/src/auth_provider/twitter_auth_provider.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2018, the Flutter project authors. Please see the AUTHORS file -// for details. All rights reserved. Use of this source code is governed by a -// BSD-style license that can be found in the LICENSE file. - -part of firebase_auth; - -class TwitterAuthProvider { - static const String providerId = 'twitter.com'; - - static AuthCredential getCredential({ - @required String authToken, - @required String authTokenSecret, - }) { - return AuthCredential._(providerId, { - 'authToken': authToken, - 'authTokenSecret': authTokenSecret, - }); - } -} diff --git a/firebase_auth/lib/src/firebase_auth.dart b/firebase_auth/lib/src/firebase_auth.dart deleted file mode 100644 index 44b9168..0000000 --- a/firebase_auth/lib/src/firebase_auth.dart +++ /dev/null @@ -1,516 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -typedef void PhoneVerificationCompleted(FirebaseUser firebaseUser); -typedef void PhoneVerificationFailed(AuthException error); -typedef void PhoneCodeSent(String verificationId, [int forceResendingToken]); -typedef void PhoneCodeAutoRetrievalTimeout(String verificationId); - -/// The entry point of the Firebase Authentication SDK. -class FirebaseAuth { - FirebaseAuth._(this.app) { - channel.setMethodCallHandler(_callHandler); - } - - /// Provides an instance of this class corresponding to `app`. - factory FirebaseAuth.fromApp(FirebaseApp app) { - assert(app != null); - return FirebaseAuth._(app); - } - - /// Provides an instance of this class corresponding to the default app. - static final FirebaseAuth instance = FirebaseAuth._(FirebaseApp.instance); - - @visibleForTesting - static const MethodChannel channel = MethodChannel( - 'plugins.flutter.io/firebase_auth', - ); - - final Map> _authStateChangedControllers = - >{}; - - static int nextHandle = 0; - final Map> _phoneAuthCallbacks = - >{}; - - final FirebaseApp app; - - /// Receive [FirebaseUser] each time the user signIn or signOut - Stream get onAuthStateChanged { - Future _handle; - - StreamController controller; - controller = StreamController.broadcast(onListen: () { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - _handle = channel.invokeMethod('startListeningAuthState', - {"app": app.name}).then((dynamic v) => v); - _handle.then((int handle) { - _authStateChangedControllers[handle] = controller; - }); - }, onCancel: () { - _handle.then((int handle) async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - await channel.invokeMethod("stopListeningAuthState", - {"id": handle, "app": app.name}); - _authStateChangedControllers.remove(handle); - }); - }); - - return controller.stream; - } - - /// Asynchronously creates and becomes an anonymous user. - /// - /// If there is already an anonymous user signed in, that user will be - /// returned instead. If there is any other existing user signed in, that - /// user will be signed out. - /// - /// **Important**: You must enable Anonymous accounts in the Auth section - /// of the Firebase console before being able to use them. - /// - /// Errors: - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Anonymous accounts are not enabled. - Future signInAnonymously() async { - final Map data = await channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod('signInAnonymously', {"app": app.name}); - final FirebaseUser currentUser = FirebaseUser._(data, app); - return currentUser; - } - - /// Tries to create a new user account with the given email address and password. - /// - /// If successful, it also signs the user in into the app and updates - /// the [onAuthStateChanged] stream. - /// - /// Errors: - /// • `ERROR_WEAK_PASSWORD` - If the password is not strong enough. - /// • `ERROR_INVALID_EMAIL` - If the email address is malformed. - /// • `ERROR_EMAIL_ALREADY_IN_USE` - If the email is already in use by a different account. - Future createUserWithEmailAndPassword({ - @required String email, - @required String password, - }) async { - assert(email != null); - assert(password != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - final Map data = await channel.invokeMethod( - 'createUserWithEmailAndPassword', - {'email': email, 'password': password, 'app': app.name}, - ); - final FirebaseUser currentUser = FirebaseUser._(data, app); - return currentUser; - } - - /// Returns a list of sign-in methods that can be used to sign in a given - /// user (identified by its main email address). - /// - /// This method is useful when you support multiple authentication mechanisms - /// if you want to implement an email-first authentication flow. - /// - /// Errors: - /// • `ERROR_INVALID_CREDENTIAL` - If the [email] address is malformed. - /// • `ERROR_USER_NOT_FOUND` - If there is no user corresponding to the given [email] address. - Future> fetchSignInMethodsForEmail({ - @required String email, - }) async { - assert(email != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - final List providers = await channel.invokeMethod( - 'fetchSignInMethodsForEmail', - {'email': email, 'app': app.name}, - ); - return providers?.cast(); - } - - /// Triggers the Firebase Authentication backend to send a password-reset - /// email to the given email address, which must correspond to an existing - /// user of your app. - /// - /// Errors: - /// • `ERROR_INVALID_EMAIL` - If the [email] address is malformed. - /// • `ERROR_USER_NOT_FOUND` - If there is no user corresponding to the given [email] address. - Future sendPasswordResetEmail({ - @required String email, - }) async { - assert(email != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await channel.invokeMethod( - 'sendPasswordResetEmail', - {'email': email, 'app': app.name}, - ); - } - - /// Sends a sign in with email link to provided email address. - Future sendSignInWithEmailLink({ - @required String email, - @required String url, - @required bool handleCodeInApp, - @required String iOSBundleID, - @required String androidPackageName, - @required bool androidInstallIfNotAvailable, - @required String androidMinimumVersion, - }) async { - assert(email != null); - assert(url != null); - assert(handleCodeInApp != null); - assert(iOSBundleID != null); - assert(androidPackageName != null); - assert(androidInstallIfNotAvailable != null); - assert(androidMinimumVersion != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - await channel.invokeMethod( - 'sendLinkToEmail', - { - 'email': email, - 'url': url, - 'handleCodeInApp': handleCodeInApp, - 'iOSBundleID': iOSBundleID, - 'androidPackageName': androidPackageName, - 'androidInstallIfNotAvailable': androidInstallIfNotAvailable, - 'androidMinimumVersion': androidMinimumVersion, - 'app': app.name, - }, - ); - } - - /// Checks if link is an email sign-in link. - Future isSignInWithEmailLink(String link) async { - return await channel.invokeMethod( - 'isSignInWithEmailLink', - {'link': link, 'app': app.name}, - ); - } - - /// Signs in using an email address and email sign-in link. - /// - /// Errors: - /// • `ERROR_NOT_ALLOWED` - Indicates that email and email sign-in link - /// accounts are not enabled. Enable them in the Auth section of the - /// Firebase console. - /// • `ERROR_DISABLED` - Indicates the user's account is disabled. - /// • `ERROR_INVALID` - Indicates the email address is invalid. - Future signInWithEmailAndLink( - {String email, String link}) async { - final Map data = await channel.invokeMethod( - 'signInWithEmailAndLink', - { - 'app': app.name, - 'email': email, - 'link': link, - }, - ); - final FirebaseUser currentUser = FirebaseUser._(data, app); - return currentUser; - } - - /// Tries to sign in a user with the given email address and password. - /// - /// If successful, it also signs the user in into the app and updates - /// the [onAuthStateChanged] stream. - /// - /// **Important**: You must enable Email & Password accounts in the Auth - /// section of the Firebase console before being able to use them. - /// - /// Errors: - /// • `ERROR_INVALID_EMAIL` - If the [email] address is malformed. - /// • `ERROR_WRONG_PASSWORD` - If the [password] is wrong. - /// • `ERROR_USER_NOT_FOUND` - If there is no user corresponding to the given [email] address, or if the user has been deleted. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_TOO_MANY_REQUESTS` - If there was too many attempts to sign in as this user. - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Email & Password accounts are not enabled. - Future signInWithEmailAndPassword({ - @required String email, - @required String password, - }) { - assert(email != null); - assert(password != null); - final AuthCredential credential = EmailAuthProvider.getCredential( - email: email, - password: password, - ); - return signInWithCredential(credential); - } - - /// Asynchronously signs in to Firebase with the given 3rd-party credentials - /// (e.g. a Facebook login Access Token, a Google ID Token/Access Token pair, - /// etc.) and returns additional identity provider data. - /// - /// If successful, it also signs the user in into the app and updates - /// the [onAuthStateChanged] stream. - /// - /// If the user doesn't have an account already, one will be created automatically. - /// - /// **Important**: You must enable the relevant accounts in the Auth section - /// of the Firebase console before being able to use them. - /// - /// Errors: - /// • `ERROR_INVALID_CREDENTIAL` - If the credential data is malformed or has expired. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL` - If there already exists an account with the email address asserted by Google. - /// Resolve this case by calling [fetchSignInMethodsForEmail] and then asking the user to sign in using one of them. - /// This error will only be thrown if the "One account per email address" setting is enabled in the Firebase console (recommended). - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Google accounts are not enabled. - /// • `ERROR_INVALID_ACTION_CODE` - If the action code in the link is malformed, expired, or has already been used. - /// This can only occur when using [EmailAuthProvider.getCredentialWithLink] to obtain the credential. - Future signInWithCredential(AuthCredential credential) async { - assert(credential != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - final Map data = await channel.invokeMethod( - 'signInWithCredential', - { - 'app': app.name, - 'provider': credential._provider, - 'data': credential._data, - }, - ); - final FirebaseUser currentUser = FirebaseUser._(data, app); - return currentUser; - } - - /// Starts the phone number verification process for the given phone number. - /// - /// Either sends an SMS with a 6 digit code to the phone number specified, - /// or sign's the user in and [verificationCompleted] is called. - /// - /// No duplicated SMS will be sent out upon re-entry (before timeout). - /// - /// Make sure to test all scenarios below: - /// • You directly get logged in if Google Play Services verified the phone - /// number instantly or helped you auto-retrieve the verification code. - /// • Auto-retrieve verification code timed out. - /// • Error cases when you receive [verificationFailed] callback. - /// - /// [phoneNumber] The phone number for the account the user is signing up - /// for or signing into. Make sure to pass in a phone number with country - /// code prefixed with plus sign ('+'). - /// - /// [timeout] The maximum amount of time you are willing to wait for SMS - /// auto-retrieval to be completed by the library. Maximum allowed value - /// is 2 minutes. Use 0 to disable SMS-auto-retrieval. Setting this to 0 - /// will also cause [codeAutoRetrievalTimeout] to be called immediately. - /// If you specified a positive value less than 30 seconds, library will - /// default to 30 seconds. - /// - /// [forceResendingToken] The [forceResendingToken] obtained from [codeSent] - /// callback to force re-sending another verification SMS before the - /// auto-retrieval timeout. - /// - /// [verificationCompleted] This callback must be implemented. - /// It will trigger when an SMS is auto-retrieved or the phone number has - /// been instantly verified. The callback will provide a [FirebaseUser]. - /// - /// [verificationFailed] This callback must be implemented. - /// Triggered when an error occurred during phone number verification. - /// - /// [codeSent] Optional callback. - /// It will trigger when an SMS has been sent to the users phone, - /// and will include a [verificationId] and [forceResendingToken]. - /// - /// [codeAutoRetrievalTimeout] Optional callback. - /// It will trigger when SMS auto-retrieval times out and provide a - /// [verificationId]. - Future verifyPhoneNumber({ - @required String phoneNumber, - @required Duration timeout, - int forceResendingToken, - @required PhoneVerificationCompleted verificationCompleted, - @required PhoneVerificationFailed verificationFailed, - @required PhoneCodeSent codeSent, - @required PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout, - }) async { - final Map callbacks = { - 'PhoneVerificationCompleted': verificationCompleted, - 'PhoneVerificationFailed': verificationFailed, - 'PhoneCodeSent': codeSent, - 'PhoneCodeAuthRetrievalTimeout': codeAutoRetrievalTimeout, - }; - nextHandle += 1; - _phoneAuthCallbacks[nextHandle] = callbacks; - - final Map params = { - 'handle': nextHandle, - 'phoneNumber': phoneNumber, - 'timeout': timeout.inMilliseconds, - 'forceResendingToken': forceResendingToken, - 'app': app.name, - }; - - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - await channel.invokeMethod('verifyPhoneNumber', params); - } - - /// Tries to sign in a user with a given Custom Token [token]. - /// - /// If successful, it also signs the user in into the app and updates - /// the [onAuthStateChanged] stream. - /// - /// Use this method after you retrieve a Firebase Auth Custom Token from your server. - /// - /// If the user identified by the [uid] specified in the token doesn't - /// have an account already, one will be created automatically. - /// - /// Read how to use Custom Token authentication and the cases where it is - /// useful in [the guides](https://firebase.google.com/docs/auth/android/custom-auth). - /// - /// Errors: - /// • `ERROR_INVALID_CUSTOM_TOKEN` - The custom token format is incorrect. - /// Please check the documentation. - /// • `ERROR_CUSTOM_TOKEN_MISMATCH` - Invalid configuration. - /// Ensure your app's SHA1 is correct in the Firebase console. - Future signInWithCustomToken({@required String token}) async { - assert(token != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - final Map data = await channel.invokeMethod( - 'signInWithCustomToken', - {'token': token, 'app': app.name}, - ); - final FirebaseUser currentUser = FirebaseUser._(data, app); - return currentUser; - } - - /// Signs out the current user and clears it from the disk cache. - /// - /// If successful, it signs the user out of the app and updates - /// the [onAuthStateChanged] stream. - Future signOut() async { - return await channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod("signOut", {'app': app.name}); - } - - /// Returns the currently signed-in [FirebaseUser] or [null] if there is none. - Future currentUser() async { - final Map data = await channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod("currentUser", {'app': app.name}); - final FirebaseUser currentUser = - data == null ? null : FirebaseUser._(data, app); - return currentUser; - } - - /// Associates a user account from a third-party identity provider with this - /// user and returns additional identity provider data. - /// - /// This allows the user to sign in to this account in the future with - /// the given account. - /// - /// Errors: - /// • `ERROR_WEAK_PASSWORD` - If the password is not strong enough. - /// • `ERROR_INVALID_CREDENTIAL` - If the credential is malformed or has expired. - /// • `ERROR_CREDENTIAL_ALREADY_IN_USE` - If the account is already in use by a different account. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_REQUIRES_RECENT_LOGIN` - If the user's last sign-in time does not meet the security threshold. Use reauthenticate methods to resolve. - /// • `ERROR_PROVIDER_ALREADY_LINKED` - If the current user already has an account of this type linked. - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that this type of account is not enabled. - /// • `ERROR_INVALID_ACTION_CODE` - If the action code in the link is malformed, expired, or has already been used. - /// This can only occur when using [EmailAuthProvider.getCredentialWithLink] to obtain the credential. - Future linkWithCredential(AuthCredential credential) async { - assert(credential != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - final Map data = await channel.invokeMethod( - 'linkWithCredential', - { - 'app': app.name, - 'provider': credential._provider, - 'data': credential._data, - }, - ); - final FirebaseUser currentUser = FirebaseUser._(data, app); - return currentUser; - } - - /// Sets the user-facing language code for auth operations that can be - /// internationalized, such as [sendEmailVerification]. This language - /// code should follow the conventions defined by the IETF in BCP47. - Future setLanguageCode(String language) async { - assert(language != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - await FirebaseAuth.channel.invokeMethod('setLanguageCode', { - 'language': language, - 'app': app.name, - }); - } - - Future _callHandler(MethodCall call) async { - switch (call.method) { - case 'onAuthStateChanged': - _onAuthStageChangedHandler(call); - break; - case 'phoneVerificationCompleted': - final int handle = call.arguments['handle']; - final PhoneVerificationCompleted verificationCompleted = - _phoneAuthCallbacks[handle]['PhoneVerificationCompleted']; - verificationCompleted(await currentUser()); - break; - case 'phoneVerificationFailed': - final int handle = call.arguments['handle']; - final PhoneVerificationFailed verificationFailed = - _phoneAuthCallbacks[handle]['PhoneVerificationFailed']; - final Map exception = call.arguments['exception']; - verificationFailed( - AuthException(exception['code'], exception['message'])); - break; - case 'phoneCodeSent': - final int handle = call.arguments['handle']; - final String verificationId = call.arguments['verificationId']; - final int forceResendingToken = call.arguments['forceResendingToken']; - - final PhoneCodeSent codeSent = - _phoneAuthCallbacks[handle]['PhoneCodeSent']; - if (forceResendingToken == null) { - codeSent(verificationId); - } else { - codeSent(verificationId, forceResendingToken); - } - break; - case 'phoneCodeAutoRetrievalTimeout': - final int handle = call.arguments['handle']; - final PhoneCodeAutoRetrievalTimeout codeAutoRetrievalTimeout = - _phoneAuthCallbacks[handle]['PhoneCodeAuthRetrievalTimeout']; - final String verificationId = call.arguments['verificationId']; - codeAutoRetrievalTimeout(verificationId); - break; - } - } - - void _onAuthStageChangedHandler(MethodCall call) { - final Map data = call.arguments["user"]; - final int id = call.arguments["id"]; - - final FirebaseUser currentUser = - data != null ? FirebaseUser._(data, app) : null; - _authStateChangedControllers[id].add(currentUser); - } -} diff --git a/firebase_auth/lib/src/firebase_user.dart b/firebase_auth/lib/src/firebase_user.dart deleted file mode 100644 index 15fa458..0000000 --- a/firebase_auth/lib/src/firebase_user.dart +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -/// Represents a user. -class FirebaseUser extends UserInfo { - FirebaseUser._(Map data, FirebaseApp app) - : providerData = data['providerData'] - .map((dynamic item) => UserInfo._(item, app)) - .toList(), - _metadata = FirebaseUserMetadata._(data), - super._(data, app); - - final List providerData; - final FirebaseUserMetadata _metadata; - - // Returns true if the user is anonymous; that is, the user account was - // created with signInAnonymously() and has not been linked to another - // account. - FirebaseUserMetadata get metadata => _metadata; - - bool get isAnonymous => _data['isAnonymous']; - - /// Returns true if the user's email is verified. - bool get isEmailVerified => _data['isEmailVerified']; - - /// Obtains the id token for the current user, forcing a [refresh] if desired. - /// - /// Useful when authenticating against your own backend. Use our server - /// SDKs or follow the official documentation to securely verify the - /// integrity and validity of this token. - /// - /// Completes with an error if the user is signed out. - Future getIdToken({bool refresh = false}) async { - return await FirebaseAuth.channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod('getIdToken', { - 'refresh': refresh, - 'app': _app.name, - }); - } - - /// Initiates email verification for the user. - Future sendEmailVerification() async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - await FirebaseAuth.channel.invokeMethod( - 'sendEmailVerification', {'app': _app.name}); - } - - /// Manually refreshes the data of the current user (for example, - /// attached providers, display name, and so on). - Future reload() async { - await FirebaseAuth.channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod('reload', {'app': _app.name}); - } - - /// Deletes the user record from your Firebase project's database. - Future delete() async { - await FirebaseAuth.channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod('delete', {'app': _app.name}); - } - - /// Updates the email address of the user. - /// - /// The original email address recipient will receive an email that allows - /// them to revoke the email address change, in order to protect them - /// from account hijacking. - /// - /// **Important**: This is a security sensitive operation that requires - /// the user to have recently signed in. - /// - /// Errors: - /// • `ERROR_INVALID_CREDENTIAL` - If the email address is malformed. - /// • `ERROR_EMAIL_ALREADY_IN_USE` - If the email is already in use by a different account. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_USER_NOT_FOUND` - If the user has been deleted (for example, in the Firebase console) - /// • `ERROR_REQUIRES_RECENT_LOGIN` - If the user's last sign-in time does not meet the security threshold. Use reauthenticate methods to resolve. - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Email & Password accounts are not enabled. - Future updateEmail(String email) async { - assert(email != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await FirebaseAuth.channel.invokeMethod( - 'updateEmail', - {'email': email, 'app': _app.name}, - ); - } - - /// Updates the password of the user. - /// - /// Anonymous users who update both their email and password will no - /// longer be anonymous. They will be able to log in with these credentials. - /// - /// **Important**: This is a security sensitive operation that requires - /// the user to have recently signed in. - /// - /// Errors: - /// • `ERROR_WEAK_PASSWORD` - If the password is not strong enough. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_USER_NOT_FOUND` - If the user has been deleted (for example, in the Firebase console) - /// • `ERROR_REQUIRES_RECENT_LOGIN` - If the user's last sign-in time does not meet the security threshold. Use reauthenticate methods to resolve. - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Email & Password accounts are not enabled. - Future updatePassword(String password) async { - assert(password != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await FirebaseAuth.channel.invokeMethod( - 'updatePassword', - {'password': password, 'app': _app.name}, - ); - } - - /// Updates the user profile information. - /// - /// Errors: - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_USER_NOT_FOUND` - If the user has been deleted (for example, in the Firebase console) - Future updateProfile(UserUpdateInfo userUpdateInfo) async { - assert(userUpdateInfo != null); - final Map data = userUpdateInfo._updateData; - data['app'] = _app.name; - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await FirebaseAuth.channel.invokeMethod( - 'updateProfile', - data, - ); - } - - /// Renews the user’s authentication tokens by validating a fresh set of - /// [credential]s supplied by the user and returns additional identity provider - /// data. - /// - /// This is used to prevent or resolve `ERROR_REQUIRES_RECENT_LOGIN` - /// response to operations that require a recent sign-in. - /// - /// If the user associated with the supplied credential is different from the - /// current user, or if the validation of the supplied credentials fails; an - /// error is returned and the current user remains signed in. - /// - /// Errors: - /// • `ERROR_INVALID_CREDENTIAL` - If the [authToken] or [authTokenSecret] is malformed or has expired. - /// • `ERROR_USER_DISABLED` - If the user has been disabled (for example, in the Firebase console) - /// • `ERROR_USER_NOT_FOUND` - If the user has been deleted (for example, in the Firebase console) - /// • `ERROR_OPERATION_NOT_ALLOWED` - Indicates that Email & Password accounts are not enabled. - Future reauthenticateWithCredential( - AuthCredential credential) async { - assert(credential != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - await FirebaseAuth.channel.invokeMethod( - 'reauthenticateWithCredential', - { - 'app': _app.name, - 'provider': credential._provider, - 'data': credential._data, - }, - ); - return this; - } - - /// Detaches the [provider] account from the current user. - /// - /// This will prevent the user from signing in to this account with those - /// credentials. - /// - /// **Important**: This is a security sensitive operation that requires - /// the user to have recently signed in. - /// - /// Use the `providerId` method of an auth provider for [provider]. - /// - /// Errors: - /// • `ERROR_NO_SUCH_PROVIDER` - If the user does not have a Github Account linked to their account. - /// • `ERROR_REQUIRES_RECENT_LOGIN` - If the user's last sign-in time does not meet the security threshold. Use reauthenticate methods to resolve. - Future unlinkFromProvider(String provider) async { - assert(provider != null); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await FirebaseAuth.channel.invokeMethod( - 'unlinkFromProvider', - {'provider': provider, 'app': _app.name}, - ); - } - - @override - String toString() { - return '$runtimeType($_data)'; - } -} diff --git a/firebase_auth/lib/src/user_info.dart b/firebase_auth/lib/src/user_info.dart deleted file mode 100644 index d7e440a..0000000 --- a/firebase_auth/lib/src/user_info.dart +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -/// Represents user data returned from an identity provider. -class UserInfo { - UserInfo._(this._data, this._app); - - final FirebaseApp _app; - - final Map _data; - - /// The provider identifier. - String get providerId => _data['providerId']; - - /// The provider’s user ID for the user. - String get uid => _data['uid']; - - /// The name of the user. - String get displayName => _data['displayName']; - - /// The URL of the user’s profile photo. - String get photoUrl => _data['photoUrl']; - - /// The user’s email address. - String get email => _data['email']; - - /// The user's phone number. - String get phoneNumber => _data['phoneNumber']; - - @override - String toString() { - return '$runtimeType($_data)'; - } -} diff --git a/firebase_auth/lib/src/user_metadata.dart b/firebase_auth/lib/src/user_metadata.dart deleted file mode 100644 index 11f9076..0000000 --- a/firebase_auth/lib/src/user_metadata.dart +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -/// Interface representing a user's metadata. -class FirebaseUserMetadata { - FirebaseUserMetadata._(this._data); - - final Map _data; - - int get creationTimestamp => _data['creationTimestamp']; - - int get lastSignInTimestamp => _data['lastSignInTimestamp']; -} diff --git a/firebase_auth/lib/src/user_update_info.dart b/firebase_auth/lib/src/user_update_info.dart deleted file mode 100644 index 0b290b9..0000000 --- a/firebase_auth/lib/src/user_update_info.dart +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_auth; - -/// Represents user profile data that can be updated by [updateProfile] -/// -/// The purpose of having separate class with a map is to give possibility -/// to check if value was set to null or not provided -class UserUpdateInfo { - /// Container of data that will be send in update request - final Map _updateData = {}; - - set displayName(String displayName) => - _updateData['displayName'] = displayName; - - String get displayName => _updateData['displayName']; - - set photoUrl(String photoUri) => _updateData['photoUrl'] = photoUri; - - String get photoUrl => _updateData['photoUrl']; -} diff --git a/firebase_auth/pubspec.yaml b/firebase_auth/pubspec.yaml deleted file mode 100755 index 45881f0..0000000 --- a/firebase_auth/pubspec.yaml +++ /dev/null @@ -1,33 +0,0 @@ -name: firebase_auth -description: Flutter plugin for Firebase Auth, enabling Android and iOS - authentication using passwords, phone numbers and identity providers - like Google, Facebook and Twitter. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_auth -version: "0.8.4+5" - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebaseauth - iosPrefix: FLT - pluginClass: FirebaseAuthPlugin - -dependencies: - meta: ^1.0.4 - firebase_core: ^0.3.0 - - flutter: - sdk: flutter - -dev_dependencies: - google_sign_in: ^3.0.4 - firebase_dynamic_links: ^0.2.0+3 - test: ^1.3.0 - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=0.1.4 <2.0.0" diff --git a/firebase_auth/test/firebase_auth_test.dart b/firebase_auth/test/firebase_auth_test.dart deleted file mode 100755 index 45b2a05..0000000 --- a/firebase_auth/test/firebase_auth_test.dart +++ /dev/null @@ -1,1163 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:firebase_auth/firebase_auth.dart'; -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -const String kMockProviderId = 'firebase'; -const String kMockUid = '12345'; -const String kMockDisplayName = 'Flutter Test User'; -const String kMockPhotoUrl = 'http://www.example.com/'; -const String kMockEmail = 'test@example.com'; -const String kMockPassword = 'passw0rd'; -const String kMockIdToken = '12345'; -const String kMockAccessToken = '67890'; -const String kMockGithubToken = 'github'; -const String kMockAuthToken = '23456'; -const String kMockAuthTokenSecret = '78901'; -const String kMockCustomToken = '12345'; -const String kMockPhoneNumber = '5555555555'; -const String kMockVerificationId = '12345'; -const String kMockSmsCode = '123456'; -const String kMockLanguage = 'en'; - -void main() { - group('$FirebaseAuth', () { - final String appName = 'testApp'; - final FirebaseApp app = FirebaseApp(name: appName); - final FirebaseAuth auth = FirebaseAuth.fromApp(app); - final List log = []; - - int mockHandleId = 0; - - setUp(() { - log.clear(); - FirebaseAuth.channel.setMockMethodCallHandler((MethodCall call) async { - log.add(call); - switch (call.method) { - case "getIdToken": - return kMockIdToken; - break; - case "isSignInWithEmailLink": - return true; - case "startListeningAuthState": - return mockHandleId++; - break; - case "sendLinkToEmail": - case "sendPasswordResetEmail": - case "updateEmail": - case "updatePassword": - case "updateProfile": - return null; - break; - case "fetchSignInMethodsForEmail": - return List(0); - break; - case "verifyPhoneNumber": - return null; - break; - default: - return mockFirebaseUser(); - break; - } - }); - }); - void verifyUser(FirebaseUser user) { - expect(user, isNotNull); - expect(user.isAnonymous, isTrue); - expect(user.isEmailVerified, isFalse); - expect(user.providerData.length, 1); - final UserInfo userInfo = user.providerData[0]; - expect(userInfo.providerId, kMockProviderId); - expect(userInfo.uid, kMockUid); - expect(userInfo.displayName, kMockDisplayName); - expect(userInfo.photoUrl, kMockPhotoUrl); - expect(userInfo.email, kMockEmail); - } - - test('currentUser', () async { - final FirebaseUser user = await auth.currentUser(); - verifyUser(user); - expect( - log, - [ - isMethodCall('currentUser', - arguments: {'app': auth.app.name}), - ], - ); - }); - - test('signInAnonymously', () async { - final FirebaseUser user = await auth.signInAnonymously(); - verifyUser(user); - expect(await user.getIdToken(), equals(kMockIdToken)); - expect(await user.getIdToken(refresh: true), equals(kMockIdToken)); - expect( - log, - [ - isMethodCall('signInAnonymously', - arguments: {'app': auth.app.name}), - isMethodCall( - 'getIdToken', - arguments: { - 'refresh': false, - 'app': auth.app.name - }, - ), - isMethodCall( - 'getIdToken', - arguments: {'refresh': true, 'app': auth.app.name}, - ), - ], - ); - }); - - test('sendSignInWithEmailLink', () async { - await auth.sendSignInWithEmailLink( - email: 'test@example.com', - url: 'http://www.example.com/', - handleCodeInApp: true, - iOSBundleID: 'com.example.app', - androidPackageName: 'com.example.app', - androidInstallIfNotAvailable: false, - androidMinimumVersion: "12", - ); - expect( - log, - [ - isMethodCall('sendLinkToEmail', arguments: { - 'email': 'test@example.com', - 'url': 'http://www.example.com/', - 'handleCodeInApp': true, - 'iOSBundleID': 'com.example.app', - 'androidPackageName': 'com.example.app', - 'androidInstallIfNotAvailable': false, - 'androidMinimumVersion': '12', - 'app': auth.app.name, - }), - ], - ); - }); - - test('isSignInWithEmailLink', () async { - final bool result = await auth.isSignInWithEmailLink('foo'); - expect(result, true); - expect( - log, - [ - isMethodCall('isSignInWithEmailLink', - arguments: {'link': 'foo', 'app': auth.app.name}), - ], - ); - }); - - test('signInWithEmailAndLink', () async { - await auth.signInWithEmailAndLink( - email: 'test@example.com', - link: '', - ); - expect( - log, - [ - isMethodCall('signInWithEmailAndLink', arguments: { - 'email': 'test@example.com', - 'link': '', - 'app': auth.app.name, - }), - ], - ); - }); - - test('createUserWithEmailAndPassword', () async { - final FirebaseUser user = await auth.createUserWithEmailAndPassword( - email: kMockEmail, - password: kMockPassword, - ); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'createUserWithEmailAndPassword', - arguments: { - 'email': kMockEmail, - 'password': kMockPassword, - 'app': auth.app.name, - }, - ), - ], - ); - }); - - test('fetchSignInMethodsForEmail', () async { - final List providers = - await auth.fetchSignInMethodsForEmail(email: kMockEmail); - expect(providers, isNotNull); - expect(providers.length, 0); - expect( - log, - [ - isMethodCall( - 'fetchSignInMethodsForEmail', - arguments: { - 'email': kMockEmail, - 'app': auth.app.name - }, - ), - ], - ); - }); - - test('EmailAuthProvider (withLink) linkWithCredential', () async { - final AuthCredential credential = EmailAuthProvider.getCredentialWithLink( - email: 'test@example.com', - link: '', - ); - final FirebaseUser user = await auth.linkWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': 'test@example.com', - 'link': '', - }, - }, - ), - ], - ); - }); - - test('EmailAuthProvider (withLink) signInWithCredential', () async { - final AuthCredential credential = EmailAuthProvider.getCredentialWithLink( - email: 'test@example.com', - link: '', - ); - final FirebaseUser user = await auth.signInWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': 'test@example.com', - 'link': '', - }, - }, - ), - ], - ); - }); - - test('EmailAuthProvider (withLink) reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = EmailAuthProvider.getCredentialWithLink( - email: 'test@example.com', - link: '', - ); - await user.reauthenticateWithCredential(credential); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': 'test@example.com', - 'link': '', - } - }, - ), - ], - ); - }); - - test('TwitterAuthProvider linkWithCredential', () async { - final AuthCredential credential = TwitterAuthProvider.getCredential( - authToken: kMockIdToken, - authTokenSecret: kMockAccessToken, - ); - final FirebaseUser user = await auth.linkWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - 'data': { - 'authToken': kMockIdToken, - 'authTokenSecret': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('TwitterAuthProvider signInWithCredential', () async { - final AuthCredential credential = TwitterAuthProvider.getCredential( - authToken: kMockIdToken, - authTokenSecret: kMockAccessToken, - ); - final FirebaseUser user = await auth.signInWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - 'data': { - 'authToken': kMockIdToken, - 'authTokenSecret': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('GithubAuthProvider linkWithCredential', () async { - final AuthCredential credential = GithubAuthProvider.getCredential( - token: kMockGithubToken, - ); - final FirebaseUser user = await auth.linkWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - 'data': { - 'token': kMockGithubToken, - } - }, - ), - ], - ); - }); - - test('GitHubAuthProvider signInWithCredential', () async { - final AuthCredential credential = GithubAuthProvider.getCredential( - token: kMockGithubToken, - ); - final FirebaseUser user = await auth.signInWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - 'data': { - 'token': kMockGithubToken, - }, - }, - ), - ], - ); - }); - - test('EmailAuthProvider linkWithCredential', () async { - final AuthCredential credential = EmailAuthProvider.getCredential( - email: kMockEmail, - password: kMockPassword, - ); - final FirebaseUser user = await auth.linkWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': kMockEmail, - 'password': kMockPassword, - }, - }, - ), - ], - ); - }); - - test('GoogleAuthProvider signInWithCredential', () async { - final AuthCredential credential = GoogleAuthProvider.getCredential( - idToken: kMockIdToken, - accessToken: kMockAccessToken, - ); - final FirebaseUser user = await auth.signInWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'google.com', - 'data': { - 'idToken': kMockIdToken, - 'accessToken': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('PhoneAuthProvider signInWithCredential', () async { - final AuthCredential credential = PhoneAuthProvider.getCredential( - verificationId: kMockVerificationId, - smsCode: kMockSmsCode, - ); - await auth.signInWithCredential(credential); - expect(log, [ - isMethodCall('signInWithCredential', arguments: { - 'app': auth.app.name, - 'provider': 'phone', - 'data': { - 'verificationId': kMockVerificationId, - 'smsCode': kMockSmsCode, - }, - }) - ]); - }); - - test('verifyPhoneNumber', () async { - await auth.verifyPhoneNumber( - phoneNumber: kMockPhoneNumber, - timeout: const Duration(seconds: 5), - verificationCompleted: null, - verificationFailed: null, - codeSent: null, - codeAutoRetrievalTimeout: null); - expect(log, [ - isMethodCall('verifyPhoneNumber', arguments: { - 'handle': 1, - 'phoneNumber': kMockPhoneNumber, - 'timeout': 5000, - 'forceResendingToken': null, - 'app': auth.app.name, - }) - ]); - }); - - test('EmailAuthProvider reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = EmailAuthProvider.getCredential( - email: kMockEmail, - password: kMockPassword, - ); - await user.reauthenticateWithCredential(credential); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': kMockEmail, - 'password': kMockPassword, - } - }, - ), - ], - ); - }); - test('GoogleAuthProvider reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = GoogleAuthProvider.getCredential( - idToken: kMockIdToken, - accessToken: kMockAccessToken, - ); - await user.reauthenticateWithCredential(credential); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'google.com', - 'data': { - 'idToken': kMockIdToken, - 'accessToken': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('FacebookAuthProvider reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = FacebookAuthProvider.getCredential( - accessToken: kMockAccessToken, - ); - await user.reauthenticateWithCredential(credential); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'facebook.com', - 'data': { - 'accessToken': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('TwitterAuthProvider reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = TwitterAuthProvider.getCredential( - authToken: kMockAuthToken, - authTokenSecret: kMockAuthTokenSecret, - ); - await user.reauthenticateWithCredential(credential); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - 'data': { - 'authToken': kMockAuthToken, - 'authTokenSecret': kMockAuthTokenSecret, - }, - }, - ), - ], - ); - }); - - test('GithubAuthProvider reauthenticateWithCredential', () async { - final FirebaseUser user = await auth.currentUser(); - log.clear(); - final AuthCredential credential = GithubAuthProvider.getCredential( - token: kMockGithubToken, - ); - await user.reauthenticateWithCredential(credential); - expect( - log, - [ - isMethodCall( - 'reauthenticateWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - 'data': { - 'token': kMockGithubToken, - }, - }, - ), - ], - ); - }); - - test('GoogleAuthProvider linkWithCredential', () async { - final AuthCredential credential = GoogleAuthProvider.getCredential( - idToken: kMockIdToken, - accessToken: kMockAccessToken, - ); - final FirebaseUser user = await auth.linkWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'google.com', - 'data': { - 'idToken': kMockIdToken, - 'accessToken': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('FacebookAuthProvider linkWithCredential', () async { - final AuthCredential credential = FacebookAuthProvider.getCredential( - accessToken: kMockAccessToken, - ); - final FirebaseUser user = await auth.linkWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'facebook.com', - 'data': { - 'accessToken': kMockAccessToken, - }, - }, - ), - ], - ); - }); - - test('FacebookAuthProvider signInWithCredential', () async { - final AuthCredential credential = FacebookAuthProvider.getCredential( - accessToken: kMockAccessToken, - ); - final FirebaseUser user = await auth.signInWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'facebook.com', - 'data': { - 'accessToken': kMockAccessToken, - } - }, - ), - ], - ); - }); - - test('TwitterAuthProvider linkWithCredential', () async { - final AuthCredential credential = TwitterAuthProvider.getCredential( - authToken: kMockAuthToken, - authTokenSecret: kMockAuthTokenSecret, - ); - final FirebaseUser user = await auth.linkWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - 'data': { - 'authToken': kMockAuthToken, - 'authTokenSecret': kMockAuthTokenSecret, - }, - }, - ), - ], - ); - }); - - test('TwitterAuthProvider signInWithCredential', () async { - final AuthCredential credential = TwitterAuthProvider.getCredential( - authToken: kMockAuthToken, - authTokenSecret: kMockAuthTokenSecret, - ); - final FirebaseUser user = await auth.signInWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - 'data': { - 'authToken': kMockAuthToken, - 'authTokenSecret': kMockAuthTokenSecret, - }, - }, - ), - ], - ); - }); - - test('GithubAuthProvider linkWithCredential', () async { - final AuthCredential credential = GithubAuthProvider.getCredential( - token: kMockGithubToken, - ); - final FirebaseUser user = await auth.linkWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - 'data': { - 'token': kMockGithubToken, - }, - }, - ), - ], - ); - }); - - test('GithubAuthProvider signInWithCredential', () async { - final AuthCredential credential = GithubAuthProvider.getCredential( - token: kMockGithubToken, - ); - final FirebaseUser user = await auth.signInWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'signInWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - 'data': { - 'token': kMockGithubToken, - }, - }, - ), - ], - ); - }); - - test('EmailAuthProvider linkWithCredential', () async { - final AuthCredential credential = EmailAuthProvider.getCredential( - email: kMockEmail, - password: kMockPassword, - ); - final FirebaseUser user = await auth.linkWithCredential(credential); - verifyUser(user); - expect( - log, - [ - isMethodCall( - 'linkWithCredential', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - 'data': { - 'email': kMockEmail, - 'password': kMockPassword, - }, - }, - ), - ], - ); - }); - - test('sendEmailVerification', () async { - final FirebaseUser user = await auth.currentUser(); - await user.sendEmailVerification(); - - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'sendEmailVerification', - arguments: {'app': auth.app.name}, - ), - ], - ); - }); - - test('reload', () async { - final FirebaseUser user = await auth.currentUser(); - await user.reload(); - - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'reload', - arguments: {'app': auth.app.name}, - ), - ], - ); - }); - - test('delete', () async { - final FirebaseUser user = await auth.currentUser(); - await user.delete(); - - expect( - log, - [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'delete', - arguments: {'app': auth.app.name}, - ), - ], - ); - }); - - test('sendPasswordResetEmail', () async { - await auth.sendPasswordResetEmail( - email: kMockEmail, - ); - expect( - log, - [ - isMethodCall( - 'sendPasswordResetEmail', - arguments: { - 'email': kMockEmail, - 'app': auth.app.name - }, - ), - ], - ); - }); - - test('updateEmail', () async { - final FirebaseUser user = await auth.currentUser(); - await user.updateEmail(kMockEmail); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'updateEmail', - arguments: { - 'email': kMockEmail, - 'app': auth.app.name, - }, - ), - ]); - }); - - test('updatePassword', () async { - final FirebaseUser user = await auth.currentUser(); - await user.updatePassword(kMockPassword); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'updatePassword', - arguments: { - 'password': kMockPassword, - 'app': auth.app.name, - }, - ), - ]); - }); - - test('updateProfile', () async { - final UserUpdateInfo userUpdateInfo = UserUpdateInfo(); - userUpdateInfo.photoUrl = kMockPhotoUrl; - userUpdateInfo.displayName = kMockDisplayName; - - final FirebaseUser user = await auth.currentUser(); - await user.updateProfile(userUpdateInfo); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'updateProfile', - arguments: { - 'photoUrl': kMockPhotoUrl, - 'displayName': kMockDisplayName, - 'app': auth.app.name, - }, - ), - ]); - }); - - test('EmailAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(EmailAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'password', - }, - ), - ]); - }); - - test('GoogleAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(GoogleAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'google.com', - }, - ), - ]); - }); - - test('FacebookAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(FacebookAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'facebook.com', - }, - ), - ]); - }); - - test('PhoneAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(PhoneAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'phone', - }, - ), - ]); - }); - - test('TwitterAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(TwitterAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'twitter.com', - }, - ), - ]); - }); - - test('GithubAuthProvider unlinkFromProvider', () async { - final FirebaseUser user = await auth.currentUser(); - await user.unlinkFromProvider(GithubAuthProvider.providerId); - expect(log, [ - isMethodCall( - 'currentUser', - arguments: {'app': auth.app.name}, - ), - isMethodCall( - 'unlinkFromProvider', - arguments: { - 'app': auth.app.name, - 'provider': 'github.com', - }, - ), - ]); - }); - - test('signInWithCustomToken', () async { - final FirebaseUser user = - await auth.signInWithCustomToken(token: kMockCustomToken); - verifyUser(user); - expect( - log, - [ - isMethodCall('signInWithCustomToken', arguments: { - 'token': kMockCustomToken, - 'app': auth.app.name, - }) - ], - ); - }); - - test('onAuthStateChanged', () async { - mockHandleId = 42; - - Future simulateEvent(Map user) async { - await BinaryMessages.handlePlatformMessage( - FirebaseAuth.channel.name, - FirebaseAuth.channel.codec.encodeMethodCall( - MethodCall( - 'onAuthStateChanged', - {'id': 42, 'user': user, 'app': auth.app.name}, - ), - ), - (_) {}, - ); - } - - final AsyncQueue events = AsyncQueue(); - - // Subscribe and allow subscription to complete. - final StreamSubscription subscription = - auth.onAuthStateChanged.listen(events.add); - await Future.delayed(const Duration(seconds: 0)); - - await simulateEvent(null); - await simulateEvent(mockFirebaseUser()); - - final FirebaseUser user1 = await events.remove(); - expect(user1, isNull); - - final FirebaseUser user2 = await events.remove(); - verifyUser(user2); - - // Cancel subscription and allow cancellation to complete. - subscription.cancel(); - await Future.delayed(const Duration(seconds: 0)); - - expect( - log, - [ - isMethodCall('startListeningAuthState', arguments: { - 'app': auth.app.name, - }), - isMethodCall( - 'stopListeningAuthState', - arguments: { - 'id': 42, - 'app': auth.app.name, - }, - ), - ], - ); - }); - - test('setLanguageCode', () async { - await auth.setLanguageCode(kMockLanguage); - - expect( - log, - [ - isMethodCall( - 'setLanguageCode', - arguments: { - 'language': kMockLanguage, - 'app': auth.app.name, - }, - ), - ], - ); - }); - }); -} - -Map mockFirebaseUser( - {String providerId = kMockProviderId, - String uid = kMockUid, - String displayName = kMockDisplayName, - String photoUrl = kMockPhotoUrl, - String email = kMockEmail}) => - { - 'isAnonymous': true, - 'isEmailVerified': false, - 'providerData': >[ - { - 'providerId': providerId, - 'uid': uid, - 'displayName': displayName, - 'photoUrl': photoUrl, - 'email': email, - }, - ], - }; - -/// Queue whose remove operation is asynchronous, awaiting a corresponding add. -class AsyncQueue { - Map> _completers = >{}; - int _nextToRemove = 0; - int _nextToAdd = 0; - - void add(T element) { - _completer(_nextToAdd++).complete(element); - } - - Future remove() { - final Future result = _completer(_nextToRemove++).future; - return result; - } - - Completer _completer(int index) { - if (_completers.containsKey(index)) { - return _completers.remove(index); - } else { - return _completers[index] = Completer(); - } - } -} diff --git a/firebase_messaging/.gitignore b/firebase_messaging/.gitignore deleted file mode 100644 index 3749ecc..0000000 --- a/firebase_messaging/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -.DS_Store -.atom/ -.idea/ -.vscode/ - -.packages -.pub/ -.dart_tool/ -pubspec.lock - -Podfile -Podfile.lock -Pods/ -.symlinks/ -**/Flutter/App.framework/ -**/Flutter/Flutter.framework/ -**/Flutter/Generated.xcconfig -**/Flutter/flutter_assets/ -ServiceDefinitions.json -xcuserdata/ - -local.properties -keystore.properties -.gradle/ -gradlew -gradlew.bat -gradle-wrapper.jar -*.iml - -GeneratedPluginRegistrant.h -GeneratedPluginRegistrant.m -GeneratedPluginRegistrant.java -build/ -.flutter-plugins - -third_party diff --git a/firebase_messaging/CHANGELOG.md b/firebase_messaging/CHANGELOG.md deleted file mode 100644 index 2a11382..0000000 --- a/firebase_messaging/CHANGELOG.md +++ /dev/null @@ -1,211 +0,0 @@ -## 4.0.0+4 - -* Remove obsolete `use_frameworks!` instruction. - -## 4.0.0+3 - -* Update iOS configuration documentation. - -## 4.0.0+2 - -* Fix example app's floating action button that stopped working due to a breaking change. - -## 4.0.0+1 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 4.0.0 - -* **Breaking Change** Update message structure for onMessage to match onLaunch and onResume - -## 3.0.1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 3.0.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - - This was originally incorrectly pushed in the `2.2.0` update. - -## 2.2.0+1 - -* **Revert the breaking 2.2.0 update**. 2.2.0 was known to be breaking and - should have incremented the major version number instead of the minor. This - revert is in and of itself breaking for anyone that has already migrated - however. Anyone who has already migrated their app to AndroidX should - immediately update to `3.0.0` instead. That's the correctly versioned new push - of `2.2.0`. - -## 2.2.0 - -* **BAD**. This was a breaking change that was incorrectly published on a minor - version upgrade, should never have happened. Reverted by `2.2.0+1`. - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 2.1.0 - -* Adding support for deleteInstanceID(), autoInitEnabled() and setAutoInitEnabled(). - -## 2.0.3 - -* Removing local cache of getToken() in the dart part of the plugin. Now getToken() calls directly its counterparts in the iOS and Android implementations. This enables obtaining its value without calling configure() or having to wait for a new token refresh. - -## 2.0.2 - -* Use boolean values when checking for notification types on iOS. - -## 2.0.1 - -* Bump Android dependencies to latest. - -## 2.0.0 - -* Updated Android to send Remote Message's title and body to Dart. - -## 1.0.5 - -* Bumped test and mockito versions to pick up Dart 2 support. - -## 1.0.4 - -* Bump Android and Firebase dependency versions. - -## 1.0.3 - -* Updated iOS token hook from 'didRefreshRegistrationToken' to 'didReceiveRegistrationToken' - -## 1.0.2 - -* Updated Gradle tooling to match Android Studio 3.2.2. - -## 1.0.1 - -* Fix for Android where the onLaunch event is not triggered when the Activity is killed by the OS (or if the Don't keep activities toggle is enabled) - -## 1.0.0 - -* Bump to released version - -## 0.2.5 - -* Fixed Dart 2 type error. - -## 0.2.4 - -* Updated Google Play Services dependencies to version 15.0.0. - -## 0.2.3 - -* Updated package channel name - -## 0.2.2 - -* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. - -## 0.2.1 - -* Fixed Dart 2 type errors. - -## 0.2.0 - -* **Breaking change**. Set SDK constraints to match the Flutter beta release. - -## 0.1.4 - -* Fixed Dart 2 type error in example project. - -## 0.1.3 - -* Enabled use in Swift projects. - -## 0.2.2 - -* Fix for APNS not being correctly registered on iOS when reinstalling application. - -## 0.1.1 - -* Simplified and upgraded Android project template to Android SDK 27. -* Updated package description. - -## 0.1.0 - -* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin - 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in - order to use this version of the plugin. Instructions can be found - [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). -* Relaxed GMS dependency to [11.4.0,12.0[ - -## 0.0.8 - -* Added FLT prefix to iOS types -* Change GMS dependency to 11.4.+ - -## 0.0.7 - -In FirebaseMessagingPlugin.m: -* moved logic from 'tokenRefreshNotification' to 'didRefreshRegistrationToken' -* removed 'tokenRefreshNotification' as well as observer registration -* removed 'connectToFcm' method and related calls -* removed unnecessary FIRMessaging disconnect - -## 0.0.6 - -* Change GMS dependency to 11.+ - -## 0.0.5+2 - -* Fixed README example for "click_action" - -## 0.0.5+1 - -* Aligned author name with rest of repo. - -## 0.0.5 - -* Updated to Firebase SDK to always use latest patch version for 11.0.x builds - -## 0.0.4 - -* Updated to Firebase SDK Version 11.0.1 - -## 0.0.3 - -* Updated README.md -* Bumped buildToolsVersion to 25.0.3 - -## 0.0.2+2 - -* Updated README.md - -## 0.0.2+1 - -* Added workaround for https://github.com/flutter/flutter/issues/9694 to README -* Moved code to https://github.com/flutter/plugins - -## 0.0.2 - -* Updated to latest plugin API - -## 0.0.2.2 - -* Downgraded gradle dependency for example app to make `flutter run` happy - -## 0.0.1+1 - -* Updated README with installation instructions -* Added CHANGELOG - -## 0.0.1 - -* Initial Release diff --git a/firebase_messaging/LICENSE b/firebase_messaging/LICENSE deleted file mode 100644 index 000b461..0000000 --- a/firebase_messaging/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/firebase_messaging/README.md b/firebase_messaging/README.md deleted file mode 100644 index e692ef3..0000000 --- a/firebase_messaging/README.md +++ /dev/null @@ -1,83 +0,0 @@ -# Firebase Cloud Messaging for Flutter - -[![pub package](https://img.shields.io/pub/v/firebase_messaging.svg)](https://pub.dartlang.org/packages/firebase_messaging) - -A Flutter plugin to use the [Firebase Cloud Messaging (FCM) API](https://firebase.google.com/docs/cloud-messaging/). - -With this plugin, your Flutter app can receive and process push notifications as well as data messages on Android and iOS. Read Firebase's [About FCM Messages](https://firebase.google.com/docs/cloud-messaging/concept-options) to learn more about the differences between notification messages and data messages. - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage -To use this plugin, add `firebase_messaging` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). - -## Getting Started - -Check out the `example` directory for a sample app using Firebase Cloud Messaging. - -### Android Integration - -To integrate your plugin into the Android part of your app, follow these steps: - -1. Using the [Firebase Console](https://console.firebase.google.com/) add an Android app to your project: Follow the assistant, download the generated `google-services.json` file and place it inside `android/app`. Next, modify the `android/build.gradle` file and the `android/app/build.gradle` file to add the Google services plugin as described by the Firebase assistant. - -1. (optional, but recommended) If want to be notified in your app (via `onResume` and `onLaunch`, see below) when the user clicks on a notification in the system tray include the following `intent-filter` within the `` tag of your `android/app/src/main/AndroidManifest.xml`: - ```xml - - - - - ``` - -### iOS Integration - -To integrate your plugin into the iOS part of your app, follow these steps: - -1. Generate the certificates required by Apple for receiving push notifications following [this guide](https://firebase.google.com/docs/cloud-messaging/ios/certs) in the Firebase docs. You can skip the section titled "Create the Provisioning Profile". - -1. Using the [Firebase Console](https://console.firebase.google.com/) add an iOS app to your project: Follow the assistant, download the generated `GoogleService-Info.plist` file, open `ios/Runner.xcworkspace` with Xcode, and within Xcode place the file inside `ios/Runner`. **Don't** follow the steps named "Add Firebase SDK" and "Add initialization code" in the Firebase assistant. - -1. In Xcode, select `Runner` in the Project Navigator. In the Capabilities Tab turn on `Push Notifications` and `Background Modes`, and enable `Background fetch` and `Remote notifications` under `Background Modes`. - -1. Follow the steps in the "[Upload your APNs certificate](https://firebase.google.com/docs/cloud-messaging/ios/client#upload_your_apns_certificate)" section of the Firebase docs. - -### Dart/Flutter Integration - -From your Dart code, you need to import the plugin and instantiate it: - -```dart -import 'package:firebase_messaging/firebase_messaging.dart'; - -final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); -``` - -Next, you should probably request permissions for receiving Push Notifications. For this, call `_firebaseMessaging.requestNotificationPermissions()`. This will bring up a permissions dialog for the user to confirm on iOS. It's a no-op on Android. Last, but not least, register `onMessage`, `onResume`, and `onLaunch` callbacks via `_firebaseMessaging.configure()` to listen for incoming messages (see table below for more information). - -## Receiving Messages - -Messages are sent to your Flutter app via the `onMessage`, `onLaunch`, and `onResume` callbacks that you configured with the plugin during setup. Here is how different message types are delivered on the supported platforms: - -| | App in Foreground | App in Background | App Terminated | -| --------------------------: | ----------------- | ----------------- | -------------- | -| **Notification on Android** | `onMessage` | Notification is delivered to system tray. When the user clicks on it to open app `onResume` fires if `click_action: FLUTTER_NOTIFICATION_CLICK` is set (see below). | Notification is delivered to system tray. When the user clicks on it to open app `onLaunch` fires if `click_action: FLUTTER_NOTIFICATION_CLICK` is set (see below). | -| **Notification on iOS** | `onMessage` | Notification is delivered to system tray. When the user clicks on it to open app `onResume` fires. | Notification is delivered to system tray. When the user clicks on it to open app `onLaunch` fires. | -| **Data Message on Android** | `onMessage` | `onMessage` while app stays in the background. | *not supported by plugin, message is lost* | -| **Data Message on iOS** | `onMessage` | Message is stored by FCM and delivered to app via `onMessage` when the app is brought back to foreground. | Message is stored by FCM and delivered to app via `onMessage` when the app is brought back to foreground. | - -Additional reading: Firebase's [About FCM Messages](https://firebase.google.com/docs/cloud-messaging/concept-options). - -## Sending Messages -Refer to the [Firebase documentation](https://firebase.google.com/docs/cloud-messaging/) about FCM for all the details about sending messages to your app. When sending a notification message to an Android device, you need to make sure to set the `click_action` property of the message to `FLUTTER_NOTIFICATION_CLICK`. Otherwise the plugin will be unable to deliver the notification to your app when the users clicks on it in the system tray. - -For testing purposes, the simplest way to send a notification is via the [Firebase Console](https://firebase.google.com/docs/cloud-messaging/send-with-console). Make sure to include `click_action: FLUTTER_NOTIFICATION_CLICK` as a "Custom data" key-value-pair (under "Advanced options") when targeting an Android device. The Firebase Console does not support sending data messages. - -Alternatively, a notification or data message can be sent from a terminal: - -```shell -DATA='{"notification": {"body": "this is a body","title": "this is a title"}, "priority": "high", "data": {"click_action": "FLUTTER_NOTIFICATION_CLICK", "id": "1", "status": "done"}, "to": ""}' -curl https://fcm.googleapis.com/fcm/send -H "Content-Type:application/json" -X POST -d "$DATA" -H "Authorization: key=" -``` - -Remove the `notification` property in `DATA` to send a data message. diff --git a/firebase_messaging/android/build.gradle b/firebase_messaging/android/build.gradle deleted file mode 100644 index bf6f3a5..0000000 --- a/firebase_messaging/android/build.gradle +++ /dev/null @@ -1,52 +0,0 @@ -def PLUGIN = "firebase_messaging"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebasemessaging' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-messaging:18.0.0' - implementation 'androidx.annotation:annotation:1.0.0' - implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0' - } -} diff --git a/firebase_messaging/android/gradle.properties b/firebase_messaging/android/gradle.properties deleted file mode 100644 index 8bd86f6..0000000 --- a/firebase_messaging/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/firebase_messaging/android/settings.gradle b/firebase_messaging/android/settings.gradle deleted file mode 100644 index f82964e..0000000 --- a/firebase_messaging/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_messaging' diff --git a/firebase_messaging/android/src/main/AndroidManifest.xml b/firebase_messaging/android/src/main/AndroidManifest.xml deleted file mode 100644 index c97e19d..0000000 --- a/firebase_messaging/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java b/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java deleted file mode 100644 index 2085eae..0000000 --- a/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FirebaseMessagingPlugin.java +++ /dev/null @@ -1,196 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemessaging; - -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.os.Bundle; -import android.util.Log; -import androidx.annotation.NonNull; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.Task; -import com.google.firebase.FirebaseApp; -import com.google.firebase.iid.FirebaseInstanceId; -import com.google.firebase.iid.InstanceIdResult; -import com.google.firebase.messaging.FirebaseMessaging; -import com.google.firebase.messaging.RemoteMessage; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.MethodChannel.MethodCallHandler; -import io.flutter.plugin.common.MethodChannel.Result; -import io.flutter.plugin.common.PluginRegistry.NewIntentListener; -import io.flutter.plugin.common.PluginRegistry.Registrar; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -/** FirebaseMessagingPlugin */ -public class FirebaseMessagingPlugin extends BroadcastReceiver - implements MethodCallHandler, NewIntentListener { - private final Registrar registrar; - private final MethodChannel channel; - - private static final String CLICK_ACTION_VALUE = "FLUTTER_NOTIFICATION_CLICK"; - private static final String TAG = "FirebaseMessagingPlugin"; - - public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_messaging"); - final FirebaseMessagingPlugin plugin = new FirebaseMessagingPlugin(registrar, channel); - registrar.addNewIntentListener(plugin); - channel.setMethodCallHandler(plugin); - } - - private FirebaseMessagingPlugin(Registrar registrar, MethodChannel channel) { - this.registrar = registrar; - this.channel = channel; - FirebaseApp.initializeApp(registrar.context()); - - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(FlutterFirebaseInstanceIDService.ACTION_TOKEN); - intentFilter.addAction(FlutterFirebaseMessagingService.ACTION_REMOTE_MESSAGE); - LocalBroadcastManager manager = LocalBroadcastManager.getInstance(registrar.context()); - manager.registerReceiver(this, intentFilter); - } - - // BroadcastReceiver implementation. - @Override - public void onReceive(Context context, Intent intent) { - String action = intent.getAction(); - - if (action == null) { - return; - } - - if (action.equals(FlutterFirebaseInstanceIDService.ACTION_TOKEN)) { - String token = intent.getStringExtra(FlutterFirebaseInstanceIDService.EXTRA_TOKEN); - channel.invokeMethod("onToken", token); - } else if (action.equals(FlutterFirebaseMessagingService.ACTION_REMOTE_MESSAGE)) { - RemoteMessage message = - intent.getParcelableExtra(FlutterFirebaseMessagingService.EXTRA_REMOTE_MESSAGE); - Map content = parseRemoteMessage(message); - channel.invokeMethod("onMessage", content); - } - } - - @NonNull - private Map parseRemoteMessage(RemoteMessage message) { - Map content = new HashMap<>(); - content.put("data", message.getData()); - - RemoteMessage.Notification notification = message.getNotification(); - - Map notificationMap = new HashMap<>(); - - String title = notification != null ? notification.getTitle() : null; - notificationMap.put("title", title); - - String body = notification != null ? notification.getBody() : null; - notificationMap.put("body", body); - - content.put("notification", notificationMap); - return content; - } - - @Override - public void onMethodCall(final MethodCall call, final Result result) { - if ("configure".equals(call.method)) { - FlutterFirebaseInstanceIDService.broadcastToken(registrar.context()); - if (registrar.activity() != null) { - sendMessageFromIntent("onLaunch", registrar.activity().getIntent()); - } - result.success(null); - } else if ("subscribeToTopic".equals(call.method)) { - String topic = call.arguments(); - FirebaseMessaging.getInstance().subscribeToTopic(topic); - result.success(null); - } else if ("unsubscribeFromTopic".equals(call.method)) { - String topic = call.arguments(); - FirebaseMessaging.getInstance().unsubscribeFromTopic(topic); - result.success(null); - } else if ("getToken".equals(call.method)) { - FirebaseInstanceId.getInstance() - .getInstanceId() - .addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { - Log.w(TAG, "getToken, error fetching instanceID: ", task.getException()); - result.success(null); - return; - } - - result.success(task.getResult().getToken()); - } - }); - } else if ("deleteInstanceID".equals(call.method)) { - new Thread( - new Runnable() { - @Override - public void run() { - try { - FirebaseInstanceId.getInstance().deleteInstanceId(); - result.success(true); - } catch (IOException ex) { - Log.e(TAG, "deleteInstanceID, error:", ex); - result.success(false); - } - } - }) - .start(); - } else if ("autoInitEnabled".equals(call.method)) { - result.success(FirebaseMessaging.getInstance().isAutoInitEnabled()); - } else if ("setAutoInitEnabled".equals(call.method)) { - Boolean isEnabled = (Boolean) call.arguments(); - FirebaseMessaging.getInstance().setAutoInitEnabled(isEnabled); - result.success(null); - } else { - result.notImplemented(); - } - } - - @Override - public boolean onNewIntent(Intent intent) { - boolean res = sendMessageFromIntent("onResume", intent); - if (res && registrar.activity() != null) { - registrar.activity().setIntent(intent); - } - return res; - } - - /** @return true if intent contained a message to send. */ - private boolean sendMessageFromIntent(String method, Intent intent) { - if (CLICK_ACTION_VALUE.equals(intent.getAction()) - || CLICK_ACTION_VALUE.equals(intent.getStringExtra("click_action"))) { - Map message = new HashMap<>(); - Bundle extras = intent.getExtras(); - - if (extras == null) { - return false; - } - - Map notificationMap = new HashMap<>(); - Map dataMap = new HashMap<>(); - - for (String key : extras.keySet()) { - Object extra = extras.get(key); - if (extra != null) { - dataMap.put(key, extra); - } - } - - message.put("notification", notificationMap); - message.put("data", dataMap); - - channel.invokeMethod(method, message); - return true; - } - return false; - } -} diff --git a/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseInstanceIDService.java b/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseInstanceIDService.java deleted file mode 100644 index 43cb1f1..0000000 --- a/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseInstanceIDService.java +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemessaging; - -import android.content.Context; -import android.content.Intent; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import com.google.firebase.iid.FirebaseInstanceId; -import com.google.firebase.messaging.FirebaseMessagingService; - -public class FlutterFirebaseInstanceIDService extends FirebaseMessagingService { - - public static final String ACTION_TOKEN = "io.flutter.plugins.firebasemessaging.TOKEN"; - public static final String EXTRA_TOKEN = "token"; - - public static void broadcastToken(Context context) { - Intent intent = new Intent(ACTION_TOKEN); - intent.putExtra(EXTRA_TOKEN, FirebaseInstanceId.getInstance().getToken()); - LocalBroadcastManager.getInstance(context).sendBroadcast(intent); - } - - /** Called if InstanceID token is updated. */ - @Override - public void onNewToken(String token) { - broadcastToken(this); - } -} diff --git a/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseMessagingService.java b/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseMessagingService.java deleted file mode 100644 index cdea846..0000000 --- a/firebase_messaging/android/src/main/java/io/flutter/plugins/firebasemessaging/FlutterFirebaseMessagingService.java +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemessaging; - -import android.content.Intent; -import androidx.localbroadcastmanager.content.LocalBroadcastManager; -import com.google.firebase.messaging.FirebaseMessagingService; -import com.google.firebase.messaging.RemoteMessage; - -public class FlutterFirebaseMessagingService extends FirebaseMessagingService { - - public static final String ACTION_REMOTE_MESSAGE = - "io.flutter.plugins.firebasemessaging.NOTIFICATION"; - public static final String EXTRA_REMOTE_MESSAGE = "notification"; - - /** - * Called when message is received. - * - * @param remoteMessage Object representing the message received from Firebase Cloud Messaging. - */ - @Override - public void onMessageReceived(RemoteMessage remoteMessage) { - Intent intent = new Intent(ACTION_REMOTE_MESSAGE); - intent.putExtra(EXTRA_REMOTE_MESSAGE, remoteMessage); - LocalBroadcastManager.getInstance(this).sendBroadcast(intent); - } -} diff --git a/firebase_messaging/example/README.md b/firebase_messaging/example/README.md deleted file mode 100644 index 4845e56..0000000 --- a/firebase_messaging/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# firebase_messaging_example - -Demonstrates how to use the firebase_messaging plugin. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/firebase_messaging/example/android/app/build.gradle b/firebase_messaging/example/android/app/build.gradle deleted file mode 100644 index 6946c38..0000000 --- a/firebase_messaging/example/android/app/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId 'io.flutter.plugins.firebasemessagingexample' - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/firebase_messaging/example/android/app/gradle.properties b/firebase_messaging/example/android/app/gradle.properties deleted file mode 100644 index 5465fec..0000000 --- a/firebase_messaging/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/firebase_messaging/example/android/app/gradle/wrapper/gradle-wrapper.properties b/firebase_messaging/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a..0000000 --- a/firebase_messaging/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/firebase_messaging/example/android/app/src/main/AndroidManifest.xml b/firebase_messaging/example/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index adaa7b4..0000000 --- a/firebase_messaging/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/.gitignore b/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/.gitignore deleted file mode 100644 index 9eb4563..0000000 --- a/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/.gitignore +++ /dev/null @@ -1 +0,0 @@ -GeneratedPluginRegistrant.java diff --git a/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/firebasemessagingexample/MainActivity.java b/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/firebasemessagingexample/MainActivity.java deleted file mode 100644 index dd2923c..0000000 --- a/firebase_messaging/example/android/app/src/main/java/io/flutter/plugins/firebasemessagingexample/MainActivity.java +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasemessagingexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/firebase_messaging/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/firebase_messaging/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index db77bb4..0000000 Binary files a/firebase_messaging/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/firebase_messaging/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/firebase_messaging/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 17987b7..0000000 Binary files a/firebase_messaging/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/firebase_messaging/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/firebase_messaging/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 09d4391..0000000 Binary files a/firebase_messaging/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/firebase_messaging/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/firebase_messaging/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index d5f1c8d..0000000 Binary files a/firebase_messaging/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/firebase_messaging/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/firebase_messaging/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 4d6372e..0000000 Binary files a/firebase_messaging/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/firebase_messaging/example/android/build.gradle b/firebase_messaging/example/android/build.gradle deleted file mode 100644 index 6ca85f9..0000000 --- a/firebase_messaging/example/android/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.2.0' - } -} - -allprojects { - repositories { - google() - jcenter() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/firebase_messaging/example/android/gradle.properties b/firebase_messaging/example/android/gradle.properties deleted file mode 100644 index 8bd86f6..0000000 --- a/firebase_messaging/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/firebase_messaging/example/android/gradle/wrapper/gradle-wrapper.properties b/firebase_messaging/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d..0000000 --- a/firebase_messaging/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/firebase_messaging/example/android/settings.gradle b/firebase_messaging/example/android/settings.gradle deleted file mode 100644 index 115da6c..0000000 --- a/firebase_messaging/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/firebase_messaging/example/ios/Flutter/AppFrameworkInfo.plist b/firebase_messaging/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100644 index 6c2de80..0000000 --- a/firebase_messaging/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/firebase_messaging/example/ios/Flutter/Debug.xcconfig b/firebase_messaging/example/ios/Flutter/Debug.xcconfig deleted file mode 100644 index 9803018..0000000 --- a/firebase_messaging/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" diff --git a/firebase_messaging/example/ios/Flutter/Release.xcconfig b/firebase_messaging/example/ios/Flutter/Release.xcconfig deleted file mode 100644 index a4a8c60..0000000 --- a/firebase_messaging/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" diff --git a/firebase_messaging/example/ios/Runner.xcodeproj/project.pbxproj b/firebase_messaging/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index c053bb3..0000000 --- a/firebase_messaging/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,504 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 2EF3EFF8E25860E112E91756 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 799CAB03D87EEEE1FF65E7BE /* libPods-Runner.a */; }; - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */ = {isa = PBXBuildFile; fileRef = 2D5378251FAA1A9400D5DBA9 /* flutter_assets */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 5C5A74FB1EAA74D700FE37CF /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 5C5A74FA1EAA74D700FE37CF /* GoogleService-Info.plist */; }; - 5C8223C01EC265DD00E12B15 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C8223BF1EC265DD00E12B15 /* GeneratedPluginRegistrant.m */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; - 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = flutter_assets; path = Flutter/flutter_assets; sourceTree = SOURCE_ROOT; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 5C5A74FA1EAA74D700FE37CF /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 5C8223BE1EC265DD00E12B15 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 5C8223BF1EC265DD00E12B15 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 5CDE2B941EA81E0D006C00D0 /* Runner.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Runner.entitlements; sourceTree = ""; }; - 799CAB03D87EEEE1FF65E7BE /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - 2EF3EFF8E25860E112E91756 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 2D5378251FAA1A9400D5DBA9 /* flutter_assets */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 840012C8B5EDBCF56B0E4AC1 /* Pods */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 5C8223BE1EC265DD00E12B15 /* GeneratedPluginRegistrant.h */, - 5C8223BF1EC265DD00E12B15 /* GeneratedPluginRegistrant.m */, - 5CDE2B941EA81E0D006C00D0 /* Runner.entitlements */, - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, - 5C5A74FA1EAA74D700FE37CF /* GoogleService-Info.plist */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 799CAB03D87EEEE1FF65E7BE /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */, - 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - SystemCapabilities = { - com.apple.Push = { - enabled = 1; - }; - }; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5C5A74FB1EAA74D700FE37CF /* GoogleService-Info.plist in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 2D5378261FAA1A9400D5DBA9 /* flutter_assets in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; - }; - 532EA9D341340B1DCD08293D /* [CP] Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, - 5C8223C01EC265DD00E12B15 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = "io.flutter.plugins.firebase-messaging"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CODE_SIGN_ENTITLEMENTS = Runner/Runner.entitlements; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = "io.flutter.plugins.firebase-messaging"; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/firebase_messaging/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/firebase_messaging/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc1..0000000 --- a/firebase_messaging/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/firebase_messaging/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase_messaging/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100644 index 1c95807..0000000 --- a/firebase_messaging/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/firebase_messaging/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/firebase_messaging/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 21a3cc1..0000000 --- a/firebase_messaging/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/firebase_messaging/example/ios/Runner/.gitignore b/firebase_messaging/example/ios/Runner/.gitignore deleted file mode 100644 index 0cab08d..0000000 --- a/firebase_messaging/example/ios/Runner/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -GeneratedPluginRegistrant.h -GeneratedPluginRegistrant.m diff --git a/firebase_messaging/example/ios/Runner/AppDelegate.h b/firebase_messaging/example/ios/Runner/AppDelegate.h deleted file mode 100644 index d9e18e9..0000000 --- a/firebase_messaging/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/firebase_messaging/example/ios/Runner/AppDelegate.m b/firebase_messaging/example/ios/Runner/AppDelegate.m deleted file mode 100644 index a4b51c8..0000000 --- a/firebase_messaging/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d22f10b..0000000 --- a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100644 index 28c6bf0..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100644 index 2ccbfd9..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100644 index f091b6b..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100644 index 4cde121..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100644 index d0ef06e..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100644 index dcdc230..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100644 index 2ccbfd9..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100644 index c8f9ed8..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100644 index a6d6b86..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100644 index a6d6b86..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100644 index 75b2d16..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100644 index c4df70d..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100644 index 6a84f41..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100644 index d0e1f58..0000000 Binary files a/firebase_messaging/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/firebase_messaging/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/firebase_messaging/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index ebf48f6..0000000 --- a/firebase_messaging/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/firebase_messaging/example/ios/Runner/Base.lproj/Main.storyboard b/firebase_messaging/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100644 index f3c2851..0000000 --- a/firebase_messaging/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/firebase_messaging/example/ios/Runner/Info.plist b/firebase_messaging/example/ios/Runner/Info.plist deleted file mode 100644 index ededae4..0000000 --- a/firebase_messaging/example/ios/Runner/Info.plist +++ /dev/null @@ -1,51 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleDisplayName - Firebase Cloud Messaging Example - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_messaging_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/firebase_messaging/example/ios/Runner/Runner.entitlements b/firebase_messaging/example/ios/Runner/Runner.entitlements deleted file mode 100644 index 903def2..0000000 --- a/firebase_messaging/example/ios/Runner/Runner.entitlements +++ /dev/null @@ -1,8 +0,0 @@ - - - - - aps-environment - development - - diff --git a/firebase_messaging/example/ios/Runner/main.m b/firebase_messaging/example/ios/Runner/main.m deleted file mode 100644 index bec320c..0000000 --- a/firebase_messaging/example/ios/Runner/main.m +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/firebase_messaging/example/lib/main.dart b/firebase_messaging/example/lib/main.dart deleted file mode 100644 index 1e18446..0000000 --- a/firebase_messaging/example/lib/main.dart +++ /dev/null @@ -1,242 +0,0 @@ -// Copyright 2017 The Flutter Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:flutter/material.dart'; - -final Map _items = {}; -Item _itemForMessage(Map message) { - final String itemId = message['data']['id']; - final Item item = _items.putIfAbsent(itemId, () => Item(itemId: itemId)) - ..status = message['data']['status']; - return item; -} - -class Item { - Item({this.itemId}); - final String itemId; - - StreamController _controller = StreamController.broadcast(); - Stream get onChanged => _controller.stream; - - String _status; - String get status => _status; - set status(String value) { - _status = value; - _controller.add(this); - } - - static final Map> routes = >{}; - Route get route { - final String routeName = '/detail/$itemId'; - return routes.putIfAbsent( - routeName, - () => MaterialPageRoute( - settings: RouteSettings(name: routeName), - builder: (BuildContext context) => DetailPage(itemId), - ), - ); - } -} - -class DetailPage extends StatefulWidget { - DetailPage(this.itemId); - final String itemId; - @override - _DetailPageState createState() => _DetailPageState(); -} - -class _DetailPageState extends State { - Item _item; - StreamSubscription _subscription; - - @override - void initState() { - super.initState(); - _item = _items[widget.itemId]; - _subscription = _item.onChanged.listen((Item item) { - if (!mounted) { - _subscription.cancel(); - } else { - setState(() { - _item = item; - }); - } - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: Text("Item ${_item.itemId}"), - ), - body: Material( - child: Center(child: Text("Item status: ${_item.status}")), - ), - ); - } -} - -class PushMessagingExample extends StatefulWidget { - @override - _PushMessagingExampleState createState() => _PushMessagingExampleState(); -} - -class _PushMessagingExampleState extends State { - String _homeScreenText = "Waiting for token..."; - bool _topicButtonsDisabled = false; - - final FirebaseMessaging _firebaseMessaging = FirebaseMessaging(); - final TextEditingController _topicController = - TextEditingController(text: 'topic'); - - Widget _buildDialog(BuildContext context, Item item) { - return AlertDialog( - content: Text("Item ${item.itemId} has been updated"), - actions: [ - FlatButton( - child: const Text('CLOSE'), - onPressed: () { - Navigator.pop(context, false); - }, - ), - FlatButton( - child: const Text('SHOW'), - onPressed: () { - Navigator.pop(context, true); - }, - ), - ], - ); - } - - void _showItemDialog(Map message) { - showDialog( - context: context, - builder: (_) => _buildDialog(context, _itemForMessage(message)), - ).then((bool shouldNavigate) { - if (shouldNavigate == true) { - _navigateToItemDetail(message); - } - }); - } - - void _navigateToItemDetail(Map message) { - final Item item = _itemForMessage(message); - // Clear away dialogs - Navigator.popUntil(context, (Route route) => route is PageRoute); - if (!item.route.isCurrent) { - Navigator.push(context, item.route); - } - } - - @override - void initState() { - super.initState(); - _firebaseMessaging.configure( - onMessage: (Map message) async { - print("onMessage: $message"); - _showItemDialog(message); - }, - onLaunch: (Map message) async { - print("onLaunch: $message"); - _navigateToItemDetail(message); - }, - onResume: (Map message) async { - print("onResume: $message"); - _navigateToItemDetail(message); - }, - ); - _firebaseMessaging.requestNotificationPermissions( - const IosNotificationSettings(sound: true, badge: true, alert: true)); - _firebaseMessaging.onIosSettingsRegistered - .listen((IosNotificationSettings settings) { - print("Settings registered: $settings"); - }); - _firebaseMessaging.getToken().then((String token) { - assert(token != null); - setState(() { - _homeScreenText = "Push Messaging token: $token"; - }); - print(_homeScreenText); - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: AppBar( - title: const Text('Push Messaging Demo'), - ), - // For testing -- simulate a message being received - floatingActionButton: FloatingActionButton( - onPressed: () => _showItemDialog({ - "data": { - "id": "2", - "status": "out of stock", - }, - }), - tooltip: 'Simulate Message', - child: const Icon(Icons.message), - ), - body: Material( - child: Column( - children: [ - Center( - child: Text(_homeScreenText), - ), - Row(children: [ - Expanded( - child: TextField( - controller: _topicController, - onChanged: (String v) { - setState(() { - _topicButtonsDisabled = v.isEmpty; - }); - }), - ), - FlatButton( - child: const Text("subscribe"), - onPressed: _topicButtonsDisabled - ? null - : () { - _firebaseMessaging - .subscribeToTopic(_topicController.text); - _clearTopicText(); - }, - ), - FlatButton( - child: const Text("unsubscribe"), - onPressed: _topicButtonsDisabled - ? null - : () { - _firebaseMessaging - .unsubscribeFromTopic(_topicController.text); - _clearTopicText(); - }, - ), - ]) - ], - ), - )); - } - - void _clearTopicText() { - setState(() { - _topicController.text = ""; - _topicButtonsDisabled = true; - }); - } -} - -void main() { - runApp( - MaterialApp( - home: PushMessagingExample(), - ), - ); -} diff --git a/firebase_messaging/example/pubspec.yaml b/firebase_messaging/example/pubspec.yaml deleted file mode 100644 index 42940ec..0000000 --- a/firebase_messaging/example/pubspec.yaml +++ /dev/null @@ -1,54 +0,0 @@ -name: firebase_messaging_example -description: Demonstrates how to use the firebase_messaging plugin. - -dependencies: - flutter: - sdk: flutter - firebase_messaging: - path: ../ - firebase_core: ^0.3.0 - -# For information on the generic Dart part of this file, see the -# following page: https://www.dartlang.org/tools/pub/pubspec - -# The following section is specific to Flutter. -flutter: - - # The following line ensures that the Material Icons font is - # included with your application, so that you can use the icons in - # the Icons class. - uses-material-design: true - - # To add assets to your application, add an assets section here, in - # this "flutter" section, as in: - # assets: - # - images/a_dot_burr.jpeg - # - images/a_dot_ham.jpeg - - # To add assets from package dependencies, first ensure the asset - # is in the lib/ directory of the dependency. Then, - # refer to the asset with a path prefixed with - # `packages/PACKAGE_NAME/`. Note: the `lib/` is implied, do not - # include `lib/` in the asset path. - # - # Here is an example: - # - # assets: - # - packages/PACKAGE_NAME/path/to/asset - - # To add custom fonts to your application, add a fonts section here, - # in this "flutter" section. Each entry in this list should have a - # "family" key with the font family name, and a "fonts" key with a - # list giving the asset and other descriptors for the font. For - # example: - # fonts: - # - family: Schyler - # fonts: - # - asset: fonts/Schyler-Regular.ttf - # - asset: fonts/Schyler-Italic.ttf - # style: italic - # - family: Trajan Pro - # fonts: - # - asset: fonts/TrajanPro.ttf - # - asset: fonts/TrajanPro_Bold.ttf - # weight: 700 diff --git a/firebase_messaging/ios/Assets/.gitkeep b/firebase_messaging/ios/Assets/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.h b/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.h deleted file mode 100644 index 492be15..0000000 --- a/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -@interface FLTFirebaseMessagingPlugin : NSObject -@end diff --git a/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.m b/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.m deleted file mode 100644 index 2607e3e..0000000 --- a/firebase_messaging/ios/Classes/FirebaseMessagingPlugin.m +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseMessagingPlugin.h" - -#import "Firebase/Firebase.h" - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -@interface FLTFirebaseMessagingPlugin () -@end -#endif - -@implementation FLTFirebaseMessagingPlugin { - FlutterMethodChannel *_channel; - NSDictionary *_launchNotification; - BOOL _resumingFromBackground; -} - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_messaging" - binaryMessenger:[registrar messenger]]; - FLTFirebaseMessagingPlugin *instance = - [[FLTFirebaseMessagingPlugin alloc] initWithChannel:channel]; - [registrar addApplicationDelegate:instance]; - [registrar addMethodCallDelegate:instance channel:channel]; -} - -- (instancetype)initWithChannel:(FlutterMethodChannel *)channel { - self = [super init]; - - if (self) { - _channel = channel; - _resumingFromBackground = NO; - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - [FIRMessaging messaging].delegate = self; - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *method = call.method; - if ([@"requestNotificationPermissions" isEqualToString:method]) { - UIUserNotificationType notificationTypes = 0; - NSDictionary *arguments = call.arguments; - if ([arguments[@"sound"] boolValue]) { - notificationTypes |= UIUserNotificationTypeSound; - } - if ([arguments[@"alert"] boolValue]) { - notificationTypes |= UIUserNotificationTypeAlert; - } - if ([arguments[@"badge"] boolValue]) { - notificationTypes |= UIUserNotificationTypeBadge; - } - UIUserNotificationSettings *settings = - [UIUserNotificationSettings settingsForTypes:notificationTypes categories:nil]; - [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; - - result(nil); - } else if ([@"configure" isEqualToString:method]) { - [[UIApplication sharedApplication] registerForRemoteNotifications]; - if (_launchNotification != nil) { - [_channel invokeMethod:@"onLaunch" arguments:_launchNotification]; - } - result(nil); - } else if ([@"subscribeToTopic" isEqualToString:method]) { - NSString *topic = call.arguments; - [[FIRMessaging messaging] subscribeToTopic:topic]; - result(nil); - } else if ([@"unsubscribeFromTopic" isEqualToString:method]) { - NSString *topic = call.arguments; - [[FIRMessaging messaging] unsubscribeFromTopic:topic]; - result(nil); - } else if ([@"getToken" isEqualToString:method]) { - [[FIRInstanceID instanceID] - instanceIDWithHandler:^(FIRInstanceIDResult *_Nullable instanceIDResult, - NSError *_Nullable error) { - if (error != nil) { - NSLog(@"getToken, error fetching instanceID: %@", error); - result(nil); - } else { - result(instanceIDResult.token); - } - }]; - } else if ([@"deleteInstanceID" isEqualToString:method]) { - [[FIRInstanceID instanceID] deleteIDWithHandler:^void(NSError *_Nullable error) { - if (error.code != 0) { - NSLog(@"deleteInstanceID, error: %@", error); - result([NSNumber numberWithBool:NO]); - } else { - [[UIApplication sharedApplication] unregisterForRemoteNotifications]; - result([NSNumber numberWithBool:YES]); - } - }]; - } else if ([@"autoInitEnabled" isEqualToString:method]) { - BOOL value = [[FIRMessaging messaging] isAutoInitEnabled]; - result([NSNumber numberWithBool:value]); - } else if ([@"setAutoInitEnabled" isEqualToString:method]) { - NSNumber *value = call.arguments; - [FIRMessaging messaging].autoInitEnabled = value.boolValue; - result(nil); - } else { - result(FlutterMethodNotImplemented); - } -} - -#if defined(__IPHONE_10_0) && __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_10_0 -// Receive data message on iOS 10 devices while app is in the foreground. -- (void)applicationReceivedRemoteMessage:(FIRMessagingRemoteMessage *)remoteMessage { - [self didReceiveRemoteNotification:remoteMessage.appData]; -} -#endif - -- (void)didReceiveRemoteNotification:(NSDictionary *)userInfo { - if (_resumingFromBackground) { - [_channel invokeMethod:@"onResume" arguments:userInfo]; - } else { - [_channel invokeMethod:@"onMessage" arguments:userInfo]; - } -} - -#pragma mark - AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - if (launchOptions != nil) { - _launchNotification = launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey]; - } - return YES; -} - -- (void)applicationDidEnterBackground:(UIApplication *)application { - _resumingFromBackground = YES; -} - -- (void)applicationDidBecomeActive:(UIApplication *)application { - _resumingFromBackground = NO; - // Clears push notifications from the notification center, with the - // side effect of resetting the badge count. We need to clear notifications - // because otherwise the user could tap notifications in the notification - // center while the app is in the foreground, and we wouldn't be able to - // distinguish that case from the case where a message came in and the - // user dismissed the notification center without tapping anything. - // TODO(goderbauer): Revisit this behavior once we provide an API for managing - // the badge number, or if we add support for running Dart in the background. - // Setting badgeNumber to 0 is a no-op (= notifications will not be cleared) - // if it is already 0, - // therefore the next line is setting it to 1 first before clearing it again - // to remove all - // notifications. - application.applicationIconBadgeNumber = 1; - application.applicationIconBadgeNumber = 0; -} - -- (bool)application:(UIApplication *)application - didReceiveRemoteNotification:(NSDictionary *)userInfo - fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler { - [self didReceiveRemoteNotification:userInfo]; - completionHandler(UIBackgroundFetchResultNoData); - return YES; -} - -- (void)application:(UIApplication *)application - didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { -#ifdef DEBUG - [[FIRMessaging messaging] setAPNSToken:deviceToken type:FIRMessagingAPNSTokenTypeSandbox]; -#else - [[FIRMessaging messaging] setAPNSToken:deviceToken type:FIRMessagingAPNSTokenTypeProd]; -#endif - - [_channel invokeMethod:@"onToken" arguments:[FIRMessaging messaging].FCMToken]; -} - -- (void)application:(UIApplication *)application - didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings { - NSDictionary *settingsDictionary = @{ - @"sound" : [NSNumber numberWithBool:notificationSettings.types & UIUserNotificationTypeSound], - @"badge" : [NSNumber numberWithBool:notificationSettings.types & UIUserNotificationTypeBadge], - @"alert" : [NSNumber numberWithBool:notificationSettings.types & UIUserNotificationTypeAlert], - }; - [_channel invokeMethod:@"onIosSettingsRegistered" arguments:settingsDictionary]; -} - -- (void)messaging:(nonnull FIRMessaging *)messaging - didReceiveRegistrationToken:(nonnull NSString *)fcmToken { - [_channel invokeMethod:@"onToken" arguments:fcmToken]; -} - -@end diff --git a/firebase_messaging/ios/firebase_messaging.podspec b/firebase_messaging/ios/firebase_messaging.podspec deleted file mode 100644 index 21ae3a0..0000000 --- a/firebase_messaging/ios/firebase_messaging.podspec +++ /dev/null @@ -1,22 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# -Pod::Spec.new do |s| - s.name = 'firebase_messaging' - s.version = '0.0.1' - s.summary = 'Firebase Cloud Messaging plugin for Flutter.' - s.description = <<-DESC -Firebase Cloud Messaging plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_messaging' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.dependency 'Flutter' - s.dependency 'Firebase/Core' - s.dependency 'Firebase/Messaging' - s.static_framework = true - s.ios.deployment_target = '8.0' -end diff --git a/firebase_messaging/lib/firebase_messaging.dart b/firebase_messaging/lib/firebase_messaging.dart deleted file mode 100644 index 3c2770b..0000000 --- a/firebase_messaging/lib/firebase_messaging.dart +++ /dev/null @@ -1,186 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:flutter/services.dart'; -import 'package:meta/meta.dart'; -import 'package:platform/platform.dart'; - -typedef Future MessageHandler(Map message); - -/// Implementation of the Firebase Cloud Messaging API for Flutter. -/// -/// Your app should call [requestNotificationPermissions] first and then -/// register handlers for incoming messages with [configure]. -class FirebaseMessaging { - factory FirebaseMessaging() => _instance; - - @visibleForTesting - FirebaseMessaging.private(MethodChannel channel, Platform platform) - : _channel = channel, - _platform = platform; - - static final FirebaseMessaging _instance = FirebaseMessaging.private( - const MethodChannel('plugins.flutter.io/firebase_messaging'), - const LocalPlatform()); - - final MethodChannel _channel; - final Platform _platform; - - MessageHandler _onMessage; - MessageHandler _onLaunch; - MessageHandler _onResume; - - /// On iOS, prompts the user for notification permissions the first time - /// it is called. - /// - /// Does nothing on Android. - void requestNotificationPermissions( - [IosNotificationSettings iosSettings = const IosNotificationSettings()]) { - if (!_platform.isIOS) { - return; - } - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - _channel.invokeMethod( - 'requestNotificationPermissions', iosSettings.toMap()); - } - - final StreamController _iosSettingsStreamController = - StreamController.broadcast(); - - /// Stream that fires when the user changes their notification settings. - /// - /// Only fires on iOS. - Stream get onIosSettingsRegistered { - return _iosSettingsStreamController.stream; - } - - /// Sets up [MessageHandler] for incoming messages. - void configure({ - MessageHandler onMessage, - MessageHandler onLaunch, - MessageHandler onResume, - }) { - _onMessage = onMessage; - _onLaunch = onLaunch; - _onResume = onResume; - _channel.setMethodCallHandler(_handleMethod); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - _channel.invokeMethod('configure'); - } - - final StreamController _tokenStreamController = - StreamController.broadcast(); - - /// Fires when a new FCM token is generated. - Stream get onTokenRefresh { - return _tokenStreamController.stream; - } - - /// Returns the FCM token. - Future getToken() async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await _channel.invokeMethod('getToken'); - } - - /// Subscribe to topic in background. - /// - /// [topic] must match the following regular expression: - /// "[a-zA-Z0-9-_.~%]{1,900}". - void subscribeToTopic(String topic) { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - _channel.invokeMethod('subscribeToTopic', topic); - } - - /// Unsubscribe from topic in background. - void unsubscribeFromTopic(String topic) { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - _channel.invokeMethod('unsubscribeFromTopic', topic); - } - - /// Resets Instance ID and revokes all tokens. In iOS, it also unregisters from remote notifications. - /// - /// A new Instance ID is generated asynchronously if Firebase Cloud Messaging auto-init is enabled. - /// - /// returns true if the operations executed successfully and false if an error ocurred - Future deleteInstanceID() async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await _channel.invokeMethod('deleteInstanceID'); - } - - /// Determine whether FCM auto-initialization is enabled or disabled. - Future autoInitEnabled() async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await _channel.invokeMethod('autoInitEnabled'); - } - - /// Enable or disable auto-initialization of Firebase Cloud Messaging. - Future setAutoInitEnabled(bool enabled) async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - await _channel.invokeMethod('setAutoInitEnabled', enabled); - } - - Future _handleMethod(MethodCall call) async { - switch (call.method) { - case "onToken": - final String token = call.arguments; - _tokenStreamController.add(token); - return null; - case "onIosSettingsRegistered": - _iosSettingsStreamController.add(IosNotificationSettings._fromMap( - call.arguments.cast())); - return null; - case "onMessage": - return _onMessage(call.arguments.cast()); - case "onLaunch": - return _onLaunch(call.arguments.cast()); - case "onResume": - return _onResume(call.arguments.cast()); - default: - throw UnsupportedError("Unrecognized JSON message"); - } - } -} - -class IosNotificationSettings { - const IosNotificationSettings({ - this.sound = true, - this.alert = true, - this.badge = true, - }); - - IosNotificationSettings._fromMap(Map settings) - : sound = settings['sound'], - alert = settings['alert'], - badge = settings['badge']; - - final bool sound; - final bool alert; - final bool badge; - - @visibleForTesting - Map toMap() { - return {'sound': sound, 'alert': alert, 'badge': badge}; - } - - @override - String toString() => 'PushNotificationSettings ${toMap()}'; -} diff --git a/firebase_messaging/pubspec.yaml b/firebase_messaging/pubspec.yaml deleted file mode 100644 index fc2d538..0000000 --- a/firebase_messaging/pubspec.yaml +++ /dev/null @@ -1,29 +0,0 @@ -name: firebase_messaging -description: Flutter plugin for Firebase Cloud Messaging, a cross-platform - messaging solution that lets you reliably deliver messages on Android and iOS. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_messaging -version: 4.0.0+4 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebasemessaging - iosPrefix: FLT - pluginClass: FirebaseMessagingPlugin - -dependencies: - meta: ^1.0.4 - platform: ^2.0.0 - flutter: - sdk: flutter - -dev_dependencies: - test: ^1.3.0 - mockito: ^3.0.0 - flutter_test: - sdk: flutter - firebase_core: ^0.3.0 - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=0.1.4 <2.0.0" diff --git a/firebase_messaging/test/firebase_messaging_test.dart b/firebase_messaging/test/firebase_messaging_test.dart deleted file mode 100644 index 9ef5351..0000000 --- a/firebase_messaging/test/firebase_messaging_test.dart +++ /dev/null @@ -1,200 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; - -import 'package:flutter/services.dart'; -import 'package:firebase_messaging/firebase_messaging.dart'; -import 'package:mockito/mockito.dart'; -import 'package:platform/platform.dart'; -import 'package:test/test.dart'; - -void main() { - MockMethodChannel mockChannel; - FirebaseMessaging firebaseMessaging; - - setUp(() { - mockChannel = MockMethodChannel(); - firebaseMessaging = FirebaseMessaging.private( - mockChannel, FakePlatform(operatingSystem: 'ios')); - }); - - test('requestNotificationPermissions on ios with default permissions', () { - firebaseMessaging.requestNotificationPermissions(); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - verify(mockChannel.invokeMethod('requestNotificationPermissions', - {'sound': true, 'badge': true, 'alert': true})); - }); - - test('requestNotificationPermissions on ios with custom permissions', () { - firebaseMessaging.requestNotificationPermissions( - const IosNotificationSettings(sound: false)); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - verify(mockChannel.invokeMethod('requestNotificationPermissions', - {'sound': false, 'badge': true, 'alert': true})); - }); - - test('requestNotificationPermissions on android', () { - firebaseMessaging = FirebaseMessaging.private( - mockChannel, FakePlatform(operatingSystem: 'android')); - - firebaseMessaging.requestNotificationPermissions(); - verifyZeroInteractions(mockChannel); - }); - - test('requestNotificationPermissions on android', () { - firebaseMessaging = FirebaseMessaging.private( - mockChannel, FakePlatform(operatingSystem: 'android')); - - firebaseMessaging.requestNotificationPermissions(); - verifyZeroInteractions(mockChannel); - }); - - test('configure', () { - firebaseMessaging.configure(); - verify(mockChannel.setMethodCallHandler(any)); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - verify(mockChannel.invokeMethod('configure')); - }); - - test('incoming token', () async { - firebaseMessaging.configure(); - final dynamic handler = - verify(mockChannel.setMethodCallHandler(captureAny)).captured.single; - final String token1 = 'I am a super secret token'; - final String token2 = 'I am the new token in town'; - Future tokenFromStream = firebaseMessaging.onTokenRefresh.first; - await handler(MethodCall('onToken', token1)); - - expect(await tokenFromStream, token1); - - tokenFromStream = firebaseMessaging.onTokenRefresh.first; - await handler(MethodCall('onToken', token2)); - - expect(await tokenFromStream, token2); - }); - - test('incoming iOS settings', () async { - firebaseMessaging.configure(); - final dynamic handler = - verify(mockChannel.setMethodCallHandler(captureAny)).captured.single; - IosNotificationSettings iosSettings = const IosNotificationSettings(); - - Future iosSettingsFromStream = - firebaseMessaging.onIosSettingsRegistered.first; - await handler(MethodCall('onIosSettingsRegistered', iosSettings.toMap())); - expect((await iosSettingsFromStream).toMap(), iosSettings.toMap()); - - iosSettings = const IosNotificationSettings(sound: false); - iosSettingsFromStream = firebaseMessaging.onIosSettingsRegistered.first; - await handler(MethodCall('onIosSettingsRegistered', iosSettings.toMap())); - expect((await iosSettingsFromStream).toMap(), iosSettings.toMap()); - }); - - test('incoming messages', () async { - final Completer onMessage = Completer(); - final Completer onLaunch = Completer(); - final Completer onResume = Completer(); - - firebaseMessaging.configure(onMessage: (dynamic m) async { - onMessage.complete(m); - }, onLaunch: (dynamic m) async { - onLaunch.complete(m); - }, onResume: (dynamic m) async { - onResume.complete(m); - }); - final dynamic handler = - verify(mockChannel.setMethodCallHandler(captureAny)).captured.single; - - final Map onMessageMessage = {}; - final Map onLaunchMessage = {}; - final Map onResumeMessage = {}; - - await handler(MethodCall('onMessage', onMessageMessage)); - expect(await onMessage.future, onMessageMessage); - expect(onLaunch.isCompleted, isFalse); - expect(onResume.isCompleted, isFalse); - - await handler(MethodCall('onLaunch', onLaunchMessage)); - expect(await onLaunch.future, onLaunchMessage); - expect(onResume.isCompleted, isFalse); - - await handler(MethodCall('onResume', onResumeMessage)); - expect(await onResume.future, onResumeMessage); - }); - - const String myTopic = 'Flutter'; - - test('subscribe to topic', () { - firebaseMessaging.subscribeToTopic(myTopic); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - verify(mockChannel.invokeMethod('subscribeToTopic', myTopic)); - }); - - test('unsubscribe from topic', () { - firebaseMessaging.unsubscribeFromTopic(myTopic); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - verify(mockChannel.invokeMethod('unsubscribeFromTopic', myTopic)); - }); - - test('getToken', () { - firebaseMessaging.getToken(); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - verify(mockChannel.invokeMethod('getToken')); - }); - - test('deleteInstanceID', () { - firebaseMessaging.deleteInstanceID(); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - verify(mockChannel.invokeMethod('deleteInstanceID')); - }); - - test('autoInitEnabled', () { - firebaseMessaging.autoInitEnabled(); - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - verify(mockChannel.invokeMethod('autoInitEnabled')); - }); - - test('setAutoInitEnabled', () { - // assert that we havent called the method yet - verifyNever(firebaseMessaging.setAutoInitEnabled(true)); - - firebaseMessaging.setAutoInitEnabled(true); - - // assert we called the method with enabled = true - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - verify(mockChannel.invokeMethod('setAutoInitEnabled', true)); - - // assert that enabled = false was not yet called - verifyNever(firebaseMessaging.setAutoInitEnabled(false)); - - firebaseMessaging.setAutoInitEnabled(false); - - // assert call with enabled = false was properly done - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - verify(mockChannel.invokeMethod('setAutoInitEnabled', false)); - }); -} - -class MockMethodChannel extends Mock implements MethodChannel {} diff --git a/firebase_storage/.gitignore b/firebase_storage/.gitignore deleted file mode 100644 index 3749ecc..0000000 --- a/firebase_storage/.gitignore +++ /dev/null @@ -1,36 +0,0 @@ -.DS_Store -.atom/ -.idea/ -.vscode/ - -.packages -.pub/ -.dart_tool/ -pubspec.lock - -Podfile -Podfile.lock -Pods/ -.symlinks/ -**/Flutter/App.framework/ -**/Flutter/Flutter.framework/ -**/Flutter/Generated.xcconfig -**/Flutter/flutter_assets/ -ServiceDefinitions.json -xcuserdata/ - -local.properties -keystore.properties -.gradle/ -gradlew -gradlew.bat -gradle-wrapper.jar -*.iml - -GeneratedPluginRegistrant.h -GeneratedPluginRegistrant.m -GeneratedPluginRegistrant.java -build/ -.flutter-plugins - -third_party diff --git a/firebase_storage/CHANGELOG.md b/firebase_storage/CHANGELOG.md deleted file mode 100644 index d4d4561..0000000 --- a/firebase_storage/CHANGELOG.md +++ /dev/null @@ -1,207 +0,0 @@ -## 2.1.1 - -* Added integration tests. - -## 2.1.0+1 - -* Reverting error.code casting/formatting to what it was until version 2.0.1. - -## 2.1.0 - -* Added support for getReferenceFromUrl. - -## 2.0.1+2 - -* Log messages about automatic configuration of the default app are now less confusing. - -## 2.0.1+1 - -* Remove categories. - -## 2.0.1 - -* Log a more detailed warning at build time about the previous AndroidX - migration. - -## 2.0.0 - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - - This was originally incorrectly pushed in the `1.1.0` update. - -## 1.1.0+1 - -* **Revert the breaking 1.1.0 update**. 1.1.0 was known to be breaking and - should have incremented the major version number instead of the minor. This - revert is in and of itself breaking for anyone that has already migrated - however. Anyone who has already migrated their app to AndroidX should - immediately update to `2.0.0` instead. That's the correctly versioned new push - of `1.1.0`. - -## 1.1.0 - -* **BAD**. This was a breaking change that was incorrectly published on a minor - version upgrade, should never have happened. Reverted by 1.1.0+1. - -* **Breaking change**. Migrate from the deprecated original Android Support - Library to AndroidX. This shouldn't result in any functional changes, but it - requires any Android apps using this plugin to [also - migrate](https://developer.android.com/jetpack/androidx/migrate) if they're - using the original support library. - -## 1.0.4 - -* Bump Android dependencies to latest. - -## 1.0.3 - -* Added monitoring of StorageUploadTask via `events` stream. -* Added support for StorageUploadTask functions: `pause`, `resume`, `cancel`. -* Set http version to be compatible with flutter_test. - -## 1.0.2 - -* Added missing http package dependency. - -## 1.0.1 - -* Bump Android and Firebase dependency versions. - -## 1.0.0 - -* **Breaking change**. Make StorageUploadTask implementation classes private. -* Bump to released version - -## 0.3.7 - -* Updated Gradle tooling to match Android Studio 3.1.2. - -## 0.3.6 - -* Added support for custom metadata. - -## 0.3.5 - -* Updated iOS implementation to reflect Firebase API changes. - -## 0.3.4 - -* Added timeout properties to FirebaseStorage. - -## 0.3.3 - -* Added support for initialization with a custom Firebase app. - -## 0.3.2 - -* Added support for StorageReference `writeToFile`. - -## 0.3.1 - -* Added support for StorageReference functions: `getParent`, `getRoot`, `getStorage`, `getName`, `getPath`, `getBucket`. - -## 0.3.0 - -* **Breaking change**. Changed StorageUploadTask to abstract, removed the 'file' field, and made 'path' and 'metadata' - private. Added two subclasses: StorageFileUploadTask and StorageDataUploadTask. -* Deprecated the `put` function and added `putFile` and `putData` to upload files and bytes respectively. - -## 0.2.6 - -* Added support for updateMetadata. - -## 0.2.5 - -* Added StorageMetadata class, support for getMetadata, and support for uploading file with metadata. - -## 0.2.4 - -* Updated Google Play Services dependencies to version 15.0.0. - -## 0.2.3 - -* Updated package channel name and made channel visible for testing - -## 0.2.2 - -* Simplified podspec for Cocoapods 1.5.0, avoiding link issues in app archives. - -## 0.2.1 - -* Added support for getDownloadUrl. - -## 0.2.0 - -* **Breaking change**. Set SDK constraints to match the Flutter beta release. - -## 0.1.5 - -* Fix Dart 2 type errors. - -## 0.1.4 - -* Enabled use in Swift projects. - -## 0.1.3 - -* Added StorageReference `path` getter to retrieve the path component for the storage node. - -## 0.1.2 - -* Added StorageReference delete function to remove files from Firebase. - -## 0.1.1 - -* Simplified and upgraded Android project template to Android SDK 27. -* Updated package description. - -## 0.1.0 - -* **Breaking change**. Upgraded to Gradle 4.1 and Android Studio Gradle plugin - 3.0.1. Older Flutter projects need to upgrade their Gradle setup as well in - order to use this version of the plugin. Instructions can be found - [here](https://github.com/flutter/flutter/wiki/Updating-Flutter-projects-to-Gradle-4.1-and-Android-Studio-Gradle-plugin-3.0.1). -* Relaxed GMS dependency to [11.4.0,12.0[ - -## 0.0.8 - -* Added FLT prefix to iOS types -* Change GMS dependency to 11.4.+ - -## 0.0.7 - -* Change GMS dependency to 11.+ - -## 0.0.6 - -* Added StorageReference getData function to download files into memory. - -## 0.0.5+1 - -* Aligned author name with rest of repo. - -## 0.0.5 - -* Updated to Firebase SDK to always use latest patch version for 11.0.x builds -* Fix crash when encountering upload failure - -## 0.0.4 - -* Updated to Firebase SDK Version 11.0.1 - -## 0.0.3 - -* Suppress unchecked warnings - -## 0.0.2 - -* Bumped buildToolsVersion to 25.0.3 -* Updated README - -## 0.0.1 - -* Initial Release diff --git a/firebase_storage/LICENSE b/firebase_storage/LICENSE deleted file mode 100755 index 000b461..0000000 --- a/firebase_storage/LICENSE +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/firebase_storage/README.md b/firebase_storage/README.md deleted file mode 100755 index 370f50a..0000000 --- a/firebase_storage/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# Firebase Cloud Storage for Flutter - -[![pub package](https://img.shields.io/pub/v/firebase_storage.svg)](https://pub.dartlang.org/packages/firebase_storage) - -A Flutter plugin to use the [Firebase Cloud Storage API](https://firebase.google.com/products/storage/). - -For Flutter plugins for other Firebase products, see [FlutterFire.md](https://github.com/flutter/plugins/blob/master/FlutterFire.md). - -*Note*: This plugin is still under development, and some APIs might not be available yet. [Feedback](https://github.com/flutter/flutter/issues) and [Pull Requests](https://github.com/flutter/plugins/pulls) are most welcome! - -## Usage -To use this plugin, add `firebase_storage` as a [dependency in your pubspec.yaml file](https://flutter.io/platform-plugins/). - -## Getting Started - -See the `example` directory for a complete sample app using Firebase Cloud Storage. diff --git a/firebase_storage/android/build.gradle b/firebase_storage/android/build.gradle deleted file mode 100755 index c2bfd0a..0000000 --- a/firebase_storage/android/build.gradle +++ /dev/null @@ -1,59 +0,0 @@ -def PLUGIN = "firebase_storage"; -def ANDROIDX_WARNING = "flutterPluginsAndroidXWarning"; -gradle.buildFinished { buildResult -> - if (buildResult.failure && !rootProject.ext.has(ANDROIDX_WARNING)) { - println ' *********************************************************' - println 'WARNING: This version of ' + PLUGIN + ' will break your Android build if it or its dependencies aren\'t compatible with AndroidX.' - println ' See https://goo.gl/CP92wY for more information on the problem and how to fix it.' - println ' This warning prints for all Android build failures. The real root cause of the error may be unrelated.' - println ' *********************************************************' - rootProject.ext.set(ANDROIDX_WARNING, true); - } -} - -group 'io.flutter.plugins.firebase.storage' -version '1.0-SNAPSHOT' - -buildscript { - repositories { - google() - jcenter() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - } -} - -rootProject.allprojects { - repositories { - google() - jcenter() - } -} - -allprojects { - gradle.projectsEvaluated { - tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation" - } - } -} - -apply plugin: 'com.android.library' - -android { - compileSdkVersion 28 - - defaultConfig { - minSdkVersion 16 - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - lintOptions { - disable 'InvalidPackage' - } - dependencies { - api 'com.google.firebase:firebase-storage:17.0.0' - implementation 'androidx.annotation:annotation:1.0.0' - } -} diff --git a/firebase_storage/android/gradle.properties b/firebase_storage/android/gradle.properties deleted file mode 100755 index 8bd86f6..0000000 --- a/firebase_storage/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/firebase_storage/android/settings.gradle b/firebase_storage/android/settings.gradle deleted file mode 100755 index f0aec44..0000000 --- a/firebase_storage/android/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 'firebase_storage' diff --git a/firebase_storage/android/src/main/AndroidManifest.xml b/firebase_storage/android/src/main/AndroidManifest.xml deleted file mode 100755 index 7d66313..0000000 --- a/firebase_storage/android/src/main/AndroidManifest.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java b/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java deleted file mode 100755 index 37f8202..0000000 --- a/firebase_storage/android/src/main/java/io/flutter/plugins/firebase/storage/FirebaseStoragePlugin.java +++ /dev/null @@ -1,490 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebase.storage; - -import android.net.Uri; -import android.util.SparseArray; -import androidx.annotation.NonNull; -import com.google.android.gms.tasks.OnCompleteListener; -import com.google.android.gms.tasks.OnFailureListener; -import com.google.android.gms.tasks.OnSuccessListener; -import com.google.android.gms.tasks.Task; -import com.google.firebase.FirebaseApp; -import com.google.firebase.storage.FileDownloadTask; -import com.google.firebase.storage.FirebaseStorage; -import com.google.firebase.storage.OnPausedListener; -import com.google.firebase.storage.OnProgressListener; -import com.google.firebase.storage.StorageException; -import com.google.firebase.storage.StorageMetadata; -import com.google.firebase.storage.StorageReference; -import com.google.firebase.storage.UploadTask; -import io.flutter.plugin.common.MethodCall; -import io.flutter.plugin.common.MethodChannel; -import io.flutter.plugin.common.MethodChannel.MethodCallHandler; -import io.flutter.plugin.common.MethodChannel.Result; -import io.flutter.plugin.common.PluginRegistry.Registrar; -import java.io.File; -import java.util.HashMap; -import java.util.Map; - -/** FirebaseStoragePlugin */ -public class FirebaseStoragePlugin implements MethodCallHandler { - private FirebaseStorage firebaseStorage; - private final MethodChannel channel; - - private int nextUploadHandle = 0; - private final SparseArray uploadTasks = new SparseArray<>(); - - public static void registerWith(Registrar registrar) { - final MethodChannel channel = - new MethodChannel(registrar.messenger(), "plugins.flutter.io/firebase_storage"); - channel.setMethodCallHandler(new FirebaseStoragePlugin(channel, registrar)); - } - - private FirebaseStoragePlugin(MethodChannel channel, Registrar registrar) { - this.channel = channel; - FirebaseApp.initializeApp(registrar.context()); - } - - @Override - public void onMethodCall(MethodCall call, final Result result) { - String app = call.argument("app"); - String storageBucket = call.argument("bucket"); - if (app == null && storageBucket == null) { - firebaseStorage = FirebaseStorage.getInstance(); - } else if (storageBucket == null) { - firebaseStorage = FirebaseStorage.getInstance(FirebaseApp.getInstance(app)); - } else if (app == null) { - firebaseStorage = FirebaseStorage.getInstance(storageBucket); - } else { - firebaseStorage = FirebaseStorage.getInstance(FirebaseApp.getInstance(app), storageBucket); - } - - switch (call.method) { - case "FirebaseStorage#getMaxDownloadRetryTime": - result.success(firebaseStorage.getMaxDownloadRetryTimeMillis()); - break; - case "FirebaseStorage#getMaxUploadRetryTime": - result.success(firebaseStorage.getMaxUploadRetryTimeMillis()); - break; - case "FirebaseStorage#getMaxOperationRetryTime": - result.success(firebaseStorage.getMaxOperationRetryTimeMillis()); - break; - case "FirebaseStorage#setMaxDownloadRetryTime": - setMaxDownloadRetryTimeMillis(call, result); - break; - case "FirebaseStorage#setMaxUploadRetryTime": - setMaxUploadRetryTimeMillis(call, result); - break; - case "FirebaseStorage#setMaxOperationRetryTime": - setMaxOperationTimeMillis(call, result); - break; - case "FirebaseStorage#getReferenceFromUrl": - getReferenceFromUrl(call, result); - break; - case "StorageReference#putFile": - putFile(call, result); - break; - case "StorageReference#putData": - putData(call, result); - break; - case "StorageReference#getData": - getData(call, result); - break; - case "StorageReference#delete": - delete(call, result); - break; - case "StorageReference#getBucket": - getBucket(call, result); - break; - case "StorageReference#getName": - getName(call, result); - break; - case "StorageReference#getPath": - getPath(call, result); - break; - case "StorageReference#getDownloadUrl": - getDownloadUrl(call, result); - break; - case "StorageReference#getMetadata": - getMetadata(call, result); - break; - case "StorageReference#updateMetadata": - updateMetadata(call, result); - break; - case "StorageReference#writeToFile": - writeToFile(call, result); - break; - case "UploadTask#pause": - pauseUploadTask(call, result); - break; - case "UploadTask#resume": - resumeUploadTask(call, result); - break; - case "UploadTask#cancel": - cancelUploadTask(call, result); - break; - default: - result.notImplemented(); - break; - } - } - - private void setMaxDownloadRetryTimeMillis(MethodCall call, Result result) { - Number time = call.argument("time"); - firebaseStorage.setMaxDownloadRetryTimeMillis(time.longValue()); - result.success(null); - } - - private void setMaxUploadRetryTimeMillis(MethodCall call, Result result) { - Number time = call.argument("time"); - firebaseStorage.setMaxUploadRetryTimeMillis(time.longValue()); - result.success(null); - } - - private void setMaxOperationTimeMillis(MethodCall call, Result result) { - Number time = call.argument("time"); - firebaseStorage.setMaxOperationRetryTimeMillis(time.longValue()); - result.success(null); - } - - private void getReferenceFromUrl(MethodCall call, Result result) { - String fullUrl = call.argument("fullUrl"); - StorageReference ref = firebaseStorage.getReferenceFromUrl(fullUrl); - result.success(ref != null ? ref.getPath() : null); - } - - private void getMetadata(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - ref.getMetadata() - .addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(StorageMetadata storageMetadata) { - result.success(buildMapFromMetadata(storageMetadata)); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("metadata_error", e.getMessage(), null); - } - }); - } - - private void updateMetadata(MethodCall call, final Result result) { - String path = call.argument("path"); - Map metadata = call.argument("metadata"); - StorageReference ref = firebaseStorage.getReference().child(path); - ref.updateMetadata(buildMetadataFromMap(metadata)) - .addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(StorageMetadata storageMetadata) { - result.success(buildMapFromMetadata(storageMetadata)); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("metadata_error", e.getMessage(), null); - } - }); - } - - private void getBucket(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - result.success(ref.getBucket()); - } - - private void getName(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - result.success(ref.getName()); - } - - private void getPath(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - result.success(ref.getPath()); - } - - private void getDownloadUrl(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - ref.getDownloadUrl() - .addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(Uri uri) { - result.success(uri.toString()); - } - }) - .addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("download_error", e.getMessage(), null); - } - }); - } - - private void delete(MethodCall call, final Result result) { - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - final Task deleteTask = ref.delete(); - deleteTask.addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(Void aVoid) { - result.success(null); - } - }); - deleteTask.addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("deletion_error", e.getMessage(), null); - } - }); - } - - private void putFile(MethodCall call, Result result) { - String filename = call.argument("filename"); - String path = call.argument("path"); - Map metadata = call.argument("metadata"); - File file = new File(filename); - StorageReference ref = firebaseStorage.getReference().child(path); - UploadTask uploadTask; - if (metadata == null) { - uploadTask = ref.putFile(Uri.fromFile(file)); - } else { - uploadTask = ref.putFile(Uri.fromFile(file), buildMetadataFromMap(metadata)); - } - final int handle = addUploadListeners(uploadTask); - result.success(handle); - } - - private void putData(MethodCall call, Result result) { - byte[] bytes = call.argument("data"); - String path = call.argument("path"); - Map metadata = call.argument("metadata"); - StorageReference ref = firebaseStorage.getReference().child(path); - UploadTask uploadTask; - if (metadata == null) { - uploadTask = ref.putBytes(bytes); - } else { - uploadTask = ref.putBytes(bytes, buildMetadataFromMap(metadata)); - } - final int handle = addUploadListeners(uploadTask); - result.success(handle); - } - - private StorageMetadata buildMetadataFromMap(Map map) { - StorageMetadata.Builder builder = new StorageMetadata.Builder(); - builder.setCacheControl((String) map.get("cacheControl")); - builder.setContentEncoding((String) map.get("contentEncoding")); - builder.setContentDisposition((String) map.get("contentDisposition")); - builder.setContentLanguage((String) map.get("contentLanguage")); - builder.setContentType((String) map.get("contentType")); - - @SuppressWarnings("unchecked") - Map customMetadata = (Map) map.get("customMetadata"); - if (customMetadata != null) { - for (String key : customMetadata.keySet()) { - builder.setCustomMetadata(key, customMetadata.get(key)); - } - } - return builder.build(); - } - - private Map buildMapFromMetadata(StorageMetadata storageMetadata) { - Map map = new HashMap<>(); - map.put("name", storageMetadata.getName()); - map.put("bucket", storageMetadata.getBucket()); - map.put("generation", storageMetadata.getGeneration()); - map.put("metadataGeneration", storageMetadata.getMetadataGeneration()); - map.put("path", storageMetadata.getPath()); - map.put("sizeBytes", storageMetadata.getSizeBytes()); - map.put("creationTimeMillis", storageMetadata.getCreationTimeMillis()); - map.put("updatedTimeMillis", storageMetadata.getUpdatedTimeMillis()); - map.put("md5Hash", storageMetadata.getMd5Hash()); - map.put("cacheControl", storageMetadata.getCacheControl()); - map.put("contentDisposition", storageMetadata.getContentDisposition()); - map.put("contentEncoding", storageMetadata.getContentEncoding()); - map.put("contentLanguage", storageMetadata.getContentLanguage()); - map.put("contentType", storageMetadata.getContentType()); - - Map customMetadata = new HashMap<>(); - for (String key : storageMetadata.getCustomMetadataKeys()) { - customMetadata.put(key, storageMetadata.getCustomMetadata(key)); - } - map.put("customMetadata", customMetadata); - return map; - } - - private void getData(MethodCall call, final Result result) { - Integer maxSize = call.argument("maxSize"); - String path = call.argument("path"); - StorageReference ref = firebaseStorage.getReference().child(path); - Task downloadTask = ref.getBytes(maxSize); - downloadTask.addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(byte[] bytes) { - result.success(bytes); - } - }); - downloadTask.addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("download_error", e.getMessage(), null); - } - }); - } - - private void writeToFile(MethodCall call, final Result result) { - String path = call.argument("path"); - String filePath = call.argument("filePath"); - File file = new File(filePath); - StorageReference ref = firebaseStorage.getReference().child(path); - FileDownloadTask downloadTask = ref.getFile(file); - downloadTask.addOnSuccessListener( - new OnSuccessListener() { - @Override - public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) { - result.success(taskSnapshot.getTotalByteCount()); - } - }); - downloadTask.addOnFailureListener( - new OnFailureListener() { - @Override - public void onFailure(@NonNull Exception e) { - result.error("download_error", e.getMessage(), null); - } - }); - } - - private void pauseUploadTask(MethodCall call, final Result result) { - int handle = call.argument("handle"); - UploadTask task = uploadTasks.get(handle); - if (task != null) { - task.pause(); - result.success(null); - } else { - result.error("pause_error", "task == null", null); - } - } - - private void cancelUploadTask(MethodCall call, final Result result) { - int handle = call.argument("handle"); - UploadTask task = uploadTasks.get(handle); - if (task != null) { - task.cancel(); - result.success(null); - } else { - result.error("cancel_error", "task == null", null); - } - } - - private void resumeUploadTask(MethodCall call, final Result result) { - int handle = call.argument("handle"); - UploadTask task = uploadTasks.get(handle); - if (task != null) { - task.resume(); - result.success(null); - } else { - result.error("resume_error", "task == null", null); - } - } - - private int addUploadListeners(final UploadTask uploadTask) { - final int handle = ++nextUploadHandle; - uploadTask - .addOnProgressListener( - new OnProgressListener() { - @Override - public void onProgress(UploadTask.TaskSnapshot snapshot) { - invokeStorageTaskEvent(handle, StorageTaskEventType.progress, snapshot, null); - } - }) - .addOnPausedListener( - new OnPausedListener() { - @Override - public void onPaused(UploadTask.TaskSnapshot snapshot) { - invokeStorageTaskEvent(handle, StorageTaskEventType.pause, snapshot, null); - } - }) - .addOnCompleteListener( - new OnCompleteListener() { - @Override - public void onComplete(@NonNull Task task) { - if (!task.isSuccessful()) { - invokeStorageTaskEvent( - handle, - StorageTaskEventType.failure, - uploadTask.getSnapshot(), - (StorageException) task.getException()); - } else { - invokeStorageTaskEvent( - handle, StorageTaskEventType.success, task.getResult(), null); - } - uploadTasks.remove(handle); - } - }); - uploadTasks.put(handle, uploadTask); - return handle; - } - - private enum StorageTaskEventType { - resume, - progress, - pause, - success, - failure - } - - private void invokeStorageTaskEvent( - int handle, - StorageTaskEventType type, - UploadTask.TaskSnapshot snapshot, - StorageException error) { - channel.invokeMethod("StorageTaskEvent", buildMapFromTaskEvent(handle, type, snapshot, error)); - } - - private Map buildMapFromTaskEvent( - int handle, - StorageTaskEventType type, - UploadTask.TaskSnapshot snapshot, - StorageException error) { - Map map = new HashMap<>(); - map.put("handle", handle); - map.put("type", type.ordinal()); - map.put("snapshot", buildMapFromTaskSnapshot(snapshot, error)); - return map; - } - - private Map buildMapFromTaskSnapshot( - UploadTask.TaskSnapshot snapshot, StorageException error) { - Map map = new HashMap<>(); - map.put("bytesTransferred", snapshot.getBytesTransferred()); - map.put("totalByteCount", snapshot.getTotalByteCount()); - if (snapshot.getUploadSessionUri() != null) { - map.put("uploadSessionUri", snapshot.getUploadSessionUri().toString()); - } - if (error != null) { - map.put("error", error.getErrorCode()); - } - if (snapshot.getMetadata() != null) { - map.put("storageMetadata", buildMapFromMetadata(snapshot.getMetadata())); - } - return map; - } -} diff --git a/firebase_storage/example/README.md b/firebase_storage/example/README.md deleted file mode 100755 index 8ed83b6..0000000 --- a/firebase_storage/example/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# firebase_storage_example - -Demonstrates how to use the firebase_storage plugin. - -## Getting Started - -For help getting started with Flutter, view our online -[documentation](http://flutter.io/). diff --git a/firebase_storage/example/android/app/build.gradle b/firebase_storage/example/android/app/build.gradle deleted file mode 100755 index e40ea97..0000000 --- a/firebase_storage/example/android/app/build.gradle +++ /dev/null @@ -1,62 +0,0 @@ -def localProperties = new Properties() -def localPropertiesFile = rootProject.file('local.properties') -if (localPropertiesFile.exists()) { - localPropertiesFile.withReader('UTF-8') { reader -> - localProperties.load(reader) - } -} - -def flutterRoot = localProperties.getProperty('flutter.sdk') -if (flutterRoot == null) { - throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") -} - -def flutterVersionCode = localProperties.getProperty('flutter.versionCode') -if (flutterVersionCode == null) { - flutterVersionCode = '1' -} - -def flutterVersionName = localProperties.getProperty('flutter.versionName') -if (flutterVersionName == null) { - flutterVersionName = '1.0' -} - -apply plugin: 'com.android.application' -apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" - -android { - compileSdkVersion 28 - - lintOptions { - disable 'InvalidPackage' - } - - defaultConfig { - applicationId 'io.flutter.plugins.firebasestorageexample' - minSdkVersion 16 - targetSdkVersion 28 - versionCode flutterVersionCode.toInteger() - versionName flutterVersionName - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - } - - buildTypes { - release { - // TODO: Add your own signing config for the release build. - // Signing with the debug keys for now, so `flutter run --release` works. - signingConfig signingConfigs.debug - } - } -} - -flutter { - source '../..' -} - -dependencies { - testImplementation 'junit:junit:4.12' - androidTestImplementation 'androidx.test:runner:1.1.1' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' -} - -apply plugin: 'com.google.gms.google-services' diff --git a/firebase_storage/example/android/app/gradle.properties b/firebase_storage/example/android/app/gradle.properties deleted file mode 100644 index 5465fec..0000000 --- a/firebase_storage/example/android/app/gradle.properties +++ /dev/null @@ -1,2 +0,0 @@ -android.enableJetifier=true -android.useAndroidX=true \ No newline at end of file diff --git a/firebase_storage/example/android/app/gradle/wrapper/gradle-wrapper.properties b/firebase_storage/example/android/app/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 9a4163a..0000000 --- a/firebase_storage/example/android/app/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/firebase_storage/example/android/app/src/main/AndroidManifest.xml b/firebase_storage/example/android/app/src/main/AndroidManifest.xml deleted file mode 100755 index c2ce4f8..0000000 --- a/firebase_storage/example/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - diff --git a/firebase_storage/example/android/app/src/main/java/io/flutter/plugins/firebasestorageexample/MainActivity.java b/firebase_storage/example/android/app/src/main/java/io/flutter/plugins/firebasestorageexample/MainActivity.java deleted file mode 100644 index 4fa7818..0000000 --- a/firebase_storage/example/android/app/src/main/java/io/flutter/plugins/firebasestorageexample/MainActivity.java +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package io.flutter.plugins.firebasestorageexample; - -import android.os.Bundle; -import io.flutter.app.FlutterActivity; -import io.flutter.plugins.GeneratedPluginRegistrant; - -public class MainActivity extends FlutterActivity { - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - GeneratedPluginRegistrant.registerWith(this); - } -} diff --git a/firebase_storage/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/firebase_storage/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100755 index db77bb4..0000000 Binary files a/firebase_storage/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/firebase_storage/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/firebase_storage/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png deleted file mode 100755 index 17987b7..0000000 Binary files a/firebase_storage/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/firebase_storage/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/firebase_storage/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100755 index 09d4391..0000000 Binary files a/firebase_storage/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/firebase_storage/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/firebase_storage/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100755 index d5f1c8d..0000000 Binary files a/firebase_storage/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/firebase_storage/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/firebase_storage/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100755 index 4d6372e..0000000 Binary files a/firebase_storage/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/firebase_storage/example/android/build.gradle b/firebase_storage/example/android/build.gradle deleted file mode 100755 index a144a19..0000000 --- a/firebase_storage/example/android/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -buildscript { - repositories { - google() - jcenter() - mavenLocal() - } - - dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.2.0' - } -} - -allprojects { - repositories { - google() - jcenter() - mavenLocal() - } -} - -rootProject.buildDir = '../build' -subprojects { - project.buildDir = "${rootProject.buildDir}/${project.name}" -} -subprojects { - project.evaluationDependsOn(':app') -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/firebase_storage/example/android/gradle.properties b/firebase_storage/example/android/gradle.properties deleted file mode 100755 index 8bd86f6..0000000 --- a/firebase_storage/example/android/gradle.properties +++ /dev/null @@ -1 +0,0 @@ -org.gradle.jvmargs=-Xmx1536M diff --git a/firebase_storage/example/android/gradle/wrapper/gradle-wrapper.properties b/firebase_storage/example/android/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 019065d..0000000 --- a/firebase_storage/example/android/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip diff --git a/firebase_storage/example/android/settings.gradle b/firebase_storage/example/android/settings.gradle deleted file mode 100755 index 115da6c..0000000 --- a/firebase_storage/example/android/settings.gradle +++ /dev/null @@ -1,15 +0,0 @@ -include ':app' - -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() - -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withInputStream { stream -> plugins.load(stream) } -} - -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} diff --git a/firebase_storage/example/ios/Flutter/AppFrameworkInfo.plist b/firebase_storage/example/ios/Flutter/AppFrameworkInfo.plist deleted file mode 100755 index 6c2de80..0000000 --- a/firebase_storage/example/ios/Flutter/AppFrameworkInfo.plist +++ /dev/null @@ -1,30 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - App - CFBundleIdentifier - io.flutter.flutter.app - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - App - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - UIRequiredDeviceCapabilities - - arm64 - - MinimumOSVersion - 8.0 - - diff --git a/firebase_storage/example/ios/Flutter/Debug.xcconfig b/firebase_storage/example/ios/Flutter/Debug.xcconfig deleted file mode 100755 index 9803018..0000000 --- a/firebase_storage/example/ios/Flutter/Debug.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig" diff --git a/firebase_storage/example/ios/Flutter/Release.xcconfig b/firebase_storage/example/ios/Flutter/Release.xcconfig deleted file mode 100755 index a4a8c60..0000000 --- a/firebase_storage/example/ios/Flutter/Release.xcconfig +++ /dev/null @@ -1,2 +0,0 @@ -#include "Generated.xcconfig" -#include "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig" diff --git a/firebase_storage/example/ios/Runner.xcodeproj/project.pbxproj b/firebase_storage/example/ios/Runner.xcodeproj/project.pbxproj deleted file mode 100644 index 54e5e34..0000000 --- a/firebase_storage/example/ios/Runner.xcodeproj/project.pbxproj +++ /dev/null @@ -1,481 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 5C6F5A711EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */; }; - 7A1ECC911E8EDB6900309407 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB31CF90195004384FC /* Generated.xcconfig */; }; - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; - 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; - CE57DC9C9240FBD15E358E24 /* libPods-Runner.a in Frameworks */ = {isa = PBXBuildFile; fileRef = E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 9705A1C41CF9048500538489 /* Embed Frameworks */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = ""; - dstSubfolderSpec = 10; - files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, - ); - name = "Embed Frameworks"; - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; - 5C6F5A6F1EC3CCCC008D64B5 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; - 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; - 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; - 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Runner.a"; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 97C146EB1CF9000F007C117D /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, - CE57DC9C9240FBD15E358E24 /* libPods-Runner.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 840012C8B5EDBCF56B0E4AC1 /* Pods */ = { - isa = PBXGroup; - children = ( - ); - name = Pods; - sourceTree = ""; - }; - 9740EEB11CF90186004384FC /* Flutter */ = { - isa = PBXGroup; - children = ( - 3B80C3931E831B6300D905FE /* App.framework */, - 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, - 9740EEB21CF90195004384FC /* Debug.xcconfig */, - 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, - 9740EEB31CF90195004384FC /* Generated.xcconfig */, - ); - name = Flutter; - sourceTree = ""; - }; - 97C146E51CF9000F007C117D = { - isa = PBXGroup; - children = ( - 9740EEB11CF90186004384FC /* Flutter */, - 97C146F01CF9000F007C117D /* Runner */, - 97C146EF1CF9000F007C117D /* Products */, - 840012C8B5EDBCF56B0E4AC1 /* Pods */, - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */, - ); - sourceTree = ""; - }; - 97C146EF1CF9000F007C117D /* Products */ = { - isa = PBXGroup; - children = ( - 97C146EE1CF9000F007C117D /* Runner.app */, - ); - name = Products; - sourceTree = ""; - }; - 97C146F01CF9000F007C117D /* Runner */ = { - isa = PBXGroup; - children = ( - 5C6F5A6F1EC3CCCC008D64B5 /* GeneratedPluginRegistrant.h */, - 5C6F5A701EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m */, - 7A1ECC901E8EDB6900309407 /* GoogleService-Info.plist */, - 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */, - 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */, - 97C146FA1CF9000F007C117D /* Main.storyboard */, - 97C146FD1CF9000F007C117D /* Assets.xcassets */, - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */, - 97C147021CF9000F007C117D /* Info.plist */, - 97C146F11CF9000F007C117D /* Supporting Files */, - ); - path = Runner; - sourceTree = ""; - }; - 97C146F11CF9000F007C117D /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 97C146F21CF9000F007C117D /* main.m */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - CF3B75C9A7D2FA2A4C99F110 /* Frameworks */ = { - isa = PBXGroup; - children = ( - E13AAF33B0B411D7B2D38642 /* libPods-Runner.a */, - ); - name = Frameworks; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 97C146ED1CF9000F007C117D /* Runner */ = { - isa = PBXNativeTarget; - buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; - buildPhases = ( - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */, - 9740EEB61CF901F6004384FC /* Run Script */, - 97C146EA1CF9000F007C117D /* Sources */, - 97C146EB1CF9000F007C117D /* Frameworks */, - 97C146EC1CF9000F007C117D /* Resources */, - 9705A1C41CF9048500538489 /* Embed Frameworks */, - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */, - 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Runner; - productName = Runner; - productReference = 97C146EE1CF9000F007C117D /* Runner.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 97C146E61CF9000F007C117D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - ORGANIZATIONNAME = "The Chromium Authors"; - TargetAttributes = { - 97C146ED1CF9000F007C117D = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 97C146E51CF9000F007C117D; - productRefGroup = 97C146EF1CF9000F007C117D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 97C146ED1CF9000F007C117D /* Runner */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 97C146EC1CF9000F007C117D /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 7A1ECC911E8EDB6900309407 /* GoogleService-Info.plist in Resources */, - 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */, - 9740EEB51CF90195004384FC /* Generated.xcconfig in Resources */, - 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */, - 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */, - 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */, - 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Thin Binary"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; - }; - 95BB15E9E1769C0D146AA592 /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework", - ); - name = "[CP] Embed Pods Frameworks"; - outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; - 9740EEB61CF901F6004384FC /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build"; - }; - AB1344B0443C71CD721E1BB7 /* [CP] Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 97C146EA1CF9000F007C117D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */, - 97C146F31CF9000F007C117D /* main.m in Sources */, - 5C6F5A711EC3CCCC008D64B5 /* GeneratedPluginRegistrant.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXVariantGroup section */ - 97C146FA1CF9000F007C117D /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C146FB1CF9000F007C117D /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 97C147001CF9000F007C117D /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - -/* Begin XCBuildConfiguration section */ - 97C147031CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 97C147041CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 97C147061CF9000F007C117D /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseStorageExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 97C147071CF9000F007C117D /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; - buildSettings = { - ARCHS = arm64; - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ENABLE_BITCODE = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - INFOPLIST_FILE = Runner/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)/Flutter", - ); - PRODUCT_BUNDLE_IDENTIFIER = io.flutter.plugins.firebaseStorageExample; - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147031CF9000F007C117D /* Debug */, - 97C147041CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 97C147061CF9000F007C117D /* Debug */, - 97C147071CF9000F007C117D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 97C146E61CF9000F007C117D /* Project object */; -} diff --git a/firebase_storage/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/firebase_storage/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc1..0000000 --- a/firebase_storage/example/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/firebase_storage/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/firebase_storage/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme deleted file mode 100755 index 1c95807..0000000 --- a/firebase_storage/example/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/firebase_storage/example/ios/Runner.xcworkspace/contents.xcworkspacedata b/firebase_storage/example/ios/Runner.xcworkspace/contents.xcworkspacedata deleted file mode 100755 index 21a3cc1..0000000 --- a/firebase_storage/example/ios/Runner.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/firebase_storage/example/ios/Runner/AppDelegate.h b/firebase_storage/example/ios/Runner/AppDelegate.h deleted file mode 100644 index d9e18e9..0000000 --- a/firebase_storage/example/ios/Runner/AppDelegate.h +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import - -@interface AppDelegate : FlutterAppDelegate - -@end diff --git a/firebase_storage/example/ios/Runner/AppDelegate.m b/firebase_storage/example/ios/Runner/AppDelegate.m deleted file mode 100644 index a4b51c8..0000000 --- a/firebase_storage/example/ios/Runner/AppDelegate.m +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "AppDelegate.h" -#include "GeneratedPluginRegistrant.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application - didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { - [GeneratedPluginRegistrant registerWithRegistry:self]; - return [super application:application didFinishLaunchingWithOptions:launchOptions]; -} - -@end diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100755 index d22f10b..0000000 --- a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,116 +0,0 @@ -{ - "images" : [ - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "20x20", - "idiom" : "iphone", - "filename" : "Icon-App-20x20@3x.png", - "scale" : "3x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "iphone", - "filename" : "Icon-App-29x29@3x.png", - "scale" : "3x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "iphone", - "filename" : "Icon-App-40x40@3x.png", - "scale" : "3x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@2x.png", - "scale" : "2x" - }, - { - "size" : "60x60", - "idiom" : "iphone", - "filename" : "Icon-App-60x60@3x.png", - "scale" : "3x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@1x.png", - "scale" : "1x" - }, - { - "size" : "20x20", - "idiom" : "ipad", - "filename" : "Icon-App-20x20@2x.png", - "scale" : "2x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@1x.png", - "scale" : "1x" - }, - { - "size" : "29x29", - "idiom" : "ipad", - "filename" : "Icon-App-29x29@2x.png", - "scale" : "2x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@1x.png", - "scale" : "1x" - }, - { - "size" : "40x40", - "idiom" : "ipad", - "filename" : "Icon-App-40x40@2x.png", - "scale" : "2x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@1x.png", - "scale" : "1x" - }, - { - "size" : "76x76", - "idiom" : "ipad", - "filename" : "Icon-App-76x76@2x.png", - "scale" : "2x" - }, - { - "size" : "83.5x83.5", - "idiom" : "ipad", - "filename" : "Icon-App-83.5x83.5@2x.png", - "scale" : "2x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png deleted file mode 100755 index 28c6bf0..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png deleted file mode 100755 index 2ccbfd9..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png deleted file mode 100755 index f091b6b..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png deleted file mode 100755 index 4cde121..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png deleted file mode 100755 index d0ef06e..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png deleted file mode 100755 index dcdc230..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png deleted file mode 100755 index 2ccbfd9..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png deleted file mode 100755 index c8f9ed8..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png deleted file mode 100755 index a6d6b86..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png deleted file mode 100755 index a6d6b86..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png deleted file mode 100755 index 75b2d16..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png deleted file mode 100755 index c4df70d..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png deleted file mode 100755 index 6a84f41..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png b/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png deleted file mode 100755 index d0e1f58..0000000 Binary files a/firebase_storage/example/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png and /dev/null differ diff --git a/firebase_storage/example/ios/Runner/Base.lproj/LaunchScreen.storyboard b/firebase_storage/example/ios/Runner/Base.lproj/LaunchScreen.storyboard deleted file mode 100755 index ebf48f6..0000000 --- a/firebase_storage/example/ios/Runner/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/firebase_storage/example/ios/Runner/Base.lproj/Main.storyboard b/firebase_storage/example/ios/Runner/Base.lproj/Main.storyboard deleted file mode 100755 index f3c2851..0000000 --- a/firebase_storage/example/ios/Runner/Base.lproj/Main.storyboard +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/firebase_storage/example/ios/Runner/Info.plist b/firebase_storage/example/ios/Runner/Info.plist deleted file mode 100755 index 6e4ed61..0000000 --- a/firebase_storage/example/ios/Runner/Info.plist +++ /dev/null @@ -1,49 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - $(PRODUCT_BUNDLE_IDENTIFIER) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - firebase_storage_example - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - arm64 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UIViewControllerBasedStatusBarAppearance - - - diff --git a/firebase_storage/example/ios/Runner/main.m b/firebase_storage/example/ios/Runner/main.m deleted file mode 100644 index bec320c..0000000 --- a/firebase_storage/example/ios/Runner/main.m +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import -#import -#import "AppDelegate.h" - -int main(int argc, char* argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/firebase_storage/example/lib/main.dart b/firebase_storage/example/lib/main.dart deleted file mode 100755 index f388435..0000000 --- a/firebase_storage/example/lib/main.dart +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; -import 'dart:io'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_storage/firebase_storage.dart'; -import 'package:flutter/material.dart'; -import 'package:http/http.dart' as http; -import 'package:uuid/uuid.dart'; - -const String kTestString = 'Hello world!'; - -void main() async { - final FirebaseApp app = await FirebaseApp.configure( - name: 'test', - options: FirebaseOptions( - googleAppID: Platform.isIOS - ? '1:159623150305:ios:4a213ef3dbd8997b' - : '1:159623150305:android:ef48439a0cc0263d', - gcmSenderID: '159623150305', - apiKey: 'AIzaSyChk3KEG7QYrs4kQPLP1tjJNxBTbfCAdgg', - projectID: 'flutter-firebase-plugins', - ), - ); - final FirebaseStorage storage = FirebaseStorage( - app: app, storageBucket: 'gs://flutter-firebase-plugins.appspot.com'); - runApp(MyApp(storage: storage)); -} - -class MyApp extends StatelessWidget { - MyApp({this.storage}); - final FirebaseStorage storage; - - @override - Widget build(BuildContext context) { - return MaterialApp( - title: 'Flutter Storage Example', - home: MyHomePage(storage: storage), - ); - } -} - -class MyHomePage extends StatefulWidget { - MyHomePage({this.storage}); - final FirebaseStorage storage; - - @override - _MyHomePageState createState() => _MyHomePageState(); -} - -class _MyHomePageState extends State { - GlobalKey _scaffoldKey = GlobalKey(); - List _tasks = []; - - Future _uploadFile() async { - final String uuid = Uuid().v1(); - final Directory systemTempDir = Directory.systemTemp; - final File file = await File('${systemTempDir.path}/foo$uuid.txt').create(); - await file.writeAsString(kTestString); - assert(await file.readAsString() == kTestString); - final StorageReference ref = - widget.storage.ref().child('text').child('foo$uuid.txt'); - final StorageUploadTask uploadTask = ref.putFile( - file, - StorageMetadata( - contentLanguage: 'en', - customMetadata: {'activity': 'test'}, - ), - ); - - setState(() { - _tasks.add(uploadTask); - }); - } - - Future _downloadFile(StorageReference ref) async { - final String url = await ref.getDownloadURL(); - final String uuid = Uuid().v1(); - final http.Response downloadData = await http.get(url); - final Directory systemTempDir = Directory.systemTemp; - final File tempFile = File('${systemTempDir.path}/tmp$uuid.txt'); - if (tempFile.existsSync()) { - await tempFile.delete(); - } - await tempFile.create(); - assert(await tempFile.readAsString() == ""); - final StorageFileDownloadTask task = ref.writeToFile(tempFile); - final int byteCount = (await task.future).totalByteCount; - final String tempFileContents = await tempFile.readAsString(); - assert(tempFileContents == kTestString); - assert(byteCount == kTestString.length); - - final String fileContents = downloadData.body; - final String name = await ref.getName(); - final String bucket = await ref.getBucket(); - final String path = await ref.getPath(); - _scaffoldKey.currentState.showSnackBar(SnackBar( - content: Text( - 'Success!\n Downloaded $name \n from url: $url @ bucket: $bucket\n ' - 'at path: $path \n\nFile contents: "$fileContents" \n' - 'Wrote "$tempFileContents" to tmp.txt', - style: const TextStyle(color: Color.fromARGB(255, 0, 155, 0)), - ), - )); - } - - @override - Widget build(BuildContext context) { - final List children = []; - _tasks.forEach((StorageUploadTask task) { - final Widget tile = UploadTaskListTile( - task: task, - onDismissed: () => setState(() => _tasks.remove(task)), - onDownload: () => _downloadFile(task.lastSnapshot.ref), - ); - children.add(tile); - }); - return Scaffold( - key: _scaffoldKey, - appBar: AppBar( - title: const Text('Flutter Storage Example'), - actions: [ - IconButton( - icon: const Icon(Icons.clear_all), - onPressed: - _tasks.isNotEmpty ? () => setState(() => _tasks.clear()) : null, - ) - ], - ), - body: ListView( - children: children, - ), - floatingActionButton: FloatingActionButton( - onPressed: _uploadFile, - tooltip: 'Upload', - child: const Icon(Icons.file_upload), - ), - ); - } -} - -class UploadTaskListTile extends StatelessWidget { - const UploadTaskListTile( - {Key key, this.task, this.onDismissed, this.onDownload}) - : super(key: key); - - final StorageUploadTask task; - final VoidCallback onDismissed; - final VoidCallback onDownload; - - String get status { - String result; - if (task.isComplete) { - if (task.isSuccessful) { - result = 'Complete'; - } else if (task.isCanceled) { - result = 'Canceled'; - } else { - result = 'Failed ERROR: ${task.lastSnapshot.error}'; - } - } else if (task.isInProgress) { - result = 'Uploading'; - } else if (task.isPaused) { - result = 'Paused'; - } - return result; - } - - String _bytesTransferred(StorageTaskSnapshot snapshot) { - return '${snapshot.bytesTransferred}/${snapshot.totalByteCount}'; - } - - @override - Widget build(BuildContext context) { - return StreamBuilder( - stream: task.events, - builder: (BuildContext context, - AsyncSnapshot asyncSnapshot) { - Widget subtitle; - if (asyncSnapshot.hasData) { - final StorageTaskEvent event = asyncSnapshot.data; - final StorageTaskSnapshot snapshot = event.snapshot; - subtitle = Text('$status: ${_bytesTransferred(snapshot)} bytes sent'); - } else { - subtitle = const Text('Starting...'); - } - return Dismissible( - key: Key(task.hashCode.toString()), - onDismissed: (_) => onDismissed(), - child: ListTile( - title: Text('Upload Task #${task.hashCode}'), - subtitle: subtitle, - trailing: Row( - mainAxisSize: MainAxisSize.min, - children: [ - Offstage( - offstage: !task.isInProgress, - child: IconButton( - icon: const Icon(Icons.pause), - onPressed: () => task.pause(), - ), - ), - Offstage( - offstage: !task.isPaused, - child: IconButton( - icon: const Icon(Icons.file_upload), - onPressed: () => task.resume(), - ), - ), - Offstage( - offstage: task.isComplete, - child: IconButton( - icon: const Icon(Icons.cancel), - onPressed: () => task.cancel(), - ), - ), - Offstage( - offstage: !(task.isComplete && task.isSuccessful), - child: IconButton( - icon: const Icon(Icons.file_download), - onPressed: onDownload, - ), - ), - ], - ), - ), - ); - }, - ); - } -} diff --git a/firebase_storage/example/pubspec.yaml b/firebase_storage/example/pubspec.yaml deleted file mode 100755 index 9301adf..0000000 --- a/firebase_storage/example/pubspec.yaml +++ /dev/null @@ -1,23 +0,0 @@ -name: firebase_storage_example -description: Demonstrates how to use the firebase_storage plugin. -author: Flutter Team - -dependencies: - flutter: - sdk: flutter - firebase_storage: - path: ../ - firebase_core: ^0.3.0 - uuid: "^1.0.0" - http: ^0.12.0 - -dev_dependencies: - flutter_test: - sdk: flutter - flutter_driver: - sdk: flutter - test: any - -flutter: - uses-material-design: true - diff --git a/firebase_storage/example/test_driver/firebase_storage.dart b/firebase_storage/example/test_driver/firebase_storage.dart deleted file mode 100644 index 6771921..0000000 --- a/firebase_storage/example/test_driver/firebase_storage.dart +++ /dev/null @@ -1,60 +0,0 @@ -import 'dart:async'; -import 'dart:io'; -import 'package:http/http.dart' as http; -import 'package:flutter_driver/driver_extension.dart'; -import 'package:flutter_test/flutter_test.dart'; -import 'package:firebase_storage/firebase_storage.dart'; -import 'package:uuid/uuid.dart'; - -void main() { - final Completer completer = Completer(); - enableFlutterDriverExtension(handler: (_) => completer.future); - tearDownAll(() => completer.complete(null)); - - group('$FirebaseStorage', () { - const String kTestString = 'hello world'; - FirebaseStorage firebaseStorage; - - setUp(() async { - firebaseStorage = FirebaseStorage(); - }); - - test('putFile, getDownloadURL, writeToFile', () async { - final String uuid = Uuid().v1(); - final Directory systemTempDir = Directory.systemTemp; - final File file = - await File('${systemTempDir.path}/foo$uuid.txt').create(); - await file.writeAsString(kTestString); - final StorageReference ref = - firebaseStorage.ref().child('text').child('foo$uuid.txt'); - expect(await ref.getName(), 'foo$uuid.txt'); - expect(await ref.getPath(), 'text/foo$uuid.txt'); - final StorageUploadTask uploadTask = ref.putFile( - file, - StorageMetadata( - contentLanguage: 'en', - customMetadata: {'activity': 'test'}, - ), - ); - final StorageTaskSnapshot complete = await uploadTask.onComplete; - expect(complete.storageMetadata.sizeBytes, kTestString.length); - expect(complete.storageMetadata.contentLanguage, 'en'); - expect(complete.storageMetadata.customMetadata['activity'], 'test'); - - final String url = await ref.getDownloadURL(); - final http.Response downloadData = await http.get(url); - expect(downloadData.body, kTestString); - final File tempFile = File('${systemTempDir.path}/tmp$uuid.txt'); - if (tempFile.existsSync()) { - await tempFile.delete(); - } - await tempFile.create(); - expect(await tempFile.readAsString(), ''); - final StorageFileDownloadTask task = ref.writeToFile(tempFile); - final int byteCount = (await task.future).totalByteCount; - final String tempFileContents = await tempFile.readAsString(); - expect(tempFileContents, kTestString); - expect(byteCount, kTestString.length); - }); - }); -} diff --git a/firebase_storage/example/test_driver/firebase_storage_test.dart b/firebase_storage/example/test_driver/firebase_storage_test.dart deleted file mode 100644 index 38fe6c4..0000000 --- a/firebase_storage/example/test_driver/firebase_storage_test.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:flutter_driver/flutter_driver.dart'; - -Future main() async { - final FlutterDriver driver = await FlutterDriver.connect(); - await driver.requestData(null, timeout: const Duration(minutes: 1)); - driver.close(); -} diff --git a/firebase_storage/ios/Assets/.gitkeep b/firebase_storage/ios/Assets/.gitkeep deleted file mode 100755 index e69de29..0000000 diff --git a/firebase_storage/ios/Classes/FirebaseStoragePlugin.h b/firebase_storage/ios/Classes/FirebaseStoragePlugin.h deleted file mode 100644 index 4c7a7df..0000000 --- a/firebase_storage/ios/Classes/FirebaseStoragePlugin.h +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import - -@interface FLTFirebaseStoragePlugin : NSObject -@end diff --git a/firebase_storage/ios/Classes/FirebaseStoragePlugin.m b/firebase_storage/ios/Classes/FirebaseStoragePlugin.m deleted file mode 100644 index ced82f7..0000000 --- a/firebase_storage/ios/Classes/FirebaseStoragePlugin.m +++ /dev/null @@ -1,442 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#import "FirebaseStoragePlugin.h" - -#import - -static FlutterError *getFlutterError(NSError *error) { - return [FlutterError errorWithCode:[NSString stringWithFormat:@"Error %ld", (long)error.code] - message:error.domain - details:error.localizedDescription]; -} - -@interface FLTFirebaseStoragePlugin () -@property(nonatomic, retain) FlutterMethodChannel *channel; -@end - -@implementation FLTFirebaseStoragePlugin { - NSMutableDictionary *> *_storageMap; - FIRStorage *storage; - int _nextUploadHandle; - NSMutableDictionary *_uploadTasks; -} - -+ (void)registerWithRegistrar:(NSObject *)registrar { - FlutterMethodChannel *channel = - [FlutterMethodChannel methodChannelWithName:@"plugins.flutter.io/firebase_storage" - binaryMessenger:[registrar messenger]]; - FLTFirebaseStoragePlugin *instance = [[FLTFirebaseStoragePlugin alloc] init]; - instance.channel = channel; - [registrar addMethodCallDelegate:instance channel:channel]; -} - -- (instancetype)init { - self = [super init]; - if (self) { - if (![FIRApp appNamed:@"__FIRAPP_DEFAULT"]) { - NSLog(@"Configuring the default Firebase app..."); - [FIRApp configure]; - NSLog(@"Configured the default Firebase app %@.", [FIRApp defaultApp].name); - } - _storageMap = [[NSMutableDictionary alloc] init]; - _uploadTasks = [NSMutableDictionary dictionary]; - _nextUploadHandle = 0; - } - return self; -} - -- (void)handleMethodCall:(FlutterMethodCall *)call result:(FlutterResult)result { - storage = [self getStorage:call result:result]; - if ([@"FirebaseStorage#getMaxDownloadRetryTime" isEqualToString:call.method]) { - result(@((int64_t)(storage.maxDownloadRetryTime * 1000.0))); - } else if ([@"FirebaseStorage#getMaxUploadRetryTime" isEqualToString:call.method]) { - result(@((int64_t)(storage.maxUploadRetryTime * 1000.0))); - } else if ([@"FirebaseStorage#getMaxOperationRetryTime" isEqualToString:call.method]) { - result(@((int64_t)(storage.maxOperationRetryTime * 1000.0))); - } else if ([@"FirebaseStorage#setMaxDownloadRetryTime" isEqualToString:call.method]) { - [self setMaxDownloadRetryTime:call result:result]; - } else if ([@"FirebaseStorage#setMaxUploadRetryTime" isEqualToString:call.method]) { - [self setMaxUploadRetryTime:call result:result]; - } else if ([@"FirebaseStorage#setMaxOperationRetryTime" isEqualToString:call.method]) { - [self setMaxOperationRetryTime:call result:result]; - } else if ([@"FirebaseStorage#getReferenceFromUrl" isEqualToString:call.method]) { - [self getReferenceFromUrl:call result:result]; - } else if ([@"StorageReference#putFile" isEqualToString:call.method]) { - [self putFile:call result:result]; - } else if ([@"StorageReference#putData" isEqualToString:call.method]) { - [self putData:call result:result]; - } else if ([@"StorageReference#getData" isEqualToString:call.method]) { - [self getData:call result:result]; - } else if ([@"StorageReference#getBucket" isEqualToString:call.method]) { - [self getBucket:call result:result]; - } else if ([@"StorageReference#getPath" isEqualToString:call.method]) { - [self getPath:call result:result]; - } else if ([@"StorageReference#getName" isEqualToString:call.method]) { - [self getName:call result:result]; - } else if ([@"StorageReference#getDownloadUrl" isEqualToString:call.method]) { - [self getDownloadUrl:call result:result]; - } else if ([@"StorageReference#delete" isEqualToString:call.method]) { - [self delete:call result:result]; - } else if ([@"StorageReference#getMetadata" isEqualToString:call.method]) { - [self getMetadata:call result:result]; - } else if ([@"StorageReference#updateMetadata" isEqualToString:call.method]) { - [self updateMetadata:call result:result]; - } else if ([@"StorageReference#writeToFile" isEqualToString:call.method]) { - [self writeToFile:call result:result]; - } else if ([@"UploadTask#pause" isEqualToString:call.method]) { - [self pauseUploadTask:call result:result]; - } else if ([@"UploadTask#resume" isEqualToString:call.method]) { - [self resumeUploadTask:call result:result]; - } else if ([@"UploadTask#cancel" isEqualToString:call.method]) { - [self cancelUploadTask:call result:result]; - } else { - result(FlutterMethodNotImplemented); - } -} - -// Returns a [FIRStorage] instance which is a singleton given a fixed app and bucket. -// This is to be consistent with the Android API so that repated calls to getters/setters -// affect the right [FIRStorage] instance. -- (FIRStorage *)getStorage:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *appName = call.arguments[@"app"]; - NSString *bucketUrl = call.arguments[@"bucket"]; - FIRApp *app; - - if ([appName isEqual:[NSNull null]]) { - app = [FIRApp defaultApp]; - } else { - app = [FIRApp appNamed:appName]; - } - - if ([bucketUrl isEqual:[NSNull null]]) { - if (app.options.storageBucket) { - bucketUrl = [app.options.storageBucket isEqualToString:@""] - ? @"" - : [@"gs://" stringByAppendingString:app.options.storageBucket]; - } else { - bucketUrl = nil; - } - } - - NSURL *url = [NSURL URLWithString:bucketUrl]; - if (!url) { - @try { - // Call storage constructor to raise proper exception. - storage = [FIRStorage storageForApp:app URL:bucketUrl]; - } @catch (NSException *exception) { - result([FlutterError errorWithCode:@"storage_error" - message:[exception name] - details:[exception reason]]); - } - } - - NSMutableDictionary *bucketMap = _storageMap[app.name]; - if (!bucketMap) { - bucketMap = [NSMutableDictionary dictionaryWithCapacity:1]; - _storageMap[app.name] = bucketMap; - } - - NSString *bucketName = [url host]; - FIRStorage *storage = bucketMap[bucketName]; - if (!storage) { - // Raises an exception if bucketUrl is invalid. - @try { - storage = [FIRStorage storageForApp:app URL:bucketUrl]; - } @catch (NSException *exception) { - result([FlutterError errorWithCode:@"storage_error" - message:[exception name] - details:[exception reason]]); - } - bucketMap[bucketName] = storage; - } - - return storage; -} - -- (void)setMaxDownloadRetryTime:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *time = call.arguments[@"time"]; - storage.maxDownloadRetryTime = [time longLongValue] / 1000.0; - result(nil); -} - -- (void)setMaxUploadRetryTime:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *time = call.arguments[@"time"]; - storage.maxUploadRetryTime = [time longLongValue] / 1000.0; - result(nil); -} - -- (void)setMaxOperationRetryTime:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *time = call.arguments[@"time"]; - storage.maxOperationRetryTime = [time longLongValue] / 1000.0; - result(nil); -} - -- (void)getReferenceFromUrl:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *fullUrl = call.arguments[@"fullUrl"]; - result([storage referenceForURL:fullUrl].fullPath); -} - -- (void)putFile:(FlutterMethodCall *)call result:(FlutterResult)result { - NSData *data = [NSData dataWithContentsOfFile:call.arguments[@"filename"]]; - [self put:data call:call result:result]; -} - -- (void)putData:(FlutterMethodCall *)call result:(FlutterResult)result { - NSData *data = [(FlutterStandardTypedData *)call.arguments[@"data"] data]; - [self put:data call:call result:result]; -} - -- (void)put:(NSData *)data call:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - NSDictionary *metadataDictionary = call.arguments[@"metadata"]; - FIRStorageMetadata *metadata; - if (![metadataDictionary isEqual:[NSNull null]]) { - metadata = [self buildMetadataFromDictionary:metadataDictionary]; - } - FIRStorageReference *fileRef = [storage.reference child:path]; - FIRStorageUploadTask *uploadTask = [fileRef putData:data metadata:metadata]; - NSNumber *handle = [NSNumber numberWithInt:_nextUploadHandle++]; - [uploadTask observeStatus:FIRStorageTaskStatusSuccess - handler:^(FIRStorageTaskSnapshot *snapshot) { - [self invokeStorageTaskEvent:handle type:kSuccess snapshot:snapshot]; - [self->_uploadTasks removeObjectForKey:handle]; - }]; - [uploadTask observeStatus:FIRStorageTaskStatusProgress - handler:^(FIRStorageTaskSnapshot *snapshot) { - [self invokeStorageTaskEvent:handle type:kProgress snapshot:snapshot]; - }]; - [uploadTask observeStatus:FIRStorageTaskStatusResume - handler:^(FIRStorageTaskSnapshot *snapshot) { - [self invokeStorageTaskEvent:handle type:kResume snapshot:snapshot]; - }]; - [uploadTask observeStatus:FIRStorageTaskStatusPause - handler:^(FIRStorageTaskSnapshot *snapshot) { - [self invokeStorageTaskEvent:handle type:kPause snapshot:snapshot]; - }]; - [uploadTask observeStatus:FIRStorageTaskStatusFailure - handler:^(FIRStorageTaskSnapshot *snapshot) { - [self invokeStorageTaskEvent:handle type:kFailure snapshot:snapshot]; - [self->_uploadTasks removeObjectForKey:handle]; - }]; - _uploadTasks[handle] = uploadTask; - result(handle); -} - -typedef NS_ENUM(NSUInteger, StorageTaskEventType) { - kResume, - kProgress, - kPause, - kSuccess, - kFailure -}; - -- (void)invokeStorageTaskEvent:(NSNumber *)handle - type:(StorageTaskEventType)type - snapshot:(FIRStorageTaskSnapshot *)snapshot { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - [dictionary setValue:handle forKey:@"handle"]; - [dictionary setValue:@((int)type) forKey:@"type"]; - [dictionary setValue:[self buildDictionaryFromTaskSnapshot:snapshot] forKey:@"snapshot"]; - [self.channel invokeMethod:@"StorageTaskEvent" arguments:dictionary]; -} - -- (NSDictionary *)buildDictionaryFromTaskSnapshot:(FIRStorageTaskSnapshot *)snapshot { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - [dictionary setValue:@((long)([snapshot.progress completedUnitCount])) - forKey:@"bytesTransferred"]; - [dictionary setValue:@((long)([snapshot.progress totalUnitCount])) forKey:@"totalByteCount"]; - if ([snapshot error] != nil) { - [dictionary setValue:@((long)[snapshot.error code]) forKey:@"error"]; - } - if ([snapshot metadata] != nil) { - [dictionary setValue:[self buildDictionaryFromMetadata:snapshot.metadata] - forKey:@"storageMetadata"]; - } - return dictionary; -} - -- (FIRStorageMetadata *)buildMetadataFromDictionary:(NSDictionary *)dictionary { - FIRStorageMetadata *metadata = [[FIRStorageMetadata alloc] init]; - if (dictionary[@"cacheControl"] != [NSNull null]) - metadata.cacheControl = dictionary[@"cacheControl"]; - if (dictionary[@"contentDisposition"] != [NSNull null]) - metadata.contentDisposition = dictionary[@"contentDisposition"]; - if (dictionary[@"contentEncoding"] != [NSNull null]) - metadata.contentEncoding = dictionary[@"contentEncoding"]; - if (dictionary[@"contentLanguage"] != [NSNull null]) - metadata.contentLanguage = dictionary[@"contentLanguage"]; - if (dictionary[@"contentType"] != [NSNull null]) - metadata.contentType = dictionary[@"contentType"]; - if (dictionary[@"customMetadata"] != [NSNull null]) - metadata.customMetadata = dictionary[@"customMetadata"]; - return metadata; -} - -- (NSDictionary *)buildDictionaryFromMetadata:(FIRStorageMetadata *)metadata { - NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init]; - [dictionary setValue:[metadata bucket] forKey:@"bucket"]; - [dictionary setValue:[NSString stringWithFormat:@"%lld", [metadata generation]] - forKey:@"generation"]; - [dictionary setValue:[NSString stringWithFormat:@"%lld", [metadata metageneration]] - forKey:@"metadataGeneration"]; - [dictionary setValue:[metadata path] forKey:@"path"]; - [dictionary setValue:@((long)([[metadata timeCreated] timeIntervalSince1970] * 1000.0)) - forKey:@"creationTimeMillis"]; - [dictionary setValue:@((long)([[metadata updated] timeIntervalSince1970] * 1000.0)) - forKey:@"updatedTimeMillis"]; - [dictionary setValue:@([metadata size]) forKey:@"sizeBytes"]; - [dictionary setValue:[metadata md5Hash] forKey:@"md5Hash"]; - [dictionary setValue:[metadata cacheControl] forKey:@"cacheControl"]; - [dictionary setValue:[metadata contentDisposition] forKey:@"contentDisposition"]; - [dictionary setValue:[metadata contentEncoding] forKey:@"contentEncoding"]; - [dictionary setValue:[metadata contentLanguage] forKey:@"contentLanguage"]; - [dictionary setValue:[metadata contentType] forKey:@"contentType"]; - [dictionary setValue:[metadata name] forKey:@"name"]; - [dictionary setValue:[metadata customMetadata] forKey:@"customMetadata"]; - return dictionary; -} - -- (void)getData:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *maxSize = call.arguments[@"maxSize"]; - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - [ref dataWithMaxSize:[maxSize longLongValue] - completion:^(NSData *_Nullable data, NSError *_Nullable error) { - if (error != nil) { - result(getFlutterError(error)); - return; - } - if (data == nil) { - result(nil); - return; - } - - FlutterStandardTypedData *dartData = - [FlutterStandardTypedData typedDataWithBytes:data]; - result(dartData); - }]; -} - -- (void)writeToFile:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - NSString *filePath = call.arguments[@"filePath"]; - NSURL *localURL = [NSURL fileURLWithPath:filePath]; - FIRStorageReference *ref = [storage.reference child:path]; - FIRStorageDownloadTask *task = [ref writeToFile:localURL]; - [task observeStatus:FIRStorageTaskStatusSuccess - handler:^(FIRStorageTaskSnapshot *snapshot) { - result(@(snapshot.progress.totalUnitCount)); - }]; - [task observeStatus:FIRStorageTaskStatusFailure - handler:^(FIRStorageTaskSnapshot *snapshot) { - if (snapshot.error != nil) { - result(getFlutterError(snapshot.error)); - } - }]; -} - -- (void)getMetadata:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - [ref metadataWithCompletion:^(FIRStorageMetadata *metadata, NSError *error) { - if (error != nil) { - result(getFlutterError(error)); - } else { - result([self buildDictionaryFromMetadata:metadata]); - } - }]; -} - -- (void)updateMetadata:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - NSDictionary *metadataDictionary = call.arguments[@"metadata"]; - FIRStorageReference *ref = [storage.reference child:path]; - [ref updateMetadata:[self buildMetadataFromDictionary:metadataDictionary] - completion:^(FIRStorageMetadata *metadata, NSError *error) { - if (error != nil) { - result(getFlutterError(error)); - } else { - result([self buildDictionaryFromMetadata:metadata]); - } - }]; -} - -- (void)getBucket:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - result([ref bucket]); -} - -- (void)getName:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - result([ref name]); -} - -- (void)getPath:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - result([ref fullPath]); -} - -- (void)getDownloadUrl:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - [ref downloadURLWithCompletion:^(NSURL *URL, NSError *error) { - if (error != nil) { - result(getFlutterError(error)); - } else { - result(URL.absoluteString); - } - }]; -} - -- (void)delete:(FlutterMethodCall *)call result:(FlutterResult)result { - NSString *path = call.arguments[@"path"]; - FIRStorageReference *ref = [storage.reference child:path]; - [ref deleteWithCompletion:^(NSError *error) { - if (error != nil) { - result(getFlutterError(error)); - } else { - result(nil); - } - }]; -} - -- (void)pauseUploadTask:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *handle = call.arguments[@"handle"]; - FIRStorageUploadTask *task = [_uploadTasks objectForKey:handle]; - if (task != nil) { - [task pause]; - result(nil); - } else { - result([FlutterError errorWithCode:@"pause_error" message:@"task == null" details:nil]); - } -} - -- (void)resumeUploadTask:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *handle = call.arguments[@"handle"]; - FIRStorageUploadTask *task = [_uploadTasks objectForKey:handle]; - if (task != nil) { - [task resume]; - result(nil); - } else { - result([FlutterError errorWithCode:@"resume_error" message:@"task == null" details:nil]); - } -} - -- (void)cancelUploadTask:(FlutterMethodCall *)call result:(FlutterResult)result { - NSNumber *handle = call.arguments[@"handle"]; - FIRStorageUploadTask *task = [_uploadTasks objectForKey:handle]; - if (task != nil) { - [task cancel]; - result(nil); - } else { - result([FlutterError errorWithCode:@"cancel_error" message:@"task == null" details:nil]); - } -} - -@end diff --git a/firebase_storage/ios/firebase_storage.podspec b/firebase_storage/ios/firebase_storage.podspec deleted file mode 100755 index 1b0617b..0000000 --- a/firebase_storage/ios/firebase_storage.podspec +++ /dev/null @@ -1,21 +0,0 @@ -# -# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html -# -Pod::Spec.new do |s| - s.name = 'firebase_storage' - s.version = '0.0.1' - s.summary = 'Firebase Storage plugin for Flutter.' - s.description = <<-DESC -Firebase Storage plugin for Flutter. - DESC - s.homepage = 'https://github.com/flutter/plugins/tree/master/packages/firebase_storage' - s.license = { :file => '../LICENSE' } - s.author = { 'Flutter Team' => 'flutter-dev@googlegroups.com' } - s.source = { :path => '.' } - s.source_files = 'Classes/**/*' - s.public_header_files = 'Classes/**/*.h' - s.ios.deployment_target = '8.0' - s.dependency 'Flutter' - s.dependency 'Firebase/Storage' - s.static_framework = true -end diff --git a/firebase_storage/lib/firebase_storage.dart b/firebase_storage/lib/firebase_storage.dart deleted file mode 100755 index d37af7f..0000000 --- a/firebase_storage/lib/firebase_storage.dart +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -library firebase_storage; - -import 'dart:async'; -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:flutter/services.dart'; - -part 'src/error.dart'; -part 'src/event.dart'; -part 'src/firebase_storage.dart'; -part 'src/storage_metadata.dart'; -part 'src/storage_reference.dart'; -part 'src/upload_task.dart'; diff --git a/firebase_storage/lib/src/error.dart b/firebase_storage/lib/src/error.dart deleted file mode 100644 index 62b66d3..0000000 --- a/firebase_storage/lib/src/error.dart +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_storage; - -class StorageError { - static const int unknown = -13000; - static const int objectNotFound = -13010; - static const int bucketNotFound = -13011; - static const int projectNotFound = -13012; - static const int quotaExceeded = -13013; - static const int notAuthenticated = -13020; - static const int notAuthorized = -13021; - static const int retryLimitExceeded = -13030; - static const int invalidChecksum = -13031; - static const int canceled = -13040; -} diff --git a/firebase_storage/lib/src/event.dart b/firebase_storage/lib/src/event.dart deleted file mode 100644 index e4eadbc..0000000 --- a/firebase_storage/lib/src/event.dart +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_storage; - -enum StorageTaskEventType { - resume, - progress, - pause, - success, - failure, -} - -/// `Event` encapsulates a StorageTaskSnapshot -class StorageTaskEvent { - StorageTaskEvent._(int type, StorageReference ref, Map data) - : type = StorageTaskEventType.values[type], - snapshot = StorageTaskSnapshot._(ref, data); - - final StorageTaskEventType type; - final StorageTaskSnapshot snapshot; -} - -class StorageTaskSnapshot { - StorageTaskSnapshot._(this.ref, Map m) - : error = m['error'], - bytesTransferred = m['bytesTransferred'], - totalByteCount = m['totalByteCount'], - uploadSessionUri = m['uploadSessionUri'] != null - ? Uri.parse(m['uploadSessionUri']) - : null, - storageMetadata = m['storageMetadata'] != null - ? StorageMetadata._fromMap(m['storageMetadata']) - : null; - - final StorageReference ref; - final int error; - final int bytesTransferred; - final int totalByteCount; - final Uri uploadSessionUri; - final StorageMetadata storageMetadata; -} diff --git a/firebase_storage/lib/src/firebase_storage.dart b/firebase_storage/lib/src/firebase_storage.dart deleted file mode 100644 index 8fc536b..0000000 --- a/firebase_storage/lib/src/firebase_storage.dart +++ /dev/null @@ -1,179 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_storage; - -/// FirebaseStorage is a service that supports uploading and downloading large -/// objects to Google Cloud Storage. -class FirebaseStorage { - /// Returns the [FirebaseStorage] instance, initialized with a custom - /// [FirebaseApp] if [app] is specified and a custom Google Cloud Storage - /// bucket if [storageBucket] is specified. Otherwise the instance will be - /// initialized with the default [FirebaseApp]. - /// - /// The [FirebaseStorage] instance is a singleton for fixed [app] and - /// [storageBucket]. - /// - /// The [storageBucket] argument is the gs:// url to the custom Firebase - /// Storage Bucket. - /// - /// The [app] argument is the custom [FirebaseApp]. - FirebaseStorage({this.app, this.storageBucket}) { - if (_initialized) return; - channel.setMethodCallHandler((MethodCall call) async { - _methodStreamController.add(call); - }); - _initialized = true; - } - - static const MethodChannel channel = - MethodChannel('plugins.flutter.io/firebase_storage'); - - static bool _initialized = false; - - static FirebaseStorage _instance = FirebaseStorage(); - - /// The [FirebaseApp] instance to which this [FirebaseStorage] belongs. - /// - /// If null, the default [FirebaseApp] is used. - final FirebaseApp app; - - /// The Google Cloud Storage bucket to which this [FirebaseStorage] belongs. - /// - /// If null, the storage bucket of the specified [FirebaseApp] is used. - final String storageBucket; - - /// Returns the [FirebaseStorage] instance, initialized with the default - /// [FirebaseApp]. - static FirebaseStorage get instance => _instance; - - /// Used to dispatch method calls - static final StreamController _methodStreamController = - StreamController.broadcast(); // ignore: close_sinks - Stream get _methodStream => _methodStreamController.stream; - - /// Creates a new [StorageReference] initialized at the root - /// Firebase Storage location. - StorageReference ref() => StorageReference._(const [], this); - - Future getMaxDownloadRetryTimeMillis() async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await channel.invokeMethod( - "FirebaseStorage#getMaxDownloadRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - }); - } - - Future getMaxUploadRetryTimeMillis() async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await channel.invokeMethod( - "FirebaseStorage#getMaxUploadRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - }); - } - - Future getMaxOperationRetryTimeMillis() async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await channel.invokeMethod( - "FirebaseStorage#getMaxOperationRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - }); - } - - Future setMaxDownloadRetryTimeMillis(int time) { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return channel.invokeMethod( - "FirebaseStorage#setMaxDownloadRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - 'time': time, - }); - } - - Future setMaxUploadRetryTimeMillis(int time) { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return channel.invokeMethod( - "FirebaseStorage#setMaxUploadRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - 'time': time, - }); - } - - Future setMaxOperationRetryTimeMillis(int time) { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return channel.invokeMethod( - "FirebaseStorage#setMaxOperationRetryTime", { - 'app': app?.name, - 'bucket': storageBucket, - 'time': time, - }); - } - - /// Creates a [StorageReference] given a gs:// or // URL pointing to a Firebase - /// Storage location. - Future getReferenceFromUrl(String fullUrl) async { - final String path = await channel.invokeMethod( - "FirebaseStorage#getReferenceFromUrl", { - 'app': app?.name, - 'bucket': storageBucket, - 'fullUrl': fullUrl - }); - if (path != null) { - return ref().child(path); - } else { - return null; - } - } -} - -/// TODO: Move into own file and build out progress functionality -class StorageFileDownloadTask { - StorageFileDownloadTask._(this._firebaseStorage, this._path, this._file); - - final FirebaseStorage _firebaseStorage; - final String _path; - final File _file; - - Future _start() async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - final int totalByteCount = await FirebaseStorage.channel.invokeMethod( - "StorageReference#writeToFile", - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'filePath': _file.absolute.path, - 'path': _path, - }, - ); - _completer - .complete(FileDownloadTaskSnapshot(totalByteCount: totalByteCount)); - } - - Completer _completer = - Completer(); - Future get future => _completer.future; -} - -class FileDownloadTaskSnapshot { - FileDownloadTaskSnapshot({this.totalByteCount}); - final int totalByteCount; -} diff --git a/firebase_storage/lib/src/storage_metadata.dart b/firebase_storage/lib/src/storage_metadata.dart deleted file mode 100644 index 2b16567..0000000 --- a/firebase_storage/lib/src/storage_metadata.dart +++ /dev/null @@ -1,95 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_storage; - -/// Metadata for a [StorageReference]. Metadata stores default attributes such as -/// size and content type. -class StorageMetadata { - StorageMetadata({ - this.cacheControl, - this.contentDisposition, - this.contentEncoding, - this.contentLanguage, - this.contentType, - Map customMetadata, - }) : bucket = null, - generation = null, - metadataGeneration = null, - path = null, - name = null, - sizeBytes = null, - creationTimeMillis = null, - updatedTimeMillis = null, - md5Hash = null, - customMetadata = customMetadata == null - ? null - : Map.unmodifiable(customMetadata); - - StorageMetadata._fromMap(Map map) - : bucket = map['bucket'], - generation = map['generation'], - metadataGeneration = map['metadataGeneration'], - path = map['path'], - name = map['name'], - sizeBytes = map['sizeBytes'], - creationTimeMillis = map['creationTimeMillis'], - updatedTimeMillis = map['updatedTimeMillis'], - md5Hash = map['md5Hash'], - cacheControl = map['cacheControl'], - contentDisposition = map['contentDisposition'], - contentLanguage = map['contentLanguage'], - contentType = map['contentType'], - contentEncoding = map['contentEncoding'], - customMetadata = map['customMetadata'] == null - ? null - : Map.unmodifiable( - map['customMetadata'].cast()); - - /// The owning Google Cloud Storage bucket for the [StorageReference]. - final String bucket; - - /// A version String indicating what version of the [StorageReference]. - final String generation; - - /// A version String indicating the version of this [StorageMetadata]. - final String metadataGeneration; - - /// The path of the [StorageReference] object. - final String path; - - /// A simple name of the [StorageReference] object. - final String name; - - /// The stored Size in bytes of the [StorageReference] object. - final int sizeBytes; - - /// The time the [StorageReference] was created in milliseconds since the epoch. - final int creationTimeMillis; - - /// The time the [StorageReference] was last updated in milliseconds since the epoch. - final int updatedTimeMillis; - - /// The MD5Hash of the [StorageReference] object. - final String md5Hash; - - /// The Cache Control setting of the [StorageReference]. - final String cacheControl; - - /// The content disposition of the [StorageReference]. - final String contentDisposition; - - /// The content encoding for the [StorageReference]. - final String contentEncoding; - - /// The content language for the StorageReference, specified as a 2-letter - /// lowercase language code defined by ISO 639-1. - final String contentLanguage; - - /// The content type (MIME type) of the [StorageReference]. - final String contentType; - - /// An unmodifiable map with custom metadata for the [StorageReference]. - final Map customMetadata; -} diff --git a/firebase_storage/lib/src/storage_reference.dart b/firebase_storage/lib/src/storage_reference.dart deleted file mode 100644 index 0325c9e..0000000 --- a/firebase_storage/lib/src/storage_reference.dart +++ /dev/null @@ -1,204 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_storage; - -class StorageReference { - const StorageReference._(this._pathComponents, this._firebaseStorage); - - final FirebaseStorage _firebaseStorage; - final List _pathComponents; - - /// Returns a new instance of [StorageReference] pointing to a child - /// location of the current reference. - StorageReference child(String path) { - final List childPath = List.from(_pathComponents) - ..addAll(path.split("/")); - return StorageReference._(childPath, _firebaseStorage); - } - - /// Returns a new instance of [StorageReference] pointing to the parent - /// location or null if this instance references the root location. - StorageReference getParent() { - if (_pathComponents.isEmpty || - _pathComponents.every((String e) => e.isEmpty)) { - return null; - } - - final List parentPath = List.from(_pathComponents); - // Trim for trailing empty path components that can - // come from trailing slashes in the path. - while (parentPath.last.isEmpty) { - parentPath.removeLast(); - } - parentPath.removeLast(); - - return StorageReference._(parentPath, _firebaseStorage); - } - - /// Returns a new instance of [StorageReference] pointing to the root location. - StorageReference getRoot() { - return StorageReference._([], _firebaseStorage); - } - - /// Returns the [FirebaseStorage] service which created this reference. - FirebaseStorage getStorage() { - return _firebaseStorage; - } - - /// This method is deprecated. Please use [putFile] instead. - /// - /// Asynchronously uploads a file to the currently specified - /// [StorageReference], with an optional [metadata]. - @deprecated - StorageUploadTask put(File file, [StorageMetadata metadata]) { - return putFile(file, metadata); - } - - /// Asynchronously uploads a file to the currently specified - /// [StorageReference], with an optional [metadata]. - StorageUploadTask putFile(File file, [StorageMetadata metadata]) { - final _StorageFileUploadTask task = - _StorageFileUploadTask._(file, _firebaseStorage, this, metadata); - task._start(); - return task; - } - - /// Asynchronously uploads byte data to the currently specified - /// [StorageReference], with an optional [metadata]. - StorageUploadTask putData(Uint8List data, [StorageMetadata metadata]) { - final StorageUploadTask task = - _StorageDataUploadTask._(data, _firebaseStorage, this, metadata); - task._start(); - return task; - } - - /// Returns the Google Cloud Storage bucket that holds this object. - Future getBucket() async { - return await FirebaseStorage.channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod("StorageReference#getBucket", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - }); - } - - /// Returns the full path to this object, not including the Google Cloud - /// Storage bucket. - Future getPath() async { - return await FirebaseStorage.channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod("StorageReference#getPath", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - }); - } - - /// Returns the short name of this object. - Future getName() async { - return await FirebaseStorage.channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod("StorageReference#getName", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - }); - } - - /// Asynchronously downloads the object at the StorageReference to a list in memory. - /// A list of the provided max size will be allocated. - Future getData(int maxSize) async { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return await FirebaseStorage.channel.invokeMethod( - "StorageReference#getData", - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'maxSize': maxSize, - 'path': _pathComponents.join("/"), - }, - ); - } - - /// Asynchronously downloads the object at this [StorageReference] to a - /// specified system file. - StorageFileDownloadTask writeToFile(File file) { - final StorageFileDownloadTask task = StorageFileDownloadTask._( - _firebaseStorage, _pathComponents.join("/"), file); - task._start(); - return task; - } - - /// Asynchronously retrieves a long lived download URL with a revokable token. - /// This can be used to share the file with others, but can be revoked by a - /// developer in the Firebase Console if desired. - Future getDownloadURL() async { - return await FirebaseStorage.channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod("StorageReference#getDownloadUrl", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - }); - } - - Future delete() { - return FirebaseStorage.channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod("StorageReference#delete", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/") - }); - } - - /// Retrieves metadata associated with an object at this [StorageReference]. - Future getMetadata() async { - return StorageMetadata._fromMap(await FirebaseStorage.channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod("StorageReference#getMetadata", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - })); - } - - /// Updates the metadata associated with this [StorageReference]. - /// - /// Returns a [Future] that will complete to the updated [StorageMetadata]. - /// - /// This method ignores fields of [metadata] that cannot be set by the public - /// [StorageMetadata] constructor. Writable metadata properties can be deleted - /// by passing the empty string. - Future updateMetadata(StorageMetadata metadata) async { - return StorageMetadata._fromMap(await FirebaseStorage.channel - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - .invokeMethod("StorageReference#updateMetadata", { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'path': _pathComponents.join("/"), - 'metadata': metadata == null ? null : _buildMetadataUploadMap(metadata), - })); - } - - String get path => _pathComponents.join('/'); -} diff --git a/firebase_storage/lib/src/upload_task.dart b/firebase_storage/lib/src/upload_task.dart deleted file mode 100644 index be43258..0000000 --- a/firebase_storage/lib/src/upload_task.dart +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -part of firebase_storage; - -abstract class StorageUploadTask { - StorageUploadTask._(this._firebaseStorage, this._ref, this._metadata); - - final FirebaseStorage _firebaseStorage; - final StorageReference _ref; - final StorageMetadata _metadata; - - Future _platformStart(); - - int _handle; - - bool isCanceled = false; - bool isComplete = false; - bool isInProgress = true; - bool isPaused = false; - bool isSuccessful = false; - - StorageTaskSnapshot lastSnapshot; - - /// Returns a last snapshot when completed - Completer _completer = Completer(); - Future get onComplete => _completer.future; - - StreamController _controller = - StreamController.broadcast(); - Stream get events => _controller.stream; - - Future _start() async { - _handle = await _platformStart(); - final StorageTaskEvent event = await _firebaseStorage._methodStream - .where((MethodCall m) { - return m.method == 'StorageTaskEvent' && m.arguments['handle'] == _handle; - }).map((MethodCall m) { - final Map args = m.arguments; - final StorageTaskEvent e = - StorageTaskEvent._(args['type'], _ref, args['snapshot']); - _changeState(e); - lastSnapshot = e.snapshot; - _controller.add(e); - if (e.type == StorageTaskEventType.success || - e.type == StorageTaskEventType.failure) { - _completer.complete(e.snapshot); - } - return e; - }).firstWhere((StorageTaskEvent e) => - e.type == StorageTaskEventType.success || - e.type == StorageTaskEventType.failure); - return event.snapshot; - } - - void _changeState(StorageTaskEvent event) { - _resetState(); - print('EVENT ${event.type}'); - switch (event.type) { - case StorageTaskEventType.progress: - isInProgress = true; - break; - case StorageTaskEventType.resume: - isInProgress = true; - break; - case StorageTaskEventType.pause: - isPaused = true; - break; - case StorageTaskEventType.success: - isSuccessful = true; - isComplete = true; - break; - case StorageTaskEventType.failure: - isComplete = true; - if (event.snapshot.error == StorageError.canceled) { - isCanceled = true; - } - break; - } - } - - void _resetState() { - isCanceled = false; - isComplete = false; - isInProgress = false; - isPaused = false; - isSuccessful = false; - } - - /// Pause the upload - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - void pause() => FirebaseStorage.channel.invokeMethod( - 'UploadTask#pause', - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'handle': _handle, - }, - ); - - /// Resume the upload - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - void resume() => FirebaseStorage.channel.invokeMethod( - 'UploadTask#resume', - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'handle': _handle, - }, - ); - - /// Cancel the upload - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - void cancel() => FirebaseStorage.channel.invokeMethod( - 'UploadTask#cancel', - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'handle': _handle, - }, - ); -} - -class _StorageFileUploadTask extends StorageUploadTask { - _StorageFileUploadTask._(this._file, FirebaseStorage firebaseStorage, - StorageReference ref, StorageMetadata metadata) - : super._(firebaseStorage, ref, metadata); - - final File _file; - - @override - Future _platformStart() { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return FirebaseStorage.channel.invokeMethod( - 'StorageReference#putFile', - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'filename': _file.absolute.path, - 'path': _ref.path, - 'metadata': - _metadata == null ? null : _buildMetadataUploadMap(_metadata), - }, - ); - } -} - -class _StorageDataUploadTask extends StorageUploadTask { - _StorageDataUploadTask._(this._bytes, FirebaseStorage firebaseStorage, - StorageReference ref, StorageMetadata metadata) - : super._(firebaseStorage, ref, metadata); - - final Uint8List _bytes; - - @override - Future _platformStart() { - // TODO(amirh): remove this on when the invokeMethod update makes it to stable Flutter. - // https://github.com/flutter/flutter/issues/26431 - // ignore: strong_mode_implicit_dynamic_method - return FirebaseStorage.channel.invokeMethod( - 'StorageReference#putData', - { - 'app': _firebaseStorage.app?.name, - 'bucket': _firebaseStorage.storageBucket, - 'data': _bytes, - 'path': _ref.path, - 'metadata': - _metadata == null ? null : _buildMetadataUploadMap(_metadata), - }, - ); - } -} - -Map _buildMetadataUploadMap(StorageMetadata metadata) { - return { - 'cacheControl': metadata.cacheControl, - 'contentDisposition': metadata.contentDisposition, - 'contentLanguage': metadata.contentLanguage, - 'contentType': metadata.contentType, - 'contentEncoding': metadata.contentEncoding, - 'customMetadata': metadata.customMetadata, - }; -} diff --git a/firebase_storage/pubspec.yaml b/firebase_storage/pubspec.yaml deleted file mode 100755 index ff2e6ef..0000000 --- a/firebase_storage/pubspec.yaml +++ /dev/null @@ -1,30 +0,0 @@ -name: firebase_storage -description: Flutter plugin for Firebase Cloud Storage, a powerful, simple, and - cost-effective object storage service for Android and iOS. -author: Flutter Team -homepage: https://github.com/flutter/plugins/tree/master/packages/firebase_storage -version: 2.1.1 - -flutter: - plugin: - androidPackage: io.flutter.plugins.firebase.storage - iosPrefix: FLT - pluginClass: FirebaseStoragePlugin - -dependencies: - flutter: - sdk: flutter - firebase_core: ^0.3.0 - -dev_dependencies: - http: ^0.12.0 - flutter_test: - sdk: flutter - uuid: "^1.0.0" - flutter_driver: - sdk: flutter - test: any - -environment: - sdk: ">=2.0.0-dev.28.0 <3.0.0" - flutter: ">=0.1.4 <2.0.0" diff --git a/firebase_storage/test/firebase_storage_test.dart b/firebase_storage/test/firebase_storage_test.dart deleted file mode 100644 index c03288d..0000000 --- a/firebase_storage/test/firebase_storage_test.dart +++ /dev/null @@ -1,530 +0,0 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import 'dart:async'; -import 'dart:typed_data'; - -import 'package:firebase_core/firebase_core.dart'; -import 'package:firebase_storage/firebase_storage.dart'; -import 'package:flutter/services.dart'; -import 'package:flutter_test/flutter_test.dart'; - -void main() { - group('FirebaseStorage', () { - final FirebaseApp app = const FirebaseApp( - name: 'testApp', - ); - final String storageBucket = 'gs://fake-storage-bucket-url.com'; - final FirebaseStorage storage = - FirebaseStorage(app: app, storageBucket: storageBucket); - - group('getMaxDownloadRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 1000; - }); - }); - - test('invokes correct method', () async { - await storage.getMaxDownloadRetryTimeMillis(); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#getMaxDownloadRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await storage.getMaxDownloadRetryTimeMillis(), 1000); - }); - }); - - group('getMaxUploadRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 2000; - }); - }); - - test('invokes correct method', () async { - await storage.getMaxUploadRetryTimeMillis(); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#getMaxUploadRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await storage.getMaxUploadRetryTimeMillis(), 2000); - }); - }); - - group('getMaxOperationRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 3000; - }); - }); - - test('invokes correct method', () async { - await storage.getMaxOperationRetryTimeMillis(); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#getMaxOperationRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await storage.getMaxOperationRetryTimeMillis(), 3000); - }); - }); - - group('setMaxDownloadRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - }); - }); - - test('invokes correct method', () async { - await storage.setMaxDownloadRetryTimeMillis(1000); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#setMaxDownloadRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'time': 1000, - }, - ), - ]); - }); - }); - - group('setMaxUploadRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - }); - }); - - test('invokes correct method', () async { - await storage.setMaxUploadRetryTimeMillis(2000); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#setMaxUploadRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'time': 2000, - }, - ), - ]); - }); - }); - - group('setMaxOperationRetryTimeMillis', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - }); - }); - - test('invokes correct method', () async { - await storage.setMaxOperationRetryTimeMillis(3000); - - expect(log, [ - isMethodCall( - 'FirebaseStorage#setMaxOperationRetryTime', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'time': 3000, - }, - ), - ]); - }); - }); - - group('getReferenceFromUrl', () { - final List log = []; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 'foo'; - }); - }); - - test('invokes correct method', () async { - final String url = - 'https://firebasestorage.googleapis.com/v0/b/fake-21c50.appspot.com/o/'; - final StorageReference reference = - await storage.getReferenceFromUrl(url); - expect(reference.path, 'foo'); - expect(log, [ - isMethodCall( - 'FirebaseStorage#getReferenceFromUrl', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'fullUrl': url, - }, - ), - ]); - }); - }); - - group('StorageReference', () { - group('getData', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) { - log.add(methodCall); - return Future.value( - Uint8List.fromList([1, 2, 3, 4])); - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getData(10); - - expect(log, [ - isMethodCall( - 'StorageReference#getData', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'maxSize': 10, - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await ref.getData(10), - equals(Uint8List.fromList([1, 2, 3, 4]))); - }); - }); - - group('getMetadata', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return {'name': 'image.jpg'}; - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getMetadata(); - - expect(log, [ - isMethodCall( - 'StorageReference#getMetadata', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect((await ref.getMetadata()).name, 'image.jpg'); - }); - }); - - group('updateMetadata', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - switch (methodCall.method) { - case 'StorageReference#getMetadata': - return { - 'name': 'image.jpg', - }; - case 'StorageReference#updateMetadata': - return { - 'name': 'image.jpg', - 'contentLanguage': 'en', - 'customMetadata': {'activity': 'test'}, - }; - default: - return null; - } - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.updateMetadata(StorageMetadata( - contentLanguage: 'en', - customMetadata: {'activity': 'test'}, - )); - - expect(log, [ - isMethodCall( - 'StorageReference#updateMetadata', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - 'metadata': { - 'cacheControl': null, - 'contentDisposition': null, - 'contentLanguage': 'en', - 'contentType': null, - 'contentEncoding': null, - 'customMetadata': {'activity': 'test'}, - }, - }, - ), - ]); - }); - - test('returns correct result', () async { - expect((await ref.getMetadata()).contentLanguage, null); - expect( - (await ref.updateMetadata(StorageMetadata(contentLanguage: 'en'))) - .contentLanguage, - 'en'); - }); - }); - - group('getDownloadUrl', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 'https://path/to/file'; - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getDownloadURL(); - - expect(log, [ - isMethodCall( - 'StorageReference#getDownloadUrl', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await ref.getDownloadURL(), 'https://path/to/file'); - }); - }); - - group('delete', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return null; - }); - ref = storage.ref().child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.delete(); - - expect( - log, - [ - isMethodCall( - 'StorageReference#delete', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'image.jpg', - }, - ), - ], - ); - }); - }); - - group('getBucket', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 'foo'; - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getBucket(); - - expect(log, [ - isMethodCall( - 'StorageReference#getBucket', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await ref.getBucket(), 'foo'); - }); - }); - - group('getName', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 'image.jpg'; - }); - ref = - storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getName(); - - expect(log, [ - isMethodCall( - 'StorageReference#getName', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await ref.getName(), 'image.jpg'); - }); - }); - }); - - group('getPath', () { - final List log = []; - - StorageReference ref; - - setUp(() { - FirebaseStorage.channel - .setMockMethodCallHandler((MethodCall methodCall) async { - log.add(methodCall); - return 'avatars/large/image.jpg'; - }); - ref = storage.ref().child('avatars').child('large').child('image.jpg'); - }); - - test('invokes correct method', () async { - await ref.getPath(); - - expect(log, [ - isMethodCall( - 'StorageReference#getPath', - arguments: { - 'app': 'testApp', - 'bucket': 'gs://fake-storage-bucket-url.com', - 'path': 'avatars/large/image.jpg', - }, - ), - ]); - }); - - test('returns correct result', () async { - expect(await ref.getPath(), 'avatars/large/image.jpg'); - }); - }); - }); -} diff --git a/flutter-app/.flutter-plugins-dependencies b/flutter-app/.flutter-plugins-dependencies new file mode 100644 index 0000000..96f0107 --- /dev/null +++ b/flutter-app/.flutter-plugins-dependencies @@ -0,0 +1 @@ +{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"camera","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/camera-0.5.0/","dependencies":[]},{"name":"cloud_firestore","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.12.11/","dependencies":["firebase_core"]},{"name":"firebase_analytics","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-5.0.16/","dependencies":[]},{"name":"firebase_auth","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.14.0+9/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.4.5/","dependencies":[]},{"name":"firebase_messaging","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_messaging-6.0.16/","dependencies":[]},{"name":"firebase_ml_vision","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_ml_vision-0.9.9/","dependencies":[]},{"name":"firebase_storage","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_storage-3.1.6/","dependencies":["firebase_core"]},{"name":"google_sign_in","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/google_sign_in-4.5.6/","dependencies":[]},{"name":"image_picker","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker-0.6.7+14/","dependencies":[]},{"name":"path_provider","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-1.6.24/","dependencies":[]},{"name":"shared_preferences","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-0.5.12+4/","dependencies":[]},{"name":"url_launcher","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-5.7.10/","dependencies":[]}],"android":[{"name":"camera","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/camera-0.5.0/","dependencies":[]},{"name":"cloud_firestore","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/cloud_firestore-0.12.11/","dependencies":["firebase_core"]},{"name":"firebase_analytics","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics-5.0.16/","dependencies":[]},{"name":"firebase_auth","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_auth-0.14.0+9/","dependencies":["firebase_core"]},{"name":"firebase_core","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.4.5/","dependencies":[]},{"name":"firebase_messaging","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_messaging-6.0.16/","dependencies":[]},{"name":"firebase_ml_vision","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_ml_vision-0.9.9/","dependencies":[]},{"name":"firebase_storage","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_storage-3.1.6/","dependencies":["firebase_core"]},{"name":"flutter_plugin_android_lifecycle","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/flutter_plugin_android_lifecycle-1.0.11/","dependencies":[]},{"name":"google_sign_in","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/google_sign_in-4.5.6/","dependencies":[]},{"name":"image_picker","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/image_picker-0.6.7+14/","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"path_provider","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider-1.6.24/","dependencies":[]},{"name":"shared_preferences","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences-0.5.12+4/","dependencies":[]},{"name":"url_launcher","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher-5.7.10/","dependencies":[]}],"macos":[{"name":"firebase_core","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core-0.4.5/","dependencies":[]},{"name":"firebase_storage","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_storage-3.1.6/","dependencies":["firebase_core"]},{"name":"path_provider_macos","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_macos-0.0.4+6/","dependencies":[]},{"name":"shared_preferences_macos","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_macos-0.0.1+11/","dependencies":[]},{"name":"url_launcher_macos","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_macos-0.0.1+9/","dependencies":[]}],"linux":[{"name":"path_provider_linux","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_linux-0.0.1+2/","dependencies":[]},{"name":"shared_preferences_linux","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_linux-0.0.2+4/","dependencies":["path_provider_linux"]},{"name":"url_launcher_linux","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_linux-0.0.1+4/","dependencies":[]}],"windows":[{"name":"path_provider_windows","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/path_provider_windows-0.0.4+3/","dependencies":[]},{"name":"shared_preferences_windows","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_windows-0.0.1+3/","dependencies":["path_provider_windows"]},{"name":"url_launcher_windows","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_windows-0.0.1+3/","dependencies":[]}],"web":[{"name":"firebase_analytics_web","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_analytics_web-0.1.1/","dependencies":[]},{"name":"firebase_core_web","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/firebase_core_web-0.1.1+2/","dependencies":[]},{"name":"google_sign_in_web","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/google_sign_in_web-0.9.2/","dependencies":[]},{"name":"shared_preferences_web","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/shared_preferences_web-0.1.2+7/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/dmitrydyachenko/Desktop/flutter/.pub-cache/hosted/pub.dartlang.org/url_launcher_web-0.1.5+1/","dependencies":[]}]},"dependencyGraph":[{"name":"camera","dependencies":[]},{"name":"cloud_firestore","dependencies":["firebase_core"]},{"name":"firebase_analytics","dependencies":["firebase_analytics_web"]},{"name":"firebase_analytics_web","dependencies":[]},{"name":"firebase_auth","dependencies":["firebase_core"]},{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]},{"name":"firebase_messaging","dependencies":[]},{"name":"firebase_ml_vision","dependencies":[]},{"name":"firebase_storage","dependencies":["firebase_core"]},{"name":"flutter_plugin_android_lifecycle","dependencies":[]},{"name":"google_sign_in","dependencies":["google_sign_in_web"]},{"name":"google_sign_in_web","dependencies":[]},{"name":"image_picker","dependencies":["flutter_plugin_android_lifecycle"]},{"name":"path_provider","dependencies":["path_provider_macos","path_provider_linux","path_provider_windows"]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_macos","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_linux","shared_preferences_macos","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_macos","dependencies":[]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"url_launcher","dependencies":["url_launcher_web","url_launcher_linux","url_launcher_macos","url_launcher_windows"]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2020-11-19 20:41:37.002001","version":"1.22.3"} \ No newline at end of file diff --git a/flutter-app/android/app/build.gradle b/flutter-app/android/app/build.gradle index b6df786..82fdb3e 100644 --- a/flutter-app/android/app/build.gradle +++ b/flutter-app/android/app/build.gradle @@ -42,6 +42,10 @@ android { } buildTypes { + debug{ + debuggable true + signingConfig signingConfigs.debug + } release { // TODO: Add your own signing config for the release build. // Signing with the debug keys for now, so `flutter run --release` works. @@ -49,10 +53,6 @@ android { } } - aaptOptions { - noCompress "tflite" - noCompress "lite" - } } flutter { @@ -65,5 +65,4 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' } -apply plugin: 'com.google.gms.google-services' - +apply plugin: 'com.google.gms.google-services' \ No newline at end of file diff --git a/flutter-app/android/build.gradle b/flutter-app/android/build.gradle index 504aa71..b9c8362 100644 --- a/flutter-app/android/build.gradle +++ b/flutter-app/android/build.gradle @@ -5,8 +5,8 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0' - classpath 'com.google.gms:google-services:4.2.0' + classpath 'com.android.tools.build:gradle:3.5.0' + classpath 'com.google.gms:google-services:4.3.4' } } @@ -23,16 +23,9 @@ subprojects { } subprojects { project.evaluationDependsOn(':app') - project.configurations.all { - resolutionStrategy.eachDependency { details -> - if (details.requested.group == 'com.android.support' - && !details.requested.name.contains('multidex') ) { - details.useVersion "26.1.0" - } - } - } } task clean(type: Delete) { delete rootProject.buildDir } + diff --git a/flutter-app/android/gradle.properties b/flutter-app/android/gradle.properties index 08f2b5f..d2032bc 100644 --- a/flutter-app/android/gradle.properties +++ b/flutter-app/android/gradle.properties @@ -1,3 +1,4 @@ org.gradle.jvmargs=-Xmx1536M android.enableJetifier=true android.useAndroidX=true +android.enableR8=true diff --git a/flutter-app/android/gradle/wrapper/gradle-wrapper.properties b/flutter-app/android/gradle/wrapper/gradle-wrapper.properties index 2819f02..044b9cf 100644 --- a/flutter-app/android/gradle/wrapper/gradle-wrapper.properties +++ b/flutter-app/android/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jun 23 08:50:38 CEST 2017 +#Sun Oct 11 19:08:41 EEST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.2-all.zip diff --git a/flutter-app/android/settings.gradle b/flutter-app/android/settings.gradle index 5a2f14f..44e62bc 100644 --- a/flutter-app/android/settings.gradle +++ b/flutter-app/android/settings.gradle @@ -1,15 +1,11 @@ include ':app' -def flutterProjectRoot = rootProject.projectDir.parentFile.toPath() +def localPropertiesFile = new File(rootProject.projectDir, "local.properties") +def properties = new Properties() -def plugins = new Properties() -def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins') -if (pluginsFile.exists()) { - pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) } -} +assert localPropertiesFile.exists() +localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) } -plugins.each { name, path -> - def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile() - include ":$name" - project(":$name").projectDir = pluginDirectory -} +def flutterSdkPath = properties.getProperty("flutter.sdk") +assert flutterSdkPath != null, "flutter.sdk not set in local.properties" +apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle" diff --git a/flutter-app/ios/Flutter/flutter_export_environment.sh b/flutter-app/ios/Flutter/flutter_export_environment.sh new file mode 100755 index 0000000..2a1b698 --- /dev/null +++ b/flutter-app/ios/Flutter/flutter_export_environment.sh @@ -0,0 +1,15 @@ +#!/bin/sh +# This is a generated file; do not edit or check into version control. +export "FLUTTER_ROOT=/Users/dmitrydyachenko/Desktop/flutter" +export "FLUTTER_APPLICATION_PATH=/Users/dmitrydyachenko/Downloads/mlkit-custom-image-classifier-master/flutter-app" +export "FLUTTER_TARGET=lib/main.dart" +export "FLUTTER_BUILD_DIR=build" +export "SYMROOT=${SOURCE_ROOT}/../build/ios" +export "OTHER_LDFLAGS=$(inherited) -framework Flutter" +export "FLUTTER_FRAMEWORK_DIR=/Users/dmitrydyachenko/Desktop/flutter/bin/cache/artifacts/engine/ios" +export "FLUTTER_BUILD_NAME=1.0.4" +export "FLUTTER_BUILD_NUMBER=1.0.4" +export "DART_OBFUSCATION=false" +export "TRACK_WIDGET_CREATION=false" +export "TREE_SHAKE_ICONS=false" +export "PACKAGE_CONFIG=.packages" diff --git a/flutter-app/ios/Runner.xcodeproj/project.pbxproj b/flutter-app/ios/Runner.xcodeproj/project.pbxproj index a8d0965..6150ffb 100644 --- a/flutter-app/ios/Runner.xcodeproj/project.pbxproj +++ b/flutter-app/ios/Runner.xcodeproj/project.pbxproj @@ -9,11 +9,7 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; }; - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 90105ED82272685E00FB2AE0 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 90105ED72272685E00FB2AE0 /* GoogleService-Info.plist */; }; - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; }; - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; }; 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; }; 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; }; @@ -30,8 +26,6 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( - 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */, - 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -41,8 +35,8 @@ /* Begin PBXFileReference section */ 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; + 2F7666E7FC7C9854AFDE258A /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; }; 502C3FE64F81B4C87F1593AE /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; @@ -50,13 +44,13 @@ 90105ED72272685E00FB2AE0 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "GoogleService-Info.plist"; path = "../../../../../Downloads/GoogleService-Info.plist"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; - 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + AC3D7FA16169E380581C502E /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Pods/Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -64,8 +58,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */, - 3B80C3941E831B6300D905FE /* App.framework in Frameworks */, C4DA2BD87DDF4C424E72596C /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -76,6 +68,8 @@ 3E96E969EDF674FBC49DEE73 /* Pods */ = { isa = PBXGroup; children = ( + 2F7666E7FC7C9854AFDE258A /* Pods-Runner.debug.xcconfig */, + AC3D7FA16169E380581C502E /* Pods-Runner.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -91,9 +85,7 @@ 9740EEB11CF90186004384FC /* Flutter */ = { isa = PBXGroup; children = ( - 3B80C3931E831B6300D905FE /* App.framework */, 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */, - 9740EEBA1CF902C7004384FC /* Flutter.framework */, 9740EEB21CF90195004384FC /* Debug.xcconfig */, 7AFA3C8E1D35360C0083082E /* Release.xcconfig */, 9740EEB31CF90195004384FC /* Generated.xcconfig */, @@ -227,7 +219,7 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh", "${PODS_ROOT}/GoogleSignIn/Resources/GoogleSignIn.bundle", ); name = "[CP] Copy Pods Resources"; @@ -236,7 +228,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n"; showEnvVarsInLog = 0; }; 1691EEAB07D8108AEEB82C22 /* [CP] Embed Pods Frameworks */ = { @@ -245,48 +237,58 @@ files = ( ); inputPaths = ( - "${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", - "${BUILT_PRODUCTS_DIR}/BoringSSL-GRPC/openssl_grpc.framework", - "${PODS_ROOT}/../.symlinks/flutter/ios-release/Flutter.framework", + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh", "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", "${BUILT_PRODUCTS_DIR}/GoogleAPIClientForREST/GoogleAPIClientForREST.framework", "${BUILT_PRODUCTS_DIR}/GoogleToolboxForMac/GoogleToolboxForMac.framework", "${BUILT_PRODUCTS_DIR}/GoogleUtilities/GoogleUtilities.framework", + "${BUILT_PRODUCTS_DIR}/PromisesObjC/FBLPromises.framework", "${BUILT_PRODUCTS_DIR}/Protobuf/Protobuf.framework", + "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", + "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework", + "${BUILT_PRODUCTS_DIR}/BoringSSL-GRPC/openssl_grpc.framework", + "${PODS_ROOT}/../.symlinks/flutter/ios/Flutter.framework", + "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/abseil/absl.framework", "${BUILT_PRODUCTS_DIR}/camera/camera.framework", + "${BUILT_PRODUCTS_DIR}/flutter_plugin_android_lifecycle/flutter_plugin_android_lifecycle.framework", "${BUILT_PRODUCTS_DIR}/gRPC-C++/grpcpp.framework", "${BUILT_PRODUCTS_DIR}/gRPC-Core/grpc.framework", "${BUILT_PRODUCTS_DIR}/image_picker/image_picker.framework", "${BUILT_PRODUCTS_DIR}/intro_slider/intro_slider.framework", "${BUILT_PRODUCTS_DIR}/leveldb-library/leveldb.framework", - "${BUILT_PRODUCTS_DIR}/nanopb/nanopb.framework", "${BUILT_PRODUCTS_DIR}/path_provider/path_provider.framework", "${BUILT_PRODUCTS_DIR}/shared_preferences/shared_preferences.framework", "${BUILT_PRODUCTS_DIR}/url_launcher/url_launcher.framework", ); name = "[CP] Embed Pods Frameworks"; outputPaths = ( - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl_grpc.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleAPIClientForREST.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleToolboxForMac.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleUtilities.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBLPromises.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Protobuf.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/openssl_grpc.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Flutter.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/absl.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/camera.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/flutter_plugin_android_lifecycle.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpcpp.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/grpc.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/image_picker.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/intro_slider.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/leveldb.framework", - "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/nanopb.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/path_provider.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/shared_preferences.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/url_launcher.framework", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { @@ -301,7 +303,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin"; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; 9740EEB61CF901F6004384FC /* Run Script */ = { isa = PBXShellScriptBuildPhase; @@ -372,7 +374,6 @@ /* Begin XCBuildConfiguration section */ 97C147031CF9000F007C117D /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; @@ -426,7 +427,6 @@ }; 97C147041CF9000F007C117D /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; diff --git a/flutter-app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings b/flutter-app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings deleted file mode 100644 index 949b678..0000000 --- a/flutter-app/ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings +++ /dev/null @@ -1,8 +0,0 @@ - - - - - BuildSystemType - Original - - diff --git a/flutter-app/lib/add_dataset_label_screen.dart b/flutter-app/lib/add_dataset_label_screen.dart index e1aab09..b043253 100644 --- a/flutter-app/lib/add_dataset_label_screen.dart +++ b/flutter-app/lib/add_dataset_label_screen.dart @@ -96,15 +96,14 @@ class _AddDatasetFormState extends State { } final datasetId = await AutoMLApi.createDataset(title); - - await Firestore.instance.collection('datasets').document().setData({ + Firestore.instance.collection('datasets').add({ 'automlId': datasetId, 'name': title, 'description': description, - 'ownerId': widget.userModel.user.uid, + 'ownerId': widget.userModel.user.user.uid, 'isPublic': setPublic, 'collaborators': [], - }); + }).then((value) => print('')); } void _handleSwitchChange(bool value) { @@ -253,11 +252,11 @@ class _AddLabelFormState extends State { disableSubmit = widget.value.isEmpty; } - // adds a label to a firestore document (if provided) - void addLabel(String text, String parentKey, [String document]) { + // adds a label to a firestore doc (if provided) + void addLabel(String text, String parentKey, [String doc]) { Firestore.instance .collection('labels') - .document(document) + .document(doc) .setData({'name': text, 'parent_key': parentKey, 'total_images': 0}); } diff --git a/flutter-app/lib/automl_api.dart b/flutter-app/lib/automl_api.dart index 5b60aa8..af499f5 100644 --- a/flutter-app/lib/automl_api.dart +++ b/flutter-app/lib/automl_api.dart @@ -78,9 +78,36 @@ class AutoMLApi { }, ); if (response.statusCode == 200) { - final Map body = jsonDecode(response.body); - print("Got response" + body.toString()); - return body["name"]; + if (response.body.isNotEmpty) { + final Map body = jsonDecode(response.body); + + print("Got response" + body.toString()); + return body["name"]; + } else { + return "some"; + } + } else { + throw Exception( + "Error while initiating importing the dataset: " + response.body); + } + } + + static Future train(String dataset) async { + final response = await http.post( + Uri.https(FUNCTIONS_URL, "$_AUTOMLAPI/train"), + body: { + "datasetId": dataset, + }, + ); + if (response.statusCode == 200) { + if (response.body.isNotEmpty) { + final Map body = jsonDecode(response.body); + + print("Got response" + body.toString()); + return body["name"]; + } else { + return "some"; + } } else { throw Exception( "Error while initiating importing the dataset: " + response.body); diff --git a/flutter-app/lib/camera.dart b/flutter-app/lib/camera.dart index 8dfbb51..bd5262a 100644 --- a/flutter-app/lib/camera.dart +++ b/flutter-app/lib/camera.dart @@ -55,7 +55,7 @@ class Camera extends StatefulWidget { } } -class _CameraState extends State { +class _CameraState extends State with WidgetsBindingObserver { CameraController controller; String imagePath; String videoPath; @@ -67,16 +67,34 @@ class _CameraState extends State { @override void initState() { super.initState(); - WidgetsBinding.instance.addPostFrameCallback((_) { - for (CameraDescription cameraDescription in cameras) { - if (cameraDescription.lensDirection == CameraLensDirection.back) - onNewCameraSelected(cameraDescription); + WidgetsBinding.instance.addObserver(this); + + // WidgetsBinding.instance.addPostFrameCallback((_) { + // for (CameraDescription cameraDescription in cameras) { + // if (cameraDescription.lensDirection == CameraLensDirection.back) + // onNewCameraSelected(cameraDescription); + // } + // }); + } + + @override + void didChangeAppLifecycleState(AppLifecycleState state) { + if (controller == null || !controller.value.isInitialized) { + return; + } + + if (state == AppLifecycleState.inactive) { + controller?.dispose(); + } else if (state == AppLifecycleState.resumed) { + if (controller != null) { + onNewCameraSelected(controller.description); } - }); + } } @override void dispose() { + WidgetsBinding.instance.removeObserver(this); controller?.dispose(); super.dispose(); } @@ -89,7 +107,7 @@ class _CameraState extends State { title: Text('Capture sample for ${widget.label}'), ), body: Container( - decoration: new BoxDecoration(color: Colors.black), + decoration: new BoxDecoration(color: Colors.yellow), child: Column( children: [ Expanded( @@ -101,12 +119,12 @@ class _CameraState extends State { ), ), decoration: BoxDecoration( - color: Colors.black, + color: Colors.yellow, border: Border.all( color: controller != null && controller.value.isRecordingVideo ? Colors.redAccent - : Colors.black45, + : Colors.green, width: 2.0, ), ), @@ -118,21 +136,71 @@ class _CameraState extends State { onRecordingStop: onStopButtonPressed, onPictureTaken: onTakePictureButtonPressed, ), + // Padding( + // padding: const EdgeInsets.all(5.0), + // child: Row( + // mainAxisAlignment: MainAxisAlignment.start, + // children: [ + // _thumbnailWidget(), + // ], + // ), + // ), Padding( - padding: const EdgeInsets.all(5.0), - child: Row( - mainAxisAlignment: MainAxisAlignment.start, - children: [ - _thumbnailWidget(), - ], - ), + padding: const EdgeInsets.all(5.0), + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + _cameraTogglesRowWidget(), + _thumbnailWidget(), + ], ), + ), ], ), ), ); } + /// Display a row of toggle to select the camera (or a message if no camera is available). + Widget _cameraTogglesRowWidget() { + final List toggles = []; + + if (cameras.isEmpty) { + return const Text('No camera found'); + } else { + for (CameraDescription cameraDescription in cameras) { + toggles.add( + SizedBox( + width: 90.0, + child: RadioListTile( + title: Icon(getCameraLensIcon(cameraDescription.lensDirection)), + groupValue: controller?.description, + value: cameraDescription, + onChanged: controller != null && controller.value.isRecordingVideo + ? null + : onNewCameraSelected, + ), + ), + ); + } + } + + return Row(children: toggles); + } + + /// Returns a suitable camera icon for [direction]. +IconData getCameraLensIcon(CameraLensDirection direction) { + switch (direction) { + case CameraLensDirection.back: + return Icons.camera_rear; + case CameraLensDirection.front: + return Icons.camera_front; + case CameraLensDirection.external: + return Icons.camera; + } + throw ArgumentError('Unknown lens direction'); +} + /// Display the preview from the camera (or a message if the preview is not available). Widget _cameraPreviewWidget() { if (controller == null || !controller.value.isInitialized) { @@ -176,7 +244,10 @@ class _CameraState extends State { if (controller != null) { await controller.dispose(); } - controller = CameraController(cameraDescription, ResolutionPreset.low); + setState(() { + controller = CameraController(cameraDescription, ResolutionPreset.medium); + + }); // If the controller is updated then update the UI. controller.addListener(() { @@ -227,7 +298,7 @@ class _CameraState extends State { ), ); - final snapshot = await uploadTask.onComplete; + final snapshot = await uploadTask.lastSnapshot; final downloadUrl = await snapshot.ref.getDownloadURL(); Firestore.instance.collection('images').add({ @@ -239,7 +310,7 @@ class _CameraState extends State { 'uploadPath': 'datasets/${widget.dataset.name}/${widget.label}/$filename', 'gcsURI': downloadUrl, - 'uploader': widget.userModel.user.email, + 'uploader': widget.userModel.user.user.email, }); final labelRef = @@ -248,9 +319,8 @@ class _CameraState extends State { // increment count for the label await Firestore.instance.runTransaction((Transaction tx) async { DocumentSnapshot snapshot = await tx.get(labelRef); - await tx.update(labelRef, { - 'total_images': snapshot.data['total_images'] + 1 - }); + await tx.update(labelRef, + {'total_images': snapshot['total_images'] + 1}); }); } } @@ -289,7 +359,7 @@ class _CameraState extends State { 'activity': 'videoUpload', 'parent_key': widget.labelKey, 'dataset_parent_key': widget.dataset.id, - 'uploader': widget.userModel.user.email, + 'uploader': widget.userModel.user.user.email, }, ), ); diff --git a/flutter-app/lib/collaborators_page.dart b/flutter-app/lib/collaborators_page.dart index e95d61c..cdee19f 100644 --- a/flutter-app/lib/collaborators_page.dart +++ b/flutter-app/lib/collaborators_page.dart @@ -161,9 +161,11 @@ class _InviteUserAlertDialogState extends State { 'invitedAt': DateTime.now().toIso8601String(), }); - await datasetRef.setData({ - "collaborators": FieldValue.arrayUnion([emailId]), - }, merge: true); + await datasetRef.setData( + { + "collaborators": FieldValue.arrayUnion([emailId]), + }, + ); } Navigator.pop(context); diff --git a/flutter-app/lib/constants.dart b/flutter-app/lib/constants.dart index 22f3a83..8e74617 100644 --- a/flutter-app/lib/constants.dart +++ b/flutter-app/lib/constants.dart @@ -25,7 +25,7 @@ const MIN_TESTING_VIDEOS_PER_LABEL = 1; const MIN_VALIDATION_VIDEOS_PER_LABEL = 1; // Toggles where video type configuration (training/test/validation) is allowed -const SHOW_VIDEO_TYPE_TOGGLES = false; +const SHOW_VIDEO_TYPE_TOGGLES = true; // Path to the AutoML Bucket // TODO: Needs to be configured as a part of onboarding diff --git a/flutter-app/lib/datasets_list.dart b/flutter-app/lib/datasets_list.dart index 2059dc9..54cfdea 100644 --- a/flutter-app/lib/datasets_list.dart +++ b/flutter-app/lib/datasets_list.dart @@ -16,7 +16,7 @@ import 'dart:async'; import 'dart:convert'; import 'dart:io'; -import 'package:automl_mlkit/automl_mlkit.dart'; +import 'automl_api.dart'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:firebase_storage/firebase_storage.dart'; import 'package:flutter/material.dart'; @@ -70,25 +70,25 @@ class DatasetsList extends StatelessWidget { children: filteredDatasets .map( (dataset) => new Container( - decoration: new BoxDecoration( - border: Border( - bottom: BorderSide(color: Colors.grey[300])), - ), - height: 100, - child: InkWell( - onTap: () { - Navigator.push( - context, - MaterialPageRoute( - builder: (context) => - new ListLabelsScreen(dataset), - ), - ); - }, - child: new DatasetActions( - dataset, model, scaffoldKey), - ), - ), + decoration: new BoxDecoration( + border: Border( + bottom: BorderSide(color: Colors.grey[300])), + ), + height: 100, + child: InkWell( + onTap: () { + Navigator.push( + context, + MaterialPageRoute( + builder: (context) => + new ListLabelsScreen(dataset), + ), + ); + }, + child: + new DatasetActions(dataset, model, scaffoldKey), + ), + ), ) .toList()); } @@ -304,7 +304,7 @@ class DatasetActions extends StatelessWidget { Future loadModel(String dataset) async { try { - await AutomlMlkit.loadModelFromCache(dataset: dataset); + await AutoMLApi.createDataset(dataset); print("Model successfully loaded"); } on PlatformException catch (e) { print("failed to load model"); @@ -313,15 +313,16 @@ class DatasetActions extends StatelessWidget { } Future getImage() async { - return ImagePicker.pickImage(source: ImageSource.camera); + var pickedFile = await ImagePicker().getImage(source: ImageSource.camera); + return pickedFile; } Future> recognizeImage(File image) async { - final results = await AutomlMlkit.runModelOnImage(imagePath: image.path); - return results - .map((result) => Inference.fromTfInference(result)) - .where((i) => i != null) - .toList(); + // final results = await AutomlMlkit.runModelOnImage(imagePath: image.path); + // return results + // .map((result) => Inference.fromTfInference(result)) + // .where((i) => i != null) + // .toList(); } /// downloads the latest model for the given dataset from storage and saves diff --git a/flutter-app/lib/intro_tutorial.dart b/flutter-app/lib/intro_tutorial.dart index 3b7fda4..8311c4f 100644 --- a/flutter-app/lib/intro_tutorial.dart +++ b/flutter-app/lib/intro_tutorial.dart @@ -14,6 +14,7 @@ import 'package:flutter/material.dart'; import 'package:intro_slider/intro_slider.dart'; +import 'package:intro_slider/slide_object.dart'; import 'package:shared_preferences/shared_preferences.dart'; class IntroTutorial extends StatefulWidget { @@ -35,7 +36,8 @@ class _IntroTutorialState extends State { slides.add( new Slide( title: "USE", - description: "Use image classification ML models to classify the world around you.", + description: + "Use image classification ML models to classify the world around you.", pathImage: "images/use.png", backgroundColor: Colors.deepPurple, ), diff --git a/flutter-app/lib/labelscreen.dart b/flutter-app/lib/labelscreen.dart index 82bb7c2..2a5fba4 100644 --- a/flutter-app/lib/labelscreen.dart +++ b/flutter-app/lib/labelscreen.dart @@ -111,8 +111,8 @@ class _ListLabelsScreenState extends State { // Add this operation to Firestore Firestore.instance.collection('operations').add({ - "dataset_id": widget.dataset.automlId, - "name": importDatasetOperation, + "dataset_id": widget?.dataset?.automlId?.toString(), + "name": importDatasetOperation.toString(), "last_updated": DateTime.now().millisecondsSinceEpoch, "done": false, "training_budget": trainingBudget, @@ -123,10 +123,14 @@ class _ListLabelsScreenState extends State { // set the token on dataset so that it can be notfied when training completes final token = await _firebaseMessaging.getToken(); - await Firestore.instance + final geterateToken = await Firestore.instance .collection('datasets') .document(widget.dataset.id) - .setData({"token": token}, merge: true); + .updateData({"token": token}); + + final createDatasetResponse = + await AutoMLApi.train(widget?.dataset?.automlId); + print(createDatasetResponse); } catch (err) { showSnackBar("Error while starting training"); print("Error $err"); @@ -205,8 +209,7 @@ class _ListLabelsScreenState extends State { Firestore.instance .collection('datasets') .document(widget.dataset.id) - .setData({"isPublic": !widget.dataset.isPublic}, - merge: true).whenComplete(() { + .setData({"isPublic": !widget.dataset.isPublic}).whenComplete(() { Navigator.pop(context); }); return; @@ -235,38 +238,38 @@ class _ListLabelsScreenState extends State { return PopupMenuButton( onSelected: onPopupMenuItemClicked, itemBuilder: (BuildContext context) => >[ - const PopupMenuItem( - child: Text('Train model'), - value: Actions.trainModel, - ), - const PopupMenuItem( - child: Text('View Collaborators'), - value: Actions.viewCollaborators, - ), - const PopupMenuItem( - child: Text('View Past Operations'), - value: Actions.viewPastOperations, - ), - PopupMenuItem( - child: widget.dataset.isPublic - ? Text('Make private') - : Text('Make public'), - value: Actions.changeVisiblity, - ), - const PopupMenuItem( - child: Text('Export to Firebase'), - value: Actions.exportToFirebase, - ), - const PopupMenuItem( - child: Text('Show bucket path'), - value: Actions.copyGCSPath, - ), - const PopupMenuDivider(), - const PopupMenuItem( - child: Text('Delete Dataset'), - value: Actions.deleteDataset, - ), - ], + const PopupMenuItem( + child: Text('Train model'), + value: Actions.trainModel, + ), + const PopupMenuItem( + child: Text('View Collaborators'), + value: Actions.viewCollaborators, + ), + const PopupMenuItem( + child: Text('View Past Operations'), + value: Actions.viewPastOperations, + ), + PopupMenuItem( + child: widget.dataset.isPublic + ? Text('Make private') + : Text('Make public'), + value: Actions.changeVisiblity, + ), + const PopupMenuItem( + child: Text('Export to Firebase'), + value: Actions.exportToFirebase, + ), + const PopupMenuItem( + child: Text('Show bucket path'), + value: Actions.copyGCSPath, + ), + const PopupMenuDivider(), + const PopupMenuItem( + child: Text('Delete Dataset'), + value: Actions.deleteDataset, + ), + ], ); } @@ -482,10 +485,10 @@ class LabelEntry extends StatelessWidget { context, MaterialPageRoute( builder: (context) => new ListLabelSamples( - dataset, - labelKey, - labelName, - ), + dataset, + labelKey, + labelName, + ), ), ); } diff --git a/flutter-app/lib/main.dart b/flutter-app/lib/main.dart index c28bef9..2910584 100644 --- a/flutter-app/lib/main.dart +++ b/flutter-app/lib/main.dart @@ -27,6 +27,7 @@ import 'storage.dart'; import 'user_model.dart'; void main() async { + WidgetsFlutterBinding.ensureInitialized(); final FirebaseStorage storage = await initStorage(STORAGE_BUCKET); final FirebaseStorage autoMlStorage = await initStorage(AUTOML_BUCKET); runApp(new MyApp( @@ -145,7 +146,7 @@ class _MyHomePageState extends State { text: 'Logout', children: [ TextSpan( - text: " (${model.user.displayName})", + text: " (${model.user.user.displayName})", style: TextStyle( color: Colors.black38, fontStyle: FontStyle.italic, diff --git a/flutter-app/lib/models.dart b/flutter-app/lib/models.dart index b7c4465..3bcddfd 100644 --- a/flutter-app/lib/models.dart +++ b/flutter-app/lib/models.dart @@ -77,17 +77,17 @@ class Dataset { isPublic: document["isPublic"] == true, ownerId: document["ownerId"], automlId: document["automlId"], - collaborators: document["collaborators"].map((x) => x as String).toList(), + collaborators: [], //document["collaborators"].map((x) => x as String).toList(), ); } bool isOwner(UserModel userModel) { - return userModel.isLoggedIn() && ownerId == userModel.user.uid; + return userModel.isLoggedIn() && ownerId == userModel.user.user.uid; } bool isCollaborator(UserModel userModel) { return userModel.isLoggedIn() && - collaborators.contains(userModel.user.email); + collaborators.contains(userModel.user.user.email); } } @@ -151,6 +151,6 @@ class Sample { } bool isOwner(UserModel userModel) { - return userModel.user.email == this.ownerEmail; + return userModel.user.user.email == this.ownerEmail; } } diff --git a/flutter-app/lib/service.dart b/flutter-app/lib/service.dart index da6267e..d676115 100644 --- a/flutter-app/lib/service.dart +++ b/flutter-app/lib/service.dart @@ -14,6 +14,8 @@ import 'package:http/http.dart' as http; +import 'constants.dart'; + /// Common operations over backend dataset service class DatasetService { static const _BACKEND_URL = "35.192.148.181"; @@ -30,7 +32,8 @@ class DatasetService { } static Future train(String dataset) async { - final response = await http.get(Uri.http(_BACKEND_URL, "/train", { + final response = + await http.get(Uri.http(FUNCTIONS_URL, "/automlApi/train", { "dataset": dataset, })); if (response.statusCode == 200) { diff --git a/flutter-app/lib/signin_page.dart b/flutter-app/lib/signin_page.dart index 4a3c677..2607f32 100644 --- a/flutter-app/lib/signin_page.dart +++ b/flutter-app/lib/signin_page.dart @@ -59,7 +59,7 @@ class ZeroStateSignIn extends StatelessWidget { ), GoogleSignInButton( onPressed: () { - model.beginSignIn().then((FirebaseUser user) { + model.beginSignIn().then((AuthResult user) { model.setLoggedInUser(user); Navigator.of(context).pop(true); }).catchError((e) => print(e)); diff --git a/flutter-app/lib/user_model.dart b/flutter-app/lib/user_model.dart index 6bd595f..8ed1af5 100644 --- a/flutter-app/lib/user_model.dart +++ b/flutter-app/lib/user_model.dart @@ -20,7 +20,7 @@ import 'package:google_sign_in/google_sign_in.dart'; import 'package:scoped_model/scoped_model.dart'; class UserModel extends Model { - FirebaseUser _user; + AuthResult _user; final GoogleSignIn _googleSignIn = GoogleSignIn(); final FirebaseAuth _auth = FirebaseAuth.instance; @@ -47,33 +47,34 @@ class UserModel extends Model { print("Attempting silent sign in"); GoogleSignInAccount googleUser = await _googleSignIn.signInSilently(); if (googleUser != null) { - FirebaseUser user = await completeSignIn(googleUser); + AuthResult user = await completeSignIn(googleUser); setLoggedInUser(user); } } - void setLoggedInUser(FirebaseUser user) async { + void setLoggedInUser(AuthResult user) async { _user = user; notifyListeners(); } - Future completeSignIn(GoogleSignInAccount googleUser) async { + Future completeSignIn(GoogleSignInAccount googleUser) async { final GoogleSignInAuthentication googleAuth = await googleUser.authentication; final AuthCredential credential = GoogleAuthProvider.getCredential( accessToken: googleAuth.accessToken, idToken: googleAuth.idToken, ); - FirebaseUser user = await _auth.signInWithCredential(credential); - print("signed in ${user.displayName} with id: ${user.uid}"); + AuthResult user = await _auth.signInWithCredential(credential); + print( + "signed in ${user.user.displayName} with id: ${user.user.displayName}"); return user; } /// begins the sign in flow - Future beginSignIn() async { + Future beginSignIn() async { GoogleSignInAccount googleUser = await _googleSignIn.signIn(); return completeSignIn(googleUser); } - FirebaseUser get user => _user; + AuthResult get user => _user; } diff --git a/flutter-app/pubspec.yaml b/flutter-app/pubspec.yaml index 2aed030..a31cb70 100644 --- a/flutter-app/pubspec.yaml +++ b/flutter-app/pubspec.yaml @@ -29,34 +29,31 @@ environment: dependencies: flutter: sdk: flutter - cloud_firestore: ^0.9.13 + camera: 0.5.0 - path_provider: ^0.5.0+1 - transparent_image: ^0.1.0 - google_sign_in: ^4.0.0 - http: ^0.12.0 - timeago: ^2.0.9 - scoped_model: ^1.0.1 - image_picker: ^0.6.1 - intro_slider: ^1.2.0 - url_launcher: ^5.0.2 - shared_preferences: ^0.5.2 - - # The following adds the Cupertino Icons font to your application. - # Use with the CupertinoIcons class for iOS style icons. + path_provider: ^1.6.24 + transparent_image: ^1.0.0 + google_sign_in: ^4.5.6 + http: ^0.12.2 + timeago: ^2.0.28 + scoped_model: ^1.1.0 + image_picker: ^0.6.7+14 + intro_slider: ^2.3.3 + url_launcher: ^5.7.10 + shared_preferences: ^0.5.12+4 cupertino_icons: ^0.1.2 + + firebase_core: ^0.4.0+9 + firebase_analytics: ^5.0.2 + firebase_storage: + firebase_messaging: + firebase_auth: ^0.14.0+5 + cloud_firestore: ^0.12.9+5 + firebase_ml_vision: dev_dependencies: flutter_test: sdk: flutter - automl_mlkit: - path: ../automl_mlkit/ - firebase_auth: - path: ../firebase_auth/ - firebase_storage: - path: ../firebase_storage/ - firebase_messaging: - path: ../firebase_messaging/ # For information on the generic Dart part of this file, see the # following page: https://www.dartlang.org/tools/pub/pubspec diff --git a/functions/.vscode/settings.json b/functions/.vscode/settings.json new file mode 100644 index 0000000..28a51d5 --- /dev/null +++ b/functions/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "compile-hero.disable-compile-files-on-did-save-code": false +} \ No newline at end of file diff --git a/functions/package-lock.json b/functions/package-lock.json index 2d64841..c54a452 100644 --- a/functions/package-lock.json +++ b/functions/package-lock.json @@ -3,243 +3,170 @@ "requires": true, "lockfileVersion": 1, "dependencies": { - "@firebase/app": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.3.8.tgz", - "integrity": "sha512-etJ7zgQfV/XQVLHee8Htlh2K8WrgNeXD9zvy+opOvTDIThbNpjn/8jaDGy/3eLqPSLqCchwwYZRYsiu1CrRAjw==", + "@apidevtools/json-schema-ref-parser": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz", + "integrity": "sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==", "requires": { - "@firebase/app-types": "0.3.3", - "@firebase/util": "0.2.6", - "dom-storage": "2.1.0", - "tslib": "1.9.0", - "xmlhttprequest": "1.8.0" + "@jsdevtools/ono": "^7.1.3", + "call-me-maybe": "^1.0.1", + "js-yaml": "^3.13.1" + } + }, + "@dabh/diagnostics": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", + "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", + "requires": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "@derhuerst/http-basic": { + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@derhuerst/http-basic/-/http-basic-8.2.1.tgz", + "integrity": "sha512-Rmn7qQQulw2sxJ8qGfZ7OuqMWuhz8V+L5xnYKMF5cXVcYqmgWqlVEAme90pF7Ya8OVhxVxLmhh0rI2k6t7ITWw==", + "requires": { + "caseless": "^0.12.0", + "concat-stream": "^1.6.2", + "http-response-object": "^3.0.1", + "parse-cache-control": "^1.0.1" } }, "@firebase/app-types": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.3.3.tgz", - "integrity": "sha512-mMcYitdEdzKOzEevHtECVepiqncSZBxRdI9r/LcJfx5ai4529UufpoLz15CnKLHEqkSB3OQqlZbI78xpZNQPPA==" + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz", + "integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg==" }, - "@firebase/database": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.3.11.tgz", - "integrity": "sha512-hKqvFEJta1mvY3DIyYOgRQ+CoEZtdJIQT0fw8oyIath8kfpqOdCdnW4/AIQCAXGo5Ov1A5YXHxcNSnW7MuWHAw==", + "@firebase/auth-interop-types": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz", + "integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw==" + }, + "@firebase/component": { + "version": "0.1.19", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.19.tgz", + "integrity": "sha512-L0S3g8eqaerg8y0zox3oOHSTwn/FE8RbcRHiurnbESvDViZtP5S5WnhuAPd7FnFxa8ElWK0z1Tr3ikzWDv1xdQ==", "requires": { - "@firebase/database-types": "0.3.4", - "@firebase/logger": "0.1.5", - "@firebase/util": "0.2.6", - "faye-websocket": "0.11.1", - "tslib": "1.9.0" + "@firebase/util": "0.3.2", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "@firebase/database": { + "version": "0.6.13", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.13.tgz", + "integrity": "sha512-NommVkAPzU7CKd1gyehmi3lz0K78q0KOfiex7Nfy7MBMwknLm7oNqKovXSgQV1PCLvKXvvAplDSFhDhzIf9obA==", + "requires": { + "@firebase/auth-interop-types": "0.1.5", + "@firebase/component": "0.1.19", + "@firebase/database-types": "0.5.2", + "@firebase/logger": "0.2.6", + "@firebase/util": "0.3.2", + "faye-websocket": "0.11.3", + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@firebase/database-types": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.3.4.tgz", - "integrity": "sha512-Kctjvr72c6pv4ZHVEmUE8rpGNeh846PO90aiC2h+vXNCOUdIz9lja7Z79An+aoRN00t1yzHuP0Qr+C3/KWlS+A==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.2.tgz", + "integrity": "sha512-ap2WQOS3LKmGuVFKUghFft7RxXTyZTDr0Xd8y2aqmWsbJVjgozi0huL/EUMgTjGFrATAjcf2A7aNs8AKKZ2a8g==", + "requires": { + "@firebase/app-types": "0.6.1" + } }, "@firebase/logger": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.1.5.tgz", - "integrity": "sha512-zWdQw2Yv/LVaxmi423fFG/KoS4qDD+B3WKs4wNvjnYoy1c9VS1ab1btV3kSk/r29OeRblfDAbazAQNQ8nr0YLw==" + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.6.tgz", + "integrity": "sha512-KIxcUvW/cRGWlzK9Vd2KB864HlUnCfdTH0taHE0sXW5Xl7+W68suaeau1oKNEqmc3l45azkd4NzXTCWZRZdXrw==" }, "@firebase/util": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.6.tgz", - "integrity": "sha512-xhQdQt/9eoX7CmCvWoe2YERMf/pIw0DgO0PicVTWJba+EAGdebHcpMeXRWvtsc7Wdj5Qh22hGLk1C+gz/nP5CQ==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.3.2.tgz", + "integrity": "sha512-Dqs00++c8rwKky6KCKLLY2T1qYO4Q+X5t+lF7DInXDNF4ae1Oau35bkD+OpJ9u7l1pEv7KHowP6CUKuySCOc8g==", "requires": { - "tslib": "1.9.0" + "tslib": "^1.11.1" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } } }, "@google-cloud/automl": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@google-cloud/automl/-/automl-0.1.3.tgz", - "integrity": "sha512-jGAvi/U6StfrfSkmRhqGlsHPyRbLuXlpPKmcrlsqPc0O3Oeszwg6WHRewesJm0d2OTz9+B4bcpRXxiJzR+DJNg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@google-cloud/automl/-/automl-2.3.0.tgz", + "integrity": "sha512-DqkdryzYmqskcD295O7b8m1XRbmv92vwjDIinHyKtrdHovphSgwKAPgzIADoywjr7gj6eE0t+GoBOjOBJvOvmA==", "requires": { - "google-gax": "^0.22.0", - "lodash.merge": "^4.6.0", - "protobufjs": "^6.8.0" - }, - "dependencies": { - "gcp-metadata": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz", - "integrity": "sha512-ffjC09amcDWjh3VZdkDngIo7WoluyC5Ag9PAYxZbmQLOLNI8lvPtoKTSCyU54j2gwy5roZh6sSMTfkY2ct7K3g==", - "requires": { - "axios": "^0.18.0", - "extend": "^3.0.1", - "retry-axios": "0.3.2" - } - }, - "google-auth-library": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-2.0.2.tgz", - "integrity": "sha512-FURxmo1hBVmcfLauuMRKOPYAPKht3dGuI2wjeJFalDUThO0HoYVjr4yxt5cgYSFm1dgUpmN9G/poa7ceTFAIiA==", - "requires": { - "axios": "^0.18.0", - "gcp-metadata": "^0.7.0", - "gtoken": "^2.3.0", - "https-proxy-agent": "^2.2.1", - "jws": "^3.1.5", - "lru-cache": "^5.0.0", - "semver": "^5.5.0" - } - }, - "google-gax": { - "version": "0.22.1", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.22.1.tgz", - "integrity": "sha512-QLvRQ00f5eLmkVm9c8JwqDSwQ6yEJXdtwCu+Xvk2EMpzzaTPZxgX+TtU1Ljg7AHJclpxChJpNYrCw10aB1IJlQ==", - "requires": { - "@grpc/grpc-js": "^0.3.0", - "@grpc/proto-loader": "^0.3.0", - "duplexify": "^3.6.0", - "google-auth-library": "^2.0.0", - "google-proto-files": "^0.18.0", - "grpc": "^1.16.0", - "is-stream-ended": "^0.1.4", - "lodash.at": "^4.6.0", - "lodash.has": "^4.5.2", - "protobufjs": "^6.8.8", - "retry-request": "^4.0.0", - "semver": "^5.5.1", - "walkdir": "0.0.12" - } - }, - "google-proto-files": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.18.0.tgz", - "integrity": "sha512-blJ5rA3TWEiZIw7Qm0GHNERDdZeezDj46wE4O5uGnOWpZI/STQjeI6rPbqiwjmxzG+b592Hrp2+GKYfbmKR+Lg==", - "requires": { - "protobufjs": "^6.8.0", - "walkdir": "0.0.12" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" - } + "google-gax": "^2.1.0" } }, "@google-cloud/common": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.27.0.tgz", - "integrity": "sha512-lRA3RHjMNQODpobcHLK9qg4ebN+jjUl7y4ZbjHFM+FYzmZLJQL1LFCM0BJ1DAPyD14ScBZ8Zb2I48oOFVxfNvQ==", - "requires": { - "@google-cloud/projectify": "^0.3.2", - "@google-cloud/promisify": "^0.3.0", - "@types/duplexify": "^3.5.0", - "@types/request": "^2.47.0", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.17.0.tgz", + "integrity": "sha512-HRZLSU762E6HaKoGfJGa8W95yRjb9rY7LePhjaHK9ILAnFacMuUGVamDbTHu1csZomm1g3tZTtXfX/aAhtie/Q==", + "requires": { + "array-uniq": "^1.0.3", "arrify": "^1.0.1", - "duplexify": "^3.6.0", + "concat-stream": "^1.6.0", + "create-error-class": "^3.0.2", + "duplexify": "^3.5.0", "ent": "^2.2.0", "extend": "^3.0.1", - "google-auth-library": "^2.0.0", - "pify": "^4.0.0", - "retry-request": "^4.0.0" + "google-auto-auth": "^0.10.0", + "is": "^3.2.0", + "log-driver": "1.2.7", + "methmeth": "^1.1.0", + "modelo": "^4.2.0", + "request": "^2.79.0", + "retry-request": "^3.0.0", + "split-array-stream": "^1.0.0", + "stream-events": "^1.0.1", + "string-format-obj": "^1.1.0", + "through2": "^2.0.3" }, "dependencies": { - "gcp-metadata": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz", - "integrity": "sha512-ffjC09amcDWjh3VZdkDngIo7WoluyC5Ag9PAYxZbmQLOLNI8lvPtoKTSCyU54j2gwy5roZh6sSMTfkY2ct7K3g==", - "requires": { - "axios": "^0.18.0", - "extend": "^3.0.1", - "retry-axios": "0.3.2" - } - }, - "google-auth-library": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-2.0.2.tgz", - "integrity": "sha512-FURxmo1hBVmcfLauuMRKOPYAPKht3dGuI2wjeJFalDUThO0HoYVjr4yxt5cgYSFm1dgUpmN9G/poa7ceTFAIiA==", - "requires": { - "axios": "^0.18.0", - "gcp-metadata": "^0.7.0", - "gtoken": "^2.3.0", - "https-proxy-agent": "^2.2.1", - "jws": "^3.1.5", - "lru-cache": "^5.0.0", - "semver": "^5.5.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "retry-request": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.2.tgz", + "integrity": "sha512-WIiGp37XXDC6e7ku3LFoi7LCL/Gs9luGeeqvbPRb+Zl6OQMw4RCRfSaW+aLfE6lhz1R941UavE6Svl3Dm5xGIQ==", "requires": { - "yallist": "^3.0.2" + "request": "^2.81.0", + "through2": "^2.0.0" } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" } } }, "@google-cloud/firestore": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-1.0.1.tgz", - "integrity": "sha512-h8DxYkrP62VZjmwUJWwsm9F+fUagne2ANML9eIOPT3JWBS+41ZBxNgxOjH8hR5Htxz6GD+xsrr0KYxKBd1eepQ==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/@google-cloud/firestore/-/firestore-4.7.1.tgz", + "integrity": "sha512-Qici+WKB6uRdDS1S3CaxGrIaCl4Bck70DYSzA5dZFkTU03Jj5DKXC4PYeUkfCAiB4haj7tzx+2ye7rhLxPclhQ==", "requires": { - "@google-cloud/projectify": "^0.3.0", - "bun": "^0.0.12", - "deep-equal": "^1.0.1", - "extend": "^3.0.1", + "fast-deep-equal": "^3.1.1", "functional-red-black-tree": "^1.0.1", - "google-gax": "^0.24.0", - "is": "^3.2.1", - "lodash.merge": "^4.6.1", - "protobufjs": "^6.8.6", - "through2": "^3.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", - "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "through2": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.0.tgz", - "integrity": "sha512-8B+sevlqP4OiCjonI1Zw03Sf8PuV1eRsYQgLad5eonILOdyeRsY27A/2Ze8IlvlMvq31OH+3fz/styI7Ya62yQ==", - "requires": { - "readable-stream": "2 || 3", - "xtend": "~4.0.1" - } - } + "google-gax": "^2.9.2" } }, "@google-cloud/functions-emulator": { - "version": "1.0.0-beta.5", - "resolved": "https://registry.npmjs.org/@google-cloud/functions-emulator/-/functions-emulator-1.0.0-beta.5.tgz", - "integrity": "sha512-65qxXqyyD5SnKBlv76YNZDKRxP2o8sh2B5bSkiV4VHNmoaRiB/SYjc2GQuKqrxwJ6MbI4mhTLgvNTy6BSP2QSQ==", + "version": "1.0.0-beta.6", + "resolved": "https://registry.npmjs.org/@google-cloud/functions-emulator/-/functions-emulator-1.0.0-beta.6.tgz", + "integrity": "sha512-66t/hrwQPJCOOYZhIBTPfIs18JpqGshcjWM/E5CXsuYU9+2rM+ObTjOO6cp2z8v328ra2HHGzRvNLrOVsfwZPg==", "requires": { "@google-cloud/storage": "^1.7.0", "adm-zip": "^0.4.11", @@ -263,31 +190,6 @@ "yargs": "11.0.0" }, "dependencies": { - "@google-cloud/common": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.17.0.tgz", - "integrity": "sha512-HRZLSU762E6HaKoGfJGa8W95yRjb9rY7LePhjaHK9ILAnFacMuUGVamDbTHu1csZomm1g3tZTtXfX/aAhtie/Q==", - "requires": { - "array-uniq": "^1.0.3", - "arrify": "^1.0.1", - "concat-stream": "^1.6.0", - "create-error-class": "^3.0.2", - "duplexify": "^3.5.0", - "ent": "^2.2.0", - "extend": "^3.0.1", - "google-auto-auth": "^0.10.0", - "is": "^3.2.0", - "log-driver": "1.2.7", - "methmeth": "^1.1.0", - "modelo": "^4.2.0", - "request": "^2.79.0", - "retry-request": "^3.0.0", - "split-array-stream": "^1.0.0", - "stream-events": "^1.0.1", - "string-format-obj": "^1.1.0", - "through2": "^2.0.3" - } - }, "@google-cloud/storage": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-1.7.0.tgz", @@ -357,31 +259,6 @@ "wrap-ansi": "^2.0.0" } }, - "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", - "requires": { - "dot-prop": "^4.1.0", - "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" - } - }, - "gcs-resumable-upload": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.10.2.tgz", - "integrity": "sha1-fymz7iPc7EFwNnwHEUGCScZgVF8=", - "requires": { - "configstore": "^3.1.2", - "google-auto-auth": "^0.10.0", - "pumpify": "^1.4.0", - "request": "^2.85.0", - "stream-events": "^1.0.3" - } - }, "got": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", @@ -454,14 +331,10 @@ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==" }, - "retry-request": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.2.tgz", - "integrity": "sha512-WIiGp37XXDC6e7ku3LFoi7LCL/Gs9luGeeqvbPRb+Zl6OQMw4RCRfSaW+aLfE6lhz1R941UavE6Svl3Dm5xGIQ==", - "requires": { - "request": "^2.81.0", - "through2": "^2.0.0" - } + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "rimraf": { "version": "2.6.2", @@ -476,15 +349,6 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, - "split-array-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-1.0.3.tgz", - "integrity": "sha1-0rdajl4Ngk1S/eyLgiWDncLjXfo=", - "requires": { - "async": "^2.4.0", - "is-stream-ended": "^0.1.0" - } - }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", @@ -502,36 +366,6 @@ "ansi-regex": "^3.0.0" } }, - "uuid": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", - "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" - }, - "winston": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz", - "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=", - "requires": { - "async": "~1.0.0", - "colors": "1.0.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "stack-trace": "0.0.x" - }, - "dependencies": { - "async": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" - }, - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" - } - } - }, "yargs": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", @@ -554,118 +388,572 @@ } }, "@google-cloud/paginator": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-0.1.2.tgz", - "integrity": "sha512-XL09cuPSEPyyNifavxWJRYkUFr5zCJ9njcFjqc1AqSQ2QIKycwdTxOP/zHsAWj0xN3rw1ApevA8o+8VAD4R6hw==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.5.tgz", + "integrity": "sha512-N4Uk4BT1YuskfRhKXBs0n9Lg2YTROZc6IMpkO/8DIHODtm5s3xY8K5vVBo23v/2XulY3azwITQlYWgT4GdLsUw==", "requires": { - "arrify": "^1.0.1", - "extend": "^3.0.1", - "is": "^3.2.1", - "split-array-stream": "^2.0.0", - "stream-events": "^1.0.4" + "arrify": "^2.0.0", + "extend": "^3.0.2" + }, + "dependencies": { + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + } } }, + "@google-cloud/precise-date": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-1.0.3.tgz", + "integrity": "sha512-wWnDGh9y3cJHLuVEY8t6un78vizzMWsS7oIWKeFtPj+Ndy+dXvHW0HTx29ZUhen+tswSlQYlwFubvuRP5kKdzQ==" + }, "@google-cloud/projectify": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-0.3.2.tgz", - "integrity": "sha512-t1bs5gE105IpgikX7zPCJZzVyXM5xZ/1kJomUPim2E2pNp4OUUFNyvKm/T2aM6GBP2F30o8abCD+/wbOhHWYYA==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.0.1.tgz", + "integrity": "sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ==" }, "@google-cloud/promisify": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-0.3.1.tgz", - "integrity": "sha512-QzB0/IMvB0eFxFK7Eqh+bfC8NLv3E9ScjWQrPOk6GgfNroxcVITdTlT8NRsRrcp5+QQJVPLkRqKG0PUdaWXmHw==" - }, - "@google-cloud/storage": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-2.3.4.tgz", - "integrity": "sha512-TjEMVxdW1L18yyxvPWEylM1F4ijZ/k4lGKrKro2XNqqOy+fnisc+F2TbpiSJSbdmsMzeCunDkXepdb5AFA62cw==", - "requires": { - "@google-cloud/common": "^0.27.0", - "@google-cloud/paginator": "^0.1.0", - "@google-cloud/promisify": "^0.3.0", - "arrify": "^1.0.0", - "async": "^2.0.1", - "compressible": "^2.0.12", - "concat-stream": "^1.5.0", - "duplexify": "^3.5.0", - "extend": "^3.0.0", - "gcs-resumable-upload": "^0.13.0", - "hash-stream-validation": "^0.2.1", - "mime": "^2.2.0", - "mime-types": "^2.0.8", - "once": "^1.3.1", - "pumpify": "^1.5.1", - "snakeize": "^0.1.0", - "stream-events": "^1.0.1", - "teeny-request": "^3.11.3", - "through2": "^3.0.0", - "xdg-basedir": "^3.0.0" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.3.tgz", + "integrity": "sha512-d4VSA86eL/AFTe5xtyZX+ePUjE8dIFu2T8zmdeNBSa5/kNgXPCx/o/wbFNHAGLJdGnk1vddRuMESD9HbOC8irw==" + }, + "@google-cloud/pubsub": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@google-cloud/pubsub/-/pubsub-1.7.3.tgz", + "integrity": "sha512-v+KdeaOS17WtHnsDf2bPGxKDT9HIRPYo3n+WsAEmvAzDHnh8q65mFcuYoQxuy2iRhmN/1ql2a0UU2tAAL7XZ8Q==", + "requires": { + "@google-cloud/paginator": "^2.0.0", + "@google-cloud/precise-date": "^1.0.0", + "@google-cloud/projectify": "^1.0.0", + "@google-cloud/promisify": "^1.0.0", + "@types/duplexify": "^3.6.0", + "@types/long": "^4.0.0", + "arrify": "^2.0.0", + "async-each": "^1.0.1", + "extend": "^3.0.2", + "google-auth-library": "^5.5.0", + "google-gax": "^1.14.2", + "is-stream-ended": "^0.1.4", + "lodash.snakecase": "^4.1.1", + "p-defer": "^3.0.0", + "protobufjs": "^6.8.1" }, "dependencies": { - "readable-stream": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", - "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", + "@google-cloud/paginator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-2.0.3.tgz", + "integrity": "sha512-kp/pkb2p/p0d8/SKUu4mOq8+HGwF8NPzHWkj+VKrIPQPyMRw8deZtrO/OcSiy9C/7bpfU5Txah5ltUNfPkgEXg==", "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "arrify": "^2.0.0", + "extend": "^3.0.2" } }, - "string_decoder": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", - "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "@google-cloud/projectify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-1.0.4.tgz", + "integrity": "sha512-ZdzQUN02eRsmTKfBj9FDL0KNDIFNjBn/d6tHQmA/+FImH5DO6ZV8E7FzxMgAUiVAUq41RFAkb25p1oHOZ8psfg==" + }, + "@google-cloud/promisify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-1.0.4.tgz", + "integrity": "sha512-VccZDcOql77obTnFh0TbNED/6ZbbmHDf8UMNnzO1d5g9V0Htfm4k5cllY8P1tJsRKC3zWYGRLaViiupcgVjBoQ==" + }, + "@grpc/grpc-js": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.5.tgz", + "integrity": "sha512-Hm+xOiqAhcpT9RYM8lc15dbQD7aQurM7ZU8ulmulepiPlN7iwBXXwP3vSBUimoFoApRqz7pSIisXU8pZaCB4og==", "requires": { - "safe-buffer": "~5.1.0" + "semver": "^6.2.0" } }, - "through2": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.0.tgz", - "integrity": "sha512-8B+sevlqP4OiCjonI1Zw03Sf8PuV1eRsYQgLad5eonILOdyeRsY27A/2Ze8IlvlMvq31OH+3fz/styI7Ya62yQ==", + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "requires": { - "readable-stream": "2 || 3", - "xtend": "~4.0.1" + "debug": "4" } - } - } - }, - "@grpc/grpc-js": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.3.4.tgz", - "integrity": "sha512-rIqAYD/Dg7SoR3SD3A9EDEkpb/m7RZ4+1silMN3PjXj2Dz/BeJUHrIl99DYmaZRCDfNGzKrIOPqfjczk8FKlyA==", - "requires": { - "semver": "^5.5.0" - } - }, - "@grpc/proto-loader": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.3.0.tgz", - "integrity": "sha512-9b8S/V+3W4Gv7G/JKSZ48zApgyYbfIR7mAC9XNnaSWme3zj57MIESu0ELzm9j5oxNIpFG8DgO00iJMIUZ5luqw==", - "requires": { - "@types/lodash": "^4.14.104", - "@types/node": "^9.4.6", - "lodash": "^4.17.5", - "protobufjs": "^6.8.6" - }, - "dependencies": { - "@types/node": { - "version": "9.6.41", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.41.tgz", - "integrity": "sha512-sPZWEbFMz6qAy9SLY7jh5cgepmsiwqUUHjvEm8lpU6kug2hmmcyuTnwhoGw/GWpI5Npue4EqvsiQQI0eWjW/ZA==" - } - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" - }, - "@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "gaxios": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", + "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + }, + "gcp-metadata": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", + "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", + "requires": { + "gaxios": "^2.1.0", + "json-bigint": "^0.3.0" + } + }, + "google-auth-library": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz", + "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^2.1.0", + "gcp-metadata": "^3.4.0", + "gtoken": "^4.1.0", + "jws": "^4.0.0", + "lru-cache": "^5.0.0" + } + }, + "google-gax": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.15.3.tgz", + "integrity": "sha512-3JKJCRumNm3x2EksUTw4P1Rad43FTpqrtW9jzpf3xSMYXx+ogaqTM1vGo7VixHB4xkAyATXVIa3OcNSh8H9zsQ==", + "requires": { + "@grpc/grpc-js": "~1.0.3", + "@grpc/proto-loader": "^0.5.1", + "@types/fs-extra": "^8.0.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^3.6.0", + "google-auth-library": "^5.0.0", + "is-stream-ended": "^0.1.4", + "lodash.at": "^4.6.0", + "lodash.has": "^4.5.2", + "node-fetch": "^2.6.0", + "protobufjs": "^6.8.9", + "retry-request": "^4.0.0", + "semver": "^6.0.0", + "walkdir": "^0.4.0" + } + }, + "google-p12-pem": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz", + "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==", + "requires": { + "node-forge": "^0.9.0" + } + }, + "gtoken": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz", + "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==", + "requires": { + "gaxios": "^2.1.0", + "google-p12-pem": "^2.0.0", + "jws": "^4.0.0", + "mime": "^2.2.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "json-bigint": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.1.tgz", + "integrity": "sha512-DGWnSzmusIreWlEupsUelHrhwmPPE+FiQvg+drKfk2p+bdEYa5mp4PJ8JsCWqae0M2jQNb0HPvnwvf1qOTThzQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node-forge": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.2.tgz", + "integrity": "sha512-naKSScof4Wn+aoHU6HBsifh92Zeicm1GDQKd1vp3Y/kOi8ub0DozCa9KpvYNCXslFHYRmLNiqRopGdTGwNLpNw==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "@google-cloud/storage": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.5.0.tgz", + "integrity": "sha512-Pat83kHNnKJpEHUirtQtCoAJ2K3OlEo2ZcSlPjierJnEKnhbIQPyJ6mAbs/ovm3K3QDQhouKJ9QSONkFPEwQuA==", + "requires": { + "@google-cloud/common": "^3.3.0", + "@google-cloud/paginator": "^3.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.0", + "compressible": "^2.0.12", + "date-and-time": "^0.14.0", + "duplexify": "^4.0.0", + "extend": "^3.0.2", + "gaxios": "^4.0.0", + "gcs-resumable-upload": "^3.1.0", + "get-stream": "^6.0.0", + "hash-stream-validation": "^0.2.2", + "mime": "^2.2.0", + "mime-types": "^2.0.8", + "onetime": "^5.1.0", + "p-limit": "^3.0.1", + "pumpify": "^2.0.0", + "snakeize": "^0.1.0", + "stream-events": "^1.0.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "@google-cloud/common": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.5.0.tgz", + "integrity": "sha512-10d7ZAvKhq47L271AqvHEd8KzJqGU45TY+rwM2Z3JHuB070FeTi7oJJd7elfrnKaEvaktw3hH2wKnRWxk/3oWQ==", + "requires": { + "@google-cloud/projectify": "^2.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^6.1.1", + "retry-request": "^4.1.1", + "teeny-request": "^7.0.0" + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "gaxios": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.0.1.tgz", + "integrity": "sha512-jOin8xRZ/UytQeBpSXFqIzqU7Fi5TqgPNLlUsSB8kjJ76+FiGBfImF8KJu++c6J4jOldfJUtt0YmkRj2ZpSHTQ==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + }, + "gcs-resumable-upload": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.1.1.tgz", + "integrity": "sha512-RS1osvAicj9+MjCc6jAcVL1Pt3tg7NK2C2gXM5nqD1Gs0klF2kj5nnAFSBy97JrtslMIQzpb7iSuxaG8rFWd2A==", + "requires": { + "abort-controller": "^3.0.0", + "configstore": "^5.0.0", + "extend": "^3.0.2", + "gaxios": "^3.0.0", + "google-auth-library": "^6.0.0", + "pumpify": "^2.0.0", + "stream-events": "^1.0.4" + }, + "dependencies": { + "gaxios": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.2.0.tgz", + "integrity": "sha512-+6WPeVzPvOshftpxJwRi2Ozez80tn/hdtOUag7+gajDHRJvAblKxTFSSMPtr2hmnLy7p0mvYz0rMXLBl8pSO7Q==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + } + } + }, + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==" + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "requires": { + "p-try": "^2.0.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==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", + "requires": { + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + } + } + }, + "@grpc/grpc-js": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.1.8.tgz", + "integrity": "sha512-64hg5rmEm6F/NvlWERhHmmgxbWU8nD2TMWE+9TvG7/WcOrFT3fzg/Uu631pXRFwmJ4aWO/kp9vVSlr8FUjBDLA==", + "requires": { + "@grpc/proto-loader": "^0.6.0-pre14", + "@types/node": "^12.12.47", + "google-auth-library": "^6.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "@grpc/proto-loader": { + "version": "0.6.0-pre9", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.6.0-pre9.tgz", + "integrity": "sha512-oM+LjpEjNzW5pNJjt4/hq1HYayNeQT+eGrOPABJnYHv7TyNPDNzkQ76rDYZF86X5swJOa4EujEMzQ9iiTdPgww==", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.9.0", + "yargs": "^15.3.1" + } + }, + "@types/node": { + "version": "12.19.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.19.6.tgz", + "integrity": "sha512-U2VopDdmBoYBmtm8Rz340mvvSz34VgX/K9+XCuckvcLGMkt3rbMX8soqFOikIPlPBc5lmw8By9NUK7bEFSBFlQ==" + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@grpc/proto-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.5.tgz", + "integrity": "sha512-WwN9jVNdHRQoOBo9FDH7qU+mgfjPc8GygPYms3M+y3fbQLfnCe/Kv/E01t7JRgnrsOHH8euvSbed3mIalXhwqQ==", + "requires": { + "lodash.camelcase": "^4.3.0", + "protobufjs": "^6.8.6" + } + }, + "@jsdevtools/ono": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==" + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" }, "@protobufjs/codegen": { "version": "2.0.4", @@ -712,31 +1000,39 @@ "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" }, "@sendgrid/client": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-6.3.0.tgz", - "integrity": "sha512-fTy8vRpA9Whtf8ULQr/0vkSZaQvGQ97rY5N5PrevKRtugJMsJqFMKO0pwzEWeqITSg71aMMTj57QTgw3SjZvnQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@sendgrid/client/-/client-7.4.0.tgz", + "integrity": "sha512-KAZlEb1P8sATgBN+7hXgzaRF94nF9KQgDxQ6zUT1BV0kEsNtJQ2cs35sCtWt6AKKJrL0xPI/MsfcAJqom4YQBg==", "requires": { - "@sendgrid/helpers": "^6.3.0", - "@types/request": "^2.0.3", - "request": "^2.81.0" + "@sendgrid/helpers": "^7.4.0", + "axios": "^0.19.2" + }, + "dependencies": { + "axios": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", + "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", + "requires": { + "follow-redirects": "1.5.10" + } + } } }, "@sendgrid/helpers": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-6.3.0.tgz", - "integrity": "sha512-uTFcmhCDFg/2Uhz+z/cLwyLHH0UsblG49hKwdR7nKbWsGKWv4js7W32FlPdXqy2C/plTJ20vcPLgKM1m3F/MjQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@sendgrid/helpers/-/helpers-7.4.0.tgz", + "integrity": "sha512-IQI2vemiJB0+X6bEp4HRG+0/wrzR2RDGnB5rwfq1CsPDrUFdJfxbE2zbGx//1GnlNwAtbHyc93ejU1m0KZr86w==", "requires": { - "chalk": "^2.0.1", - "deepmerge": "^2.1.1" + "deepmerge": "^4.2.2" } }, "@sendgrid/mail": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-6.3.1.tgz", - "integrity": "sha512-5zIeAV9iU+0hQkrOQ/D4RB2MfpK+lNbOortIfQdCh95aMDF/TRc9WB8FGNhmQrx9YMuJTms5eiBklF0Fi/dbVg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@sendgrid/mail/-/mail-7.4.0.tgz", + "integrity": "sha512-SAARsfbl50OEJ99LYGKfgrYiV5O6+23aeGJuEBTHHSwRZ6KhD3n1BjPeIejbqgbqYLZJfNLxyU3o5xRdJPp3zg==", "requires": { - "@sendgrid/client": "^6.3.0", - "@sendgrid/helpers": "^6.3.0" + "@sendgrid/client": "^7.4.0", + "@sendgrid/helpers": "^7.4.0" } }, "@sindresorhus/is": { @@ -745,34 +1041,50 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@sinonjs/commons": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz", - "integrity": "sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.1.tgz", + "integrity": "sha512-892K+kWUUi3cl+LlqEWIDrhvLgdL79tECi8JZUyq6IviKy/DNhuzCRlbHUjxK89f4ypPMMaFnFuR9Ie6DoIMsw==", "dev": true, "requires": { "type-detect": "4.0.8" } }, + "@sinonjs/fake-timers": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", + "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } + }, "@sinonjs/formatio": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.1.0.tgz", - "integrity": "sha512-ZAR2bPHOl4Xg6eklUGpsdiIJ4+J1SNag1DHHrG/73Uz/nVwXqjgUtRPLoS+aVyieN9cSbc0E4LsU984tWcDyNg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-5.0.1.tgz", + "integrity": "sha512-KaiQ5pBf1MpS09MuA0kp6KBQt2JUOQycqVG1NZXvzeaXe5LGFqAKueIS0bw4w0P9r7KuBSVdUk5QjXsUdu2CxQ==", "dev": true, "requires": { - "@sinonjs/samsam": "^2 || ^3" + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^5.0.2" } }, "@sinonjs/samsam": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.0.2.tgz", - "integrity": "sha512-m08g4CS3J6lwRQk1pj1EO+KEVWbrbXsmi9Pw0ySmrIbcVxVaedoFgLvFsV8wHLwh01EpROVz3KvVcD1Jmks9FQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-5.3.0.tgz", + "integrity": "sha512-hXpcfx3aq+ETVBwPlRFICld5EnrkexXuXDwqUNhDdr5L8VjvMeSRwyOa0qL7XFmR+jVWR4rUZtnxlG7RX72sBg==", "dev": true, "requires": { - "@sinonjs/commons": "^1.0.2", - "array-from": "^2.1.1", - "lodash.get": "^4.4.2" + "@sinonjs/commons": "^1.6.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" } }, + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", + "dev": true + }, "@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", @@ -781,34 +1093,38 @@ "defer-to-connect": "^1.0.1" } }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, "@types/body-parser": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz", - "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==", "requires": { "@types/connect": "*", "@types/node": "*" } }, - "@types/caseless": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz", - "integrity": "sha512-FhlMa34NHp9K5MY1Uz8yb+ZvuX0pnvn3jScRSNAb75KHGB8d3rEU6hqMs3Z2vjuytcMfRg6c5CHMc3wtYyD2/A==" - }, - "@types/connect": { - "version": "3.4.32", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz", - "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==", + "@types/cacheable-request": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", + "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", + "dev": true, "requires": { - "@types/node": "*" + "@types/http-cache-semantics": "*", + "@types/keyv": "*", + "@types/node": "*", + "@types/responselike": "*" } }, - "@types/cors": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.4.tgz", - "integrity": "sha512-ipZjBVsm2tF/n8qFGOuGBkUij9X9ZswVi9G3bx/6dz7POpVa6gVHcj1wsX/LVEn9MMF41fxK/PnZPPoTD1UFPw==", + "@types/connect": { + "version": "3.4.33", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", + "integrity": "sha512-2+FrkXY4zllzTNfJth7jOqEHC+enpLeGslEhpnTAkg21GkRrWV4SsAtqchtT4YS9/nODBU2/ZfsBY2X4J/dX7A==", "requires": { - "@types/express": "*" + "@types/node": "*" } }, "@types/duplexify": { @@ -819,16 +1135,10 @@ "@types/node": "*" } }, - "@types/events": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", - "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", - "dev": true - }, "@types/express": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.1.tgz", - "integrity": "sha512-V0clmJow23WeyblmACoxbHBu2JKlE5TiIme6Lem14FnPW9gsttyHtk6wq7njcdIWH1njAaFgR8gW09lgY98gQg==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.3.tgz", + "integrity": "sha512-I8cGRJj3pyOLs/HndoP+25vOqhqWkAZsWMEmq1qXy/b/M3ppufecUwaK2/TVDVxcV61/iSdhykUjQQ2DLSrTdg==", "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "*", @@ -836,86 +1146,108 @@ } }, "@types/express-serve-static-core": { - "version": "4.16.1", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.1.tgz", - "integrity": "sha512-QgbIMRU1EVRry5cIu1ORCQP4flSYqLM1lS5LYyGWfKnFT3E58f0gKto7BR13clBFVrVZ0G0rbLZ1hUpSkgQQOA==", + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.13.tgz", + "integrity": "sha512-RgDi5a4nuzam073lRGKTUIaL3eF2+H7LJvJ8eUnCI0wA6SNjXc44DCmWNiTLs/AZ7QlsFWZiw/gTG3nSQGL0fA==", "requires": { "@types/node": "*", + "@types/qs": "*", "@types/range-parser": "*" } }, "@types/ffmpeg-static": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/ffmpeg-static/-/ffmpeg-static-2.0.0.tgz", - "integrity": "sha512-ytooy2ZoIW+nahlxsJaugfY9Q5VYkRb8vzcOQGf1k0OFlwAnpRn59wIuYx04oFjqFvXjszTwJSdVx3qaM3nISQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/ffmpeg-static/-/ffmpeg-static-3.0.0.tgz", + "integrity": "sha512-JTwV8fFQYUgp8VLUKLd8zHfhFOoTTszMlofnWINAZYWSd/iR2ZZHJsWanUhBG4+c8QPfWE8P7t3nAjSxTNjevQ==", "dev": true }, "@types/fluent-ffmpeg": { - "version": "2.1.9", - "resolved": "https://registry.npmjs.org/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.9.tgz", - "integrity": "sha512-ASkD4gb8FngbTZe8x4iM5bKWmswHYGSuA5A5sauBroIDA7B7Uu7hrk+W7pEUQLG63fR+Zo2iDpSVWyTeoPuwRA==", + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/@types/fluent-ffmpeg/-/fluent-ffmpeg-2.1.16.tgz", + "integrity": "sha512-1FTstm6xY/2WsJVt6ARV7CiJjNCQDlR/nfw6xuYk5ITbVjk7sw89Biyqm2DGW4c3aZ3vBx+5irZvsql4eybpoQ==", "dev": true, "requires": { "@types/node": "*" } }, - "@types/form-data": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", - "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", + "@types/fs-extra": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.1.tgz", + "integrity": "sha512-TcUlBem321DFQzBNuz8p0CLLKp0VvF/XH9E4KHNmgwyp4E3AfgI5cjiIVZWlbfThBop2qxFIh4+LeY6hVWWZ2w==", "requires": { "@types/node": "*" } }, "@types/glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", - "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", "dev": true, "requires": { - "@types/events": "*", "@types/minimatch": "*", "@types/node": "*" } }, "@types/got": { - "version": "9.4.3", - "resolved": "https://registry.npmjs.org/@types/got/-/got-9.4.3.tgz", - "integrity": "sha512-hyDJGHrObckE8jOZza024tp2Y4/vVQVuesPbNMEc69Sr+eK3GlhUG3G7mWysoJgNhpvWAYso7CRMlQDlctNnUA==", + "version": "9.6.11", + "resolved": "https://registry.npmjs.org/@types/got/-/got-9.6.11.tgz", + "integrity": "sha512-dr3IiDNg5TDesGyuwTrN77E1Cd7DCdmCFtEfSGqr83jMMtcwhf/SGPbN2goY4JUWQfvxwY56+e5tjfi+oXeSdA==", "dev": true, "requires": { "@types/node": "*", - "@types/tough-cookie": "*" + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + }, + "dependencies": { + "form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } } }, - "@types/jsonwebtoken": { - "version": "7.2.8", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-7.2.8.tgz", - "integrity": "sha512-XENN3YzEB8D6TiUww0O8SRznzy1v+77lH7UmuN54xq/IHIsyWjWOzZuFFTtoiRuaE782uAoRwBe/wwow+vQXZw==", + "@types/http-cache-semantics": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==", + "dev": true + }, + "@types/keyv": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", + "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", + "dev": true, "requires": { "@types/node": "*" } }, "@types/lodash": { - "version": "4.14.120", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.120.tgz", - "integrity": "sha512-jQ21kQ120mo+IrDs1nFNVm/AsdFxIx2+vZ347DbogHJPd/JzKNMOqU6HCYin1W6v8l5R9XSO2/e9cxmn7HAnVw==" + "version": "4.14.165", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.165.tgz", + "integrity": "sha512-tjSSOTHhI5mCHTy/OOXYIhi2Wt1qcbHmuXD1Ha7q70CgI/I71afO4XtLb/cVexki1oVYchpul/TOuu3Arcdxrg==", + "dev": true }, "@types/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", - "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", + "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" }, "@types/luxon": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.11.1.tgz", - "integrity": "sha512-XBHQ7rzpOHyJudEQcMyoT67Np61FTb6S2jWqWQER/U7H2NAS+dpC8wv5T+6ygV5g/yJQdaojQbsJQiweool0Aw==", + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/@types/luxon/-/luxon-1.25.0.tgz", + "integrity": "sha512-iIJp2CP6C32gVqI08HIYnzqj55tlLnodIBMCcMf28q9ckqMfMzocCmIzd9JWI/ALLPMUiTkCu1JGv3FFtu6t3g==", "dev": true }, "@types/mime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", - "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz", + "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q==" }, "@types/minimatch": { "version": "3.0.3", @@ -924,57 +1256,83 @@ "dev": true }, "@types/mkdirp": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.5.2.tgz", - "integrity": "sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/mkdirp/-/mkdirp-1.0.1.tgz", + "integrity": "sha512-HkGSK7CGAXncr8Qn/0VqNtExEE+PHMWb+qlR1faHMao7ng6P3tAaoWWBMdva0gL5h4zprjIO89GJOLXsMcDm1Q==", "dev": true, "requires": { "@types/node": "*" } }, "@types/morgan": { - "version": "1.7.35", - "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.7.35.tgz", - "integrity": "sha512-E9qFi0seOkdlQnCTPv54brNfGWeFdRaEhI5tSue4pdx/V+xfxvMETsxXhOEcj1cYL+0n/jcTEmj/jD2gjzCwMg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/morgan/-/morgan-1.9.2.tgz", + "integrity": "sha512-edtGMEdit146JwwIeyQeHHg9yID4WSolQPxpEorHmN3KuytuCHyn2ELNr5Uxy8SerniFbbkmgKMrGM933am5BQ==", "dev": true, "requires": { - "@types/express": "*" + "@types/node": "*" } }, "@types/node": { - "version": "8.10.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.39.tgz", - "integrity": "sha512-rE7fktr02J8ybFf6eysife+WF+L4sAHWzw09DgdCebEu+qDwMvv4zl6Bc+825ttGZP73kCKxa3dhJOoGJ8+5mA==" + "version": "14.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.9.tgz", + "integrity": "sha512-JsoLXFppG62tWTklIoO4knA+oDTYsmqWxHRvd4lpmfQRNhX6osheUOWETP2jMoV/2bEHuMra8Pp3Dmo/stBFcw==" }, "@types/node-fetch": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.1.6.tgz", - "integrity": "sha512-Hv1jgh3pfpUEl2F2mqUd1AfLSk1YbUCeBJFaP36t7esAO617dErqdxWb5cdG2NfJGOofkmBW36fdx0dVewxDRg==", + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz", + "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "*", + "form-data": "^3.0.0" + }, + "dependencies": { + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + } } }, + "@types/qs": { + "version": "6.9.5", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz", + "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ==" + }, "@types/range-parser": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz", "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA==" }, - "@types/request": { - "version": "2.48.1", - "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.1.tgz", - "integrity": "sha512-ZgEZ1TiD+KGA9LiAAPPJL68Id2UWfeSO62ijSXZjFJArVV+2pKcsVHmrcu+1oiE3q6eDGiFiSolRc4JHoerBBg==", + "@types/responselike": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", + "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", + "dev": true, "requires": { - "@types/caseless": "*", - "@types/form-data": "*", - "@types/node": "*", - "@types/tough-cookie": "*" + "@types/node": "*" } }, "@types/rimraf": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-2.0.2.tgz", - "integrity": "sha512-Hm/bnWq0TCy7jmjeN5bKYij9vw5GrDFWME4IuxV08278NtU/VdGbzsBohcCUJ7+QMqmUq5hpRKB39HeQWJjztQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-7WhJ0MdpFgYQPXlF4Dx+DhgvlPCfz/x5mHaeDQAKhcenvQP1KCpLQ18JklAqeGMYSAT2PxLpzd0g2/HE7fj7hQ==", "dev": true, "requires": { "@types/glob": "*", @@ -982,18 +1340,25 @@ } }, "@types/serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==", + "version": "1.13.8", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz", + "integrity": "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==", "requires": { - "@types/express-serve-static-core": "*", - "@types/mime": "*" + "@types/mime": "*", + "@types/node": "*" } }, "@types/tough-cookie": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz", - "integrity": "sha512-SCcK7mvGi3+ZNz833RRjFIxrn4gI1PPR3NtuIS+6vMkvmsGjosqTJwRt5bAEFLRz+wtJMWv8+uOnZf2hi2QXTg==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A==", + "dev": true + }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true }, "JSONStream": { "version": "1.3.5", @@ -1004,43 +1369,85 @@ "through": ">=2.2.7 <3" } }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": 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==", + "requires": { + "event-target-shim": "^5.0.0" + } + }, "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "dependencies": { + "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==" + }, + "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==", + "requires": { + "mime-db": "1.44.0" + } + } } }, "adm-zip": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.13.tgz", - "integrity": "sha512-fERNJX8sOXfel6qCBCMPvZLzENBEhZTzKqg6vrOW5pvoEaQuJhRU4ndTAh6lHOxn1I6jnz2NHra56ZODM751uw==" + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==" + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } }, "ajv": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", - "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "requires": { - "fast-deep-equal": "^2.0.1", + "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "ansi-align": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", - "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", "requires": { - "string-width": "^2.0.0" + "string-width": "^3.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=" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "is-fullwidth-code-point": { "version": "2.0.0", @@ -1048,28 +1455,35 @@ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "requires": { + "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "strip-ansi": "^5.1.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^4.1.0" } } } }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==" }, "ansi-regex": { "version": "2.1.1", @@ -1077,101 +1491,131 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "ansicolors": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", + "integrity": "sha1-ZlWX3oap/+Oqm/vmyuXG6kJrSXk=" + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "optional": true }, "archiver": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-2.1.1.tgz", - "integrity": "sha1-/2YrSnggFJSj7lRNOjP+dJZQnrw=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-3.1.1.tgz", + "integrity": "sha512-5Hxxcig7gw5Jod/8Gq0OneVgLYET+oNHcxgWItq4TbhOzRLKNAFUb9edAftiMKXvXfCB0vbGrJdZDNq0dWMsxg==", "requires": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", + "archiver-utils": "^2.1.0", + "async": "^2.6.3", "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "zip-stream": "^1.2.0" + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "tar-stream": "^2.1.0", + "zip-stream": "^2.1.2" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "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" + "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" } }, - "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==", + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "safe-buffer": "~5.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } }, "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", + "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.0", "lazystream": "^1.0.0", - "lodash": "^4.8.0", - "normalize-path": "^2.0.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.isplainobject": "^4.0.6", + "lodash.union": "^4.6.0", + "normalize-path": "^3.0.0", "readable-stream": "^2.0.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "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" - } - }, - "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==", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "requires": { - "safe-buffer": "~5.1.0" + "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" } } } }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, "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" } @@ -1181,12 +1625,6 @@ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", @@ -1202,15 +1640,6 @@ "resolved": "https://registry.npmjs.org/as-array/-/as-array-2.0.0.tgz", "integrity": "sha1-TwSAXYf4/OjlEbwhCPjl46KH1Uc=" }, - "ascli": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ascli/-/ascli-1.0.1.tgz", - "integrity": "sha1-vPpZdKYvGOgcq660lzKrSoj5Brw=", - "requires": { - "colour": "~0.7.1", - "optjs": "~3.2.2" - } - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -1238,6 +1667,11 @@ "lodash": "^4.17.10" } }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1249,9 +1683,9 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" }, "axios": { "version": "0.18.1", @@ -1260,55 +1694,6 @@ "requires": { "follow-redirects": "1.5.10", "is-buffer": "^2.0.2" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "requires": { - "debug": "=3.1.0" - } - }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" - } - } - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - } } }, "balanced-match": { @@ -1317,9 +1702,9 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" }, "basic-auth": { "version": "2.0.1", @@ -1342,110 +1727,191 @@ "tweetnacl": "^0.14.3" } }, + "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==" + }, "bignumber.js": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", - "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", + "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==" + }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==" }, "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", + "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "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" - } - }, - "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==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "safe-buffer": "~5.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } }, + "blakejs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/blakejs/-/blakejs-1.1.0.tgz", + "integrity": "sha1-ad+S75U6qIylGjLfarHFShVfx6U=" + }, + "bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=" + }, "body-parser": { - "version": "1.18.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", - "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "bytes": "3.0.0", + "bytes": "3.1.0", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "~1.6.3", - "iconv-lite": "0.4.23", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.5.2", - "raw-body": "2.3.3", - "type-is": "~1.6.16" + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.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==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } } }, "boxen": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", - "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", - "requires": { - "ansi-align": "^2.0.0", - "camelcase": "^4.0.0", - "chalk": "^2.0.1", - "cli-boxes": "^1.0.0", - "string-width": "^2.0.0", - "term-size": "^1.2.0", - "widest-line": "^2.0.0" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" }, "dependencies": { "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "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==", + "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==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "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=" + "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==" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" } } } @@ -1459,6 +1925,14 @@ "concat-map": "0.0.1" } }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", @@ -1466,28 +1940,14 @@ "dev": true }, "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" } }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" - }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -1498,72 +1958,59 @@ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" - }, "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==" }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "bun": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/bun/-/bun-0.0.12.tgz", - "integrity": "sha512-Toms18J9DqnT+IfWkwxVTB2EaBprHvjlMWrTIsfX4xbu3ZBqVBwrERU0em1IgtRe04wT+wJxMlKHZok24hrcSQ==", - "requires": { - "readable-stream": "~1.0.32" - } + "buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==" }, - "bytebuffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/bytebuffer/-/bytebuffer-5.0.1.tgz", - "integrity": "sha1-WC7qSxqHO20CCkjVjfhfC7ps/d0=", - "requires": { - "long": "~3" - }, - "dependencies": { - "long": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", - "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" - } - } + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacheable-lookup": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.3.tgz", + "integrity": "sha512-W+JBqF9SWe18A72XFzN/V/CULFzPm7sBXzzR6ekkE+3tLG72wFZrBiBZhrZuDoYexop4PHJVdFAKb/Nj9+tm9w==", + "dev": true }, "cacheable-request": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.0.0.tgz", - "integrity": "sha512-2N7AmszH/WPPpl5Z3XMw1HAP+8d+xugnKQAeKvxFZ/04dbT/CAznqwbl+7eSr3HkwdepNwtb2yx3CAMQWvG01Q==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", "requires": { "clone-response": "^1.0.2", - "get-stream": "^4.0.0", + "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^3.0.0", - "lowercase-keys": "^1.0.1", - "normalize-url": "^3.1.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", "responselike": "^1.0.2" }, "dependencies": { "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { "pump": "^3.0.0" } }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -1575,16 +2022,30 @@ } } }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "capture-stack-trace": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==" }, + "cardinal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", + "integrity": "sha1-fMEFXYItISlU0HsIXeolHMe8VQU=", + "requires": { + "ansicolors": "~0.3.2", + "redeyed": "~2.1.0" + } + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -1604,6 +2065,14 @@ "type-detect": "^4.0.5" } }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -1612,24 +2081,6 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } } }, "char-spinner": { @@ -1637,6 +2088,11 @@ "resolved": "https://registry.npmjs.org/char-spinner/-/char-spinner-1.0.1.tgz", "integrity": "sha1-5upnvSR+EHESmDt6sEee02KAAIE=" }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -1653,15 +2109,31 @@ "promise-polyfill": "^6.0.1" } }, + "chokidar": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", + "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, "chownr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", - "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "optional": true }, "ci-info": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", - "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cjson": { "version": "0.3.3", @@ -1672,9 +2144,9 @@ } }, "cli-boxes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", - "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" }, "cli-color": { "version": "1.4.0", @@ -1690,17 +2162,17 @@ } }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "^2.0.0" } }, "cli-spinners": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==" }, "cli-table": { "version": "0.3.1", @@ -1735,20 +2207,86 @@ } }, "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==" }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "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==", + "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==" + }, + "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==" + }, + "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==", + "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==", + "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==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } } }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -1762,6 +2300,15 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, + "color": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", + "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1775,15 +2322,28 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, + "color-string": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.4.tgz", + "integrity": "sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, - "colour": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/colour/-/colour-0.7.1.tgz", - "integrity": "sha1-nLFpkX7F0SwHNtPoaFdG3xyt93g=" + "colorspace": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", + "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", + "requires": { + "color": "3.0.x", + "text-hex": "1.0.x" + } }, "combined-stream": { "version": "1.0.7", @@ -1793,11 +2353,6 @@ "delayed-stream": "~1.0.0" } }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" - }, "compare-semver": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/compare-semver/-/compare-semver-1.1.0.tgz", @@ -1807,57 +2362,35 @@ } }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "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 }, "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-2.1.1.tgz", + "integrity": "sha512-eVw6n7CnEMFzc3duyFVrQEuY1BlHR3rYsSztyG32ibGMW722i3C6IizEGMFmfMU+A+fALvBIwxN3czffTcdA+Q==", "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "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" - } - }, - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - } + "buffer-crc32": "^0.2.13", + "crc32-stream": "^3.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^2.3.6" } }, "compressible": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.15.tgz", - "integrity": "sha512-4aE67DL33dSW9gw4CI2H/yTxqHLNcxp0yS6jB+4h+wr3e43+1z7vm0HU9qXOH8j+qjKuL8+UtkOxYQSMq60Ylw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { - "mime-db": ">= 1.36.0 < 2" + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + } } }, "compression": { @@ -1874,23 +2407,18 @@ "vary": "~1.1.2" }, "dependencies": { - "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "mime-db": ">= 1.40.0 < 2" + "ms": "2.0.0" } - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" - }, - "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==" } } }, @@ -1908,43 +2436,14 @@ "inherits": "^2.0.3", "readable-stream": "^2.2.2", "typedarray": "^0.0.6" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "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" - } - }, - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "configstore": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-4.0.0.tgz", - "integrity": "sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.5.tgz", + "integrity": "sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==", "requires": { - "dot-prop": "^4.1.0", + "dot-prop": "^4.2.1", "graceful-fs": "^4.1.2", "make-dir": "^1.0.0", "unique-string": "^1.0.0", @@ -1953,34 +2452,23 @@ } }, "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "requires": { "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", "utils-merge": "1.0.1" }, "dependencies": { - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - } - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } } } }, @@ -1999,10 +2487,19 @@ } } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "optional": true + }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } }, "content-type": { "version": "1.0.4", @@ -2010,9 +2507,9 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" }, "cookie-signature": { "version": "1.0.6", @@ -2048,39 +2545,22 @@ } }, "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-3.0.1.tgz", + "integrity": "sha512-mctvpXlbzsvK+6z8kJwSJ5crm7yBwrQMTybJzMw1O4lLGJqjlDCXY2Zw7KheiA6XBEcBmfLx1D88mjRGVJtY9w==", "requires": { "crc": "^3.4.4", - "readable-stream": "^2.0.0" + "readable-stream": "^3.4.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "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" - } - }, - "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==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "safe-buffer": "~5.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } @@ -2094,12 +2574,11 @@ } }, "cross-env": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.0.tgz", - "integrity": "sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.2.1.tgz", + "integrity": "sha512-1yHhtcfAd1r4nwQgknowuUNfIT9E8dOMMspC36g45dN+iD1blloi7xp8X/xAIDnjHWyt1uQ8PHk2fkNaym7soQ==", "requires": { - "cross-spawn": "^6.0.5", - "is-windows": "^1.0.0" + "cross-spawn": "^6.0.5" }, "dependencies": { "cross-spawn": { @@ -2161,6 +2640,11 @@ "util-deprecate": "~1.0.1" } }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, "through2": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.1.tgz", @@ -2178,11 +2662,12 @@ "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" }, "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "requires": { - "es5-ext": "^0.10.9" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, "dashdash": { @@ -2193,15 +2678,20 @@ "assert-plus": "^1.0.0" } }, + "date-and-time": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.14.1.tgz", + "integrity": "sha512-M4RggEH5OF2ZuCOxgOU67R6Z9ohjKbxGvAQz48vj53wLmL0bAgumkBvycR32f30pK+Og9pIR+RFDyChbaE4oLA==" + }, "dayjs": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.8.0.tgz", - "integrity": "sha512-2ofInmfMKLLR5R02q3WEUuDt86UK33VQQTaEeJudF+C04ZUaekCP3VpB0NJPiyPDCGJWq9XYhHX2AemdxA8+dg==" + "version": "1.9.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.9.6.tgz", + "integrity": "sha512-HngNLtPEBWRo8EFVmHFmSXAjtCX8rGNqeXQI0Gh7wCTSqwaKgPIDqu9m07wABVopNwzvOeCb+2711vQhDlcIXw==" }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "requires": { "ms": "2.0.0" } @@ -2233,31 +2723,50 @@ "type-detect": "^4.0.0" } }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, + "deep-freeze": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz", + "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" + }, "deepmerge": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", - "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==" + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } }, "defer-to-connect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.0.2.tgz", - "integrity": "sha512-k09hcQcTDY+cwgiwa6PYKLm3jlagNzQ+RSvhjzESOGOx+MNOuXkxTfEvPrO1IOQ81tArCFYQgi631clB70RpQw==" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -2268,30 +2777,41 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "didyoumean": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", - "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=" + "dicer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.3.0.tgz", + "integrity": "sha512-MdceRRWqltEG2dZqO769g27N/3PXfcKl04VhYnBlo2YhH7zPi88VebsjTKclaOyiuMaGU72hTfw3VkUitGcVCA==", + "requires": { + "streamsearch": "0.1.2" + } }, "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, - "dom-storage": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", - "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" - }, "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.1.tgz", + "integrity": "sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==", "requires": { "is-obj": "^1.0.0" } }, + "dotenv": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-6.2.0.tgz", + "integrity": "sha512-HygQCKUBSFl8wKQZBSemMywRWcEDNidvNbjGVyZu3nbZ8qq9ubiPoGLMdRDpfSrpkkm9BXYFkpKxxFX38o/76w==" + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "requires": { + "readable-stream": "^2.0.2" + } + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -2359,6 +2879,16 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "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==" + }, + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -2377,14 +2907,19 @@ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==" + }, "es5-ext": { - "version": "0.10.49", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz", - "integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==", + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", "requires": { "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" } }, "es6-iterator": { @@ -2398,9 +2933,9 @@ } }, "es6-promise": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==" + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" }, "es6-promisify": { "version": "5.0.0", @@ -2410,38 +2945,31 @@ "es6-promise": "^4.0.3" } }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" - } - }, "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "^1.0.1", + "ext": "^1.1.2" } }, "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", + "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "requires": { "d": "1", - "es5-ext": "^0.10.14", - "es6-iterator": "^2.0.1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", "es6-symbol": "^3.1.1" } }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -2455,14 +2983,7 @@ "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 - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "etag": { "version": "1.8.1", @@ -2478,11 +2999,21 @@ "es5-ext": "~0.10.14" } }, + "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==" + }, "eventemitter3": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=" }, + "events-listener": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/events-listener/-/events-listener-1.1.0.tgz", + "integrity": "sha512-Kd3EgYfODHueq6GzVfs/VUolh2EgJsS8hkO3KpnDrxVjU3eq63eXM2ujXkhPP+OkeUOhL8CxdfZbQXzryb5C4g==" + }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", @@ -2509,51 +3040,128 @@ } } }, + "exegesis": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/exegesis/-/exegesis-2.5.6.tgz", + "integrity": "sha512-e+YkH/zZTN2njiwrV8tY6tHGDsFu3LyR/YbrqdWvDZaAJ5YGWaBYyd3oX/Y26iGqQc+7jLEKLDTv2UPzjAYL8w==", + "requires": { + "@apidevtools/json-schema-ref-parser": "^9.0.3", + "ajv": "^6.12.2", + "body-parser": "^1.18.3", + "content-type": "^1.0.4", + "deep-freeze": "0.0.1", + "events-listener": "^1.1.0", + "glob": "^7.1.3", + "json-ptr": "^1.3.1", + "json-schema-traverse": "^0.4.1", + "lodash": "^4.17.11", + "openapi3-ts": "^1.2.0", + "promise-breaker": "^5.0.0", + "pump": "^3.0.0", + "qs": "^6.6.0", + "raw-body": "^2.3.3", + "semver": "^7.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==" + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==" + } + } + }, + "exegesis-express": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/exegesis-express/-/exegesis-express-2.0.0.tgz", + "integrity": "sha512-NKvKBsBa2OvU+1BFpWbz3PzoRMhA9q7/wU2oMmQ9X8lPy/FRatADvhlkGO1zYOMgeo35k1ZLO9ZV0uIs9pPnXg==", + "requires": { + "exegesis": "^2.0.0" + } + }, "exit-code": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/exit-code/-/exit-code-1.0.2.tgz", "integrity": "sha1-zhZYEcnxF69qX4gpQLlq5/muzDQ=" }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=" - }, "express": { - "version": "4.16.4", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", - "integrity": "sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg==", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "~1.3.5", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.3", - "content-disposition": "0.5.2", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", "content-type": "~1.0.4", - "cookie": "0.3.1", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.1.1", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.4", - "qs": "6.5.2", - "range-parser": "~1.2.0", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", "safe-buffer": "5.1.2", - "send": "0.16.2", - "serve-static": "1.13.2", - "setprototypeof": "1.1.0", - "statuses": "~1.4.0", - "type-is": "~1.6.16", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + } + } + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.1.0.tgz", + "integrity": "sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA==" + } } }, "extend": { @@ -2561,6 +3169,16 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -2572,19 +3190,24 @@ "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" }, "fast-deep-equal": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-safe-stringify": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", + "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" }, "fast-text-encoding": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", - "integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" }, "fast-url-parser": { "version": "1.1.3", @@ -2602,25 +3225,67 @@ } }, "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "requires": { "websocket-driver": ">=0.5.1" } }, + "fecha": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", + "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" + }, "ffmpeg-static": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-2.4.0.tgz", - "integrity": "sha512-OcYTewd3we/Zi4W+VJtEqrfDzRSMwLs0NyAa61qw/FqtbttidGrm+BFsq44prtT3s6/LV6+aoXNpyNBOshXBuA==" + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/ffmpeg-static/-/ffmpeg-static-4.2.7.tgz", + "integrity": "sha512-SGnOr2d+k0/9toRIv9t5/hN/DMYbm5XMtG0wVwGM1tEyXJAD6dbcWOEvfHq4LOySm9uykKL6LMC4eVPeteUnbQ==", + "requires": { + "@derhuerst/http-basic": "^8.2.0", + "env-paths": "^2.2.0", + "https-proxy-agent": "^5.0.0", + "progress": "^2.0.3" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "^1.0.5" } }, "filesize": { @@ -2628,18 +3293,36 @@ "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==" }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + } } }, "find-up": { @@ -2650,118 +3333,55 @@ "locate-path": "^2.0.0" } }, - "firebase": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-2.4.2.tgz", - "integrity": "sha1-ThEZ7AOWylYdinrL/xYw/qxsCjE=", - "requires": { - "faye-websocket": ">=0.6.0" + "firebase-admin": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-9.4.1.tgz", + "integrity": "sha512-y9r2Mz2x1WTr60YrCDqz8Lw70DlwIvRIieVltP+UdRogkVpfnvyd+bi4D0KPlujW3teqcFPmxuzsXB+DP5vGfQ==", + "requires": { + "@firebase/database": "^0.6.10", + "@firebase/database-types": "^0.5.2", + "@google-cloud/firestore": "^4.5.0", + "@google-cloud/storage": "^5.3.0", + "@types/node": "^10.10.0", + "dicer": "^0.3.0", + "jsonwebtoken": "^8.5.1", + "node-forge": "^0.10.0" }, "dependencies": { - "faye-websocket": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.9.3.tgz", - "integrity": "sha1-SCpQWw3wrmJrlphm0710DNuWLoM=", - "requires": { - "websocket-driver": ">=0.5.1" - }, - "dependencies": { - "websocket-driver": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.5.2.tgz", - "integrity": "sha1-jHyF2gcTtAYFVrTXHAF3XuEmnrk=", - "requires": { - "websocket-extensions": ">=0.1.1" - } - } - } + "@types/node": { + "version": "10.17.46", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.46.tgz", + "integrity": "sha512-Tice8a+sJtlP9C1EUo0DYyjq52T37b3LexVu3p871+kfIBIN+OQ7PKPei1oF3MgF39olEpUfxaLtD+QFc1k69Q==" + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" } } }, - "firebase-admin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/firebase-admin/-/firebase-admin-7.0.0.tgz", - "integrity": "sha512-uYJVRuq8/b9PeJrgZwE2OIfr/MQAVhWxUpOa4AnWEEjzM7hzw2CQjY2iFzH6o0/7rTyAiGeFPQQQLBMg/xuQ6w==", - "requires": { - "@firebase/app": "^0.3.4", - "@firebase/database": "^0.3.6", - "@google-cloud/firestore": "^1.0.1", - "@google-cloud/storage": "^2.3.0", - "@types/node": "^8.0.53", - "jsonwebtoken": "8.1.0", - "node-forge": "0.7.4" - } - }, "firebase-functions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-2.3.0.tgz", - "integrity": "sha512-bUhaX5aW5SaLxDsC+F7Phbbb4KPPYyn4XlhqR8jdQCbiQMC9udxIOYy21d+vGR2XvSPH2fE7vgHsvOOzEQ0SmQ==", - "requires": { - "@types/cors": "^2.8.1", - "@types/express": "^4.11.1", - "@types/jsonwebtoken": "^7.2.6", - "@types/lodash": "^4.14.34", - "cors": "^2.8.4", - "express": "^4.16.2", - "jsonwebtoken": "^8.2.1", - "lodash": "^4.6.1" + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/firebase-functions/-/firebase-functions-3.11.0.tgz", + "integrity": "sha512-i1uMhZ/M6i5SCI3ulKo7EWX0/LD+I5o6N+sk0HbOWfzyWfOl0iJTvQkR3BVDcjrlhPVC4xG1bDTLxd+DTkLqaw==", + "requires": { + "@types/express": "4.17.3", + "cors": "^2.8.5", + "express": "^4.17.1", + "lodash": "^4.17.14" }, "dependencies": { - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", - "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" - } - }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", - "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "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==" + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" } } }, "firebase-functions-test": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-0.1.6.tgz", - "integrity": "sha512-sITLbQunI75gL690qFOq4mqxUEcdETEbY4HcLFawWVJC3PmlSFt81mhfZjJe45GJTt1+7xeowaHQx3jpnoPNpA==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/firebase-functions-test/-/firebase-functions-test-0.2.3.tgz", + "integrity": "sha512-zYX0QTm53wCazuej7O0xqbHl90r/v1PTXt/hwa0jo1YF8nDM+iBKnLDlkIoW66MDd0R6aGg4BvKzTTdJpvigUA==", "dev": true, "requires": { "@types/lodash": "^4.14.104", @@ -2769,208 +3389,418 @@ } }, "firebase-tools": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/firebase-tools/-/firebase-tools-6.7.1.tgz", - "integrity": "sha512-8JZ2QA1gylgmlGNULrhTtkk5iS+OumCoJEgK+RNLt/ji1hSxzZehWCb13jHtqCRNRz+Kt+uwsrmExbhsNNqiBw==", + "version": "8.16.2", + "resolved": "https://registry.npmjs.org/firebase-tools/-/firebase-tools-8.16.2.tgz", + "integrity": "sha512-3deje+CJ5XtYDsb92YqKdNZaV6+OBJqGA2zatozSaBaKpVkIqTyt9vpglKaar/9N+UIqsIfpjruLS6dCkVk/Gg==", "requires": { - "@google-cloud/functions-emulator": "^1.0.0-beta.5", + "@google-cloud/pubsub": "^1.7.0", "JSONStream": "^1.2.1", - "archiver": "^2.1.1", + "abort-controller": "^3.0.0", + "archiver": "^3.0.0", + "body-parser": "^1.19.0", + "chokidar": "^3.0.2", "cjson": "^0.3.1", "cli-color": "^1.2.0", "cli-table": "^0.3.1", - "commander": "^2.8.1", - "configstore": "^1.2.0", + "commander": "^4.0.1", + "configstore": "^5.0.1", "cross-env": "^5.1.3", - "cross-spawn": "^4.0.0", + "cross-spawn": "^7.0.1", "csv-streamify": "^3.0.4", - "didyoumean": "^1.2.1", - "es6-set": "^0.1.4", + "dotenv": "^6.1.0", + "exegesis-express": "^2.0.0", "exit-code": "^1.0.2", + "express": "^4.16.4", "filesize": "^3.1.3", - "firebase": "2.x.x", "fs-extra": "^0.23.1", "glob": "^7.1.2", - "google-auto-auth": "^0.7.2", - "inquirer": "^0.12.0", - "is": "^3.2.1", + "google-auth-library": "^5.5.0", + "google-gax": "~1.12.0", + "inquirer": "~6.3.1", + "js-yaml": "^3.13.1", "jsonschema": "^1.0.2", "jsonwebtoken": "^8.2.1", - "lodash": "^4.17.10", + "leven": "^3.1.0", + "lodash": "^4.17.19", + "marked": "^0.7.0", + "marked-terminal": "^3.3.0", "minimatch": "^3.0.4", - "opn": "^5.5.0", - "ora": "0.2.3", - "portfinder": "^1.0.13", - "progress": "^2.0.0", + "morgan": "^1.10.0", + "node-fetch": "^2.6.1", + "open": "^6.3.0", + "ora": "^3.4.0", + "plist": "^3.0.1", + "portfinder": "^1.0.23", + "progress": "^2.0.3", "request": "^2.87.0", - "semver": "^5.0.3", - "superstatic": "^6.0.1", + "rimraf": "^3.0.0", + "semver": "^5.7.1", + "superstatic": "^7.0.0", "tar": "^4.3.0", + "tcp-port-used": "^1.0.1", "tmp": "0.0.33", + "triple-beam": "^1.3.0", + "tweetsodium": "0.0.5", "universal-analytics": "^0.4.16", - "update-notifier": "^2.5.0", - "user-home": "^2.0.0", + "unzipper": "^0.10.10", + "update-notifier": "^4.1.0", "uuid": "^3.0.0", - "winston": "^1.0.1" + "winston": "^3.0.0", + "ws": "^7.2.3" }, "dependencies": { + "@grpc/grpc-js": { + "version": "0.6.18", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.6.18.tgz", + "integrity": "sha512-uAzv/tM8qpbf1vpx1xPMfcUMzbfdqJtdCYAqY/LsLeQQlnTb4vApylojr+wlCyr7bZeg3AFfHvtihnNOQQt/nA==", + "requires": { + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, "configstore": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-1.4.0.tgz", - "integrity": "sha1-w1eB0FAdJowlxUuLF/YkDopPsCE=", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "requires": { + "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.1", - "os-tmpdir": "^1.0.0", - "osenv": "^0.1.0", - "uuid": "^2.0.1", - "write-file-atomic": "^1.1.2", - "xdg-basedir": "^2.0.0" + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "gaxios": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz", + "integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + }, + "gcp-metadata": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.5.0.tgz", + "integrity": "sha512-ZQf+DLZ5aKcRpLzYUyBS3yo3N0JSa82lNDO8rj3nMSlovLcz2riKFBsYgDzeXcv75oo5eqB2lx+B14UvPoCRnA==", + "requires": { + "gaxios": "^2.1.0", + "json-bigint": "^0.3.0" + } + }, + "google-auth-library": { + "version": "5.10.1", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz", + "integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^2.1.0", + "gcp-metadata": "^3.4.0", + "gtoken": "^4.1.0", + "jws": "^4.0.0", + "lru-cache": "^5.0.0" + } + }, + "google-gax": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.12.0.tgz", + "integrity": "sha512-BeeoxVO6y9K20gUsexUwptutd0PfrTItrA02JWwwstlBIOAcvgFp86MHWufQsnrkPVhxBjHXq65aIkSejtJjDg==", + "requires": { + "@grpc/grpc-js": "^0.6.12", + "@grpc/proto-loader": "^0.5.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^3.6.0", + "google-auth-library": "^5.0.0", + "is-stream-ended": "^0.1.4", + "lodash.at": "^4.6.0", + "lodash.has": "^4.5.2", + "node-fetch": "^2.6.0", + "protobufjs": "^6.8.8", + "retry-request": "^4.0.0", + "semver": "^6.0.0", + "walkdir": "^0.4.0" }, "dependencies": { - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=" + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, - "ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "google-p12-pem": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz", + "integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==", + "requires": { + "node-forge": "^0.9.0" + } + }, + "gtoken": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz", + "integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==", "requires": { - "safe-buffer": "^5.0.1" + "gaxios": "^2.1.0", + "google-p12-pem": "^2.0.0", + "jws": "^4.0.0", + "mime": "^2.2.0" } }, - "gcp-metadata": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.3.1.tgz", - "integrity": "sha512-5kJPX/RXuqoLmHiOOgkSDk/LI0QaXpEvZ3pvQP4ifjGGDKZKVSOjL/GcDjXA5kLxppFCOjmmsu0Uoop9d1upaQ==", + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "requires": { - "extend": "^3.0.0", - "retry-request": "^3.0.0" + "agent-base": "6", + "debug": "4" } }, - "google-auth-library": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-0.10.0.tgz", - "integrity": "sha1-bhW6vuhf0d0U2NEoopW2g41SE24=", + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "json-bigint": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.1.tgz", + "integrity": "sha512-DGWnSzmusIreWlEupsUelHrhwmPPE+FiQvg+drKfk2p+bdEYa5mp4PJ8JsCWqae0M2jQNb0HPvnwvf1qOTThzQ==", "requires": { - "gtoken": "^1.2.1", - "jws": "^3.1.4", - "lodash.noop": "^3.0.1", - "request": "^2.74.0" + "bignumber.js": "^9.0.0" } }, - "google-auto-auth": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/google-auto-auth/-/google-auto-auth-0.7.2.tgz", - "integrity": "sha512-ux2n2AE2g3+vcLXwL4dP/M12SFMRX5dzCzBfhAEkTeAB7dpyGdOIEj7nmUx0BHKaCcUQrRWg9kT63X/Mmtk1+A==", + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", "requires": { - "async": "^2.3.0", - "gcp-metadata": "^0.3.0", - "google-auth-library": "^0.10.0", - "request": "^2.79.0" + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "google-p12-pem": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-0.1.2.tgz", - "integrity": "sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=", + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", "requires": { - "node-forge": "^0.7.1" + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" } }, - "gtoken": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-1.2.3.tgz", - "integrity": "sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==", + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "requires": { - "google-p12-pem": "^0.1.0", - "jws": "^3.0.0", - "mime": "^1.4.1", - "request": "^2.72.0" + "yallist": "^3.0.2" } }, - "jsonwebtoken": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", - "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^5.6.0" + "semver": "^6.0.0" }, "dependencies": { - "jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "requires": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, - "jwa": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", - "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node-forge": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.2.tgz", + "integrity": "sha512-naKSScof4Wn+aoHU6HBsifh92Zeicm1GDQKd1vp3Y/kOi8ub0DozCa9KpvYNCXslFHYRmLNiqRopGdTGwNLpNw==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "buffer-equal-constant-time": "1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, - "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==" + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } }, - "retry-request": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-3.3.2.tgz", - "integrity": "sha512-WIiGp37XXDC6e7ku3LFoi7LCL/Gs9luGeeqvbPRb+Zl6OQMw4RCRfSaW+aLfE6lhz1R941UavE6Svl3Dm5xGIQ==", + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "requires": { - "request": "^2.81.0", - "through2": "^2.0.0" + "crypto-random-string": "^2.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "winston": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", + "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", + "requires": { + "@dabh/diagnostics": "^2.0.2", + "async": "^3.1.0", + "is-stream": "^2.0.0", + "logform": "^2.2.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.4.0" } }, "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=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "requires": { - "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } }, "xdg-basedir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", - "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", - "requires": { - "os-homedir": "^1.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-arguments": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/flat-arguments/-/flat-arguments-1.0.2.tgz", @@ -3023,6 +3853,19 @@ "which": "^1.1.1" } }, + "fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -3039,9 +3882,9 @@ } }, "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.2.tgz", + "integrity": "sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==", "dev": true }, "forwarded": { @@ -3061,35 +3904,6 @@ "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "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" - } - }, - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "fs-constants": { @@ -3106,14 +3920,25 @@ "jsonfile": "^2.1.0", "path-is-absolute": "^1.0.0", "rimraf": "^2.2.8" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } } }, "fs-minipass": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", - "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^3.0.0" } }, "fs.realpath": { @@ -3121,19 +3946,71 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "optional": true + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, "gaxios": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.2.6.tgz", - "integrity": "sha512-A7IVK12d5SavNAGTtL5aBDJ6auqWDCbyMazX+QQIklMdashrIZs4QIm1a6TpenJYy0OskCks2sMqglGt6ZThEQ==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.8.4.tgz", + "integrity": "sha512-BoENMnu1Gav18HcpV9IleMPZ9exM+AvUjrAOV4Mzs/vfz2Lu/ABv451iEXByKiMPn2M140uul1txXCg83sAENw==", "requires": { + "abort-controller": "^3.0.0", "extend": "^3.0.2", "https-proxy-agent": "^2.2.1", - "node-fetch": "^2.2.0" + "node-fetch": "^2.3.0" } }, "gcp-metadata": { @@ -3147,55 +4024,15 @@ } }, "gcs-resumable-upload": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.13.0.tgz", - "integrity": "sha512-hrSYPFJWyx8FDLJEK3XeqbNcCjkRqcuKSaUxL1RpwEAWAxtV+AdUH+NX3n7st/U6/JddQkdb1mmWAy3jgRDflw==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-0.10.2.tgz", + "integrity": "sha1-fymz7iPc7EFwNnwHEUGCScZgVF8=", "requires": { - "axios": "^0.18.0", - "configstore": "^4.0.0", - "google-auth-library": "^2.0.0", - "pumpify": "^1.5.1", - "request": "^2.87.0", - "stream-events": "^1.0.4" - }, - "dependencies": { - "gcp-metadata": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz", - "integrity": "sha512-ffjC09amcDWjh3VZdkDngIo7WoluyC5Ag9PAYxZbmQLOLNI8lvPtoKTSCyU54j2gwy5roZh6sSMTfkY2ct7K3g==", - "requires": { - "axios": "^0.18.0", - "extend": "^3.0.1", - "retry-axios": "0.3.2" - } - }, - "google-auth-library": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-2.0.2.tgz", - "integrity": "sha512-FURxmo1hBVmcfLauuMRKOPYAPKht3dGuI2wjeJFalDUThO0HoYVjr4yxt5cgYSFm1dgUpmN9G/poa7ceTFAIiA==", - "requires": { - "axios": "^0.18.0", - "gcp-metadata": "^0.7.0", - "gtoken": "^2.3.0", - "https-proxy-agent": "^2.2.1", - "jws": "^3.1.5", - "lru-cache": "^5.0.0", - "semver": "^5.5.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" - } + "configstore": "^3.1.2", + "google-auto-auth": "^0.10.0", + "pumpify": "^1.4.0", + "request": "^2.85.0", + "stream-events": "^1.0.3" } }, "get-caller-file": { @@ -3235,6 +4072,14 @@ "path-is-absolute": "^1.0.0" } }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "requires": { + "is-glob": "^4.0.1" + } + }, "glob-slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/glob-slash/-/glob-slash-1.0.0.tgz", @@ -3251,50 +4096,153 @@ } }, "global-dirs": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", "requires": { - "ini": "^1.3.4" + "ini": "^1.3.5" } }, "google-auth-library": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.1.0.tgz", - "integrity": "sha512-EntjrOgSffw5EhZGoV8+ROPwEK/aQpoMZaULw3bKailEGdjaUI25PmmFc4AN6vG/Q24YEUiuLxtTXa1Usar5Eg==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.1.3.tgz", + "integrity": "sha512-m9mwvY3GWbr7ZYEbl61isWmk+fvTmOt0YNUfPOUY2VH8K5pZlAIWJjxEi0PqR3OjMretyiQLI6GURMrPSwHQ2g==", "requires": { + "arrify": "^2.0.0", "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", "fast-text-encoding": "^1.0.0", - "gaxios": "^1.2.1", - "gcp-metadata": "^0.9.3", - "gtoken": "^2.3.2", - "https-proxy-agent": "^2.2.1", - "jws": "^3.1.5", - "lru-cache": "^5.0.0", - "semver": "^5.5.0" + "gaxios": "^4.0.0", + "gcp-metadata": "^4.2.0", + "gtoken": "^5.0.4", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" }, "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "gaxios": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-4.0.1.tgz", + "integrity": "sha512-jOin8xRZ/UytQeBpSXFqIzqU7Fi5TqgPNLlUsSB8kjJ76+FiGBfImF8KJu++c6J4jOldfJUtt0YmkRj2ZpSHTQ==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + }, "gcp-metadata": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.9.3.tgz", - "integrity": "sha512-caV4S84xAjENtpezLCT/GILEAF5h/bC4cNqZFmt/tjTn8t+JBtTkQrgBrJu3857YdsnlM8rxX/PMcKGtE8hUlw==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.2.1.tgz", + "integrity": "sha512-tSk+REe5iq/N+K+SK1XjZJUrFPuDqGZVzCy2vocIHIGmPlTGsa8owXMJwGkrXr73NO0AzhPW4MF2DEHz7P2AVw==", + "requires": { + "gaxios": "^4.0.0", + "json-bigint": "^1.0.0" + } + }, + "google-p12-pem": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.3.tgz", + "integrity": "sha512-wS0ek4ZtFx/ACKYF3JhyGe5kzH7pgiQ7J5otlumqR9psmWMYc+U9cErKlCYVYHoUaidXHdZ2xbo34kB+S+24hA==", + "requires": { + "node-forge": "^0.10.0" + } + }, + "gtoken": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.1.0.tgz", + "integrity": "sha512-4d8N6Lk8TEAHl9vVoRVMh9BNOKWVgl2DdNtr3428O75r3QFrF/a5MMu851VmK0AA8+iSvbwRv69k5XnMLURGhg==", + "requires": { + "gaxios": "^4.0.0", + "google-p12-pem": "^3.0.3", + "jws": "^4.0.0", + "mime": "^2.2.0" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", "requires": { - "gaxios": "^1.0.2", - "json-bigint": "^0.3.0" + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" } }, "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "yallist": "^3.0.2" + "yallist": "^4.0.0" } }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -3326,104 +4274,61 @@ } }, "google-gax": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-0.24.0.tgz", - "integrity": "sha512-x+eeMgHlAFXScvuw3gm0r/DkN8519QtdST8U0KMt934dwfsavF2iFvOhnXaNvEL99CXtDImOON+NqkTfIzq/FQ==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.9.2.tgz", + "integrity": "sha512-Pve4osEzNKpBZqFXMfGKBbKCtgnHpUe5IQMh5Ou+Xtg8nLcba94L3gF0xgM5phMdGRRqJn0SMjcuEVmOYu7EBg==", "requires": { - "@grpc/grpc-js": "^0.3.0", - "@grpc/proto-loader": "^0.4.0", - "duplexify": "^3.6.0", - "google-auth-library": "^3.0.0", - "google-proto-files": "^0.18.0", - "grpc": "^1.16.0", + "@grpc/grpc-js": "~1.1.1", + "@grpc/proto-loader": "^0.5.1", + "@types/long": "^4.0.0", + "abort-controller": "^3.0.0", + "duplexify": "^4.0.0", + "google-auth-library": "^6.1.3", "is-stream-ended": "^0.1.4", - "lodash.at": "^4.6.0", - "lodash.has": "^4.5.2", - "protobufjs": "^6.8.8", - "retry-request": "^4.0.0", - "semver": "^5.5.1", - "walkdir": "0.0.12" + "node-fetch": "^2.6.1", + "protobufjs": "^6.9.0", + "retry-request": "^4.0.0" }, "dependencies": { - "@grpc/proto-loader": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.4.0.tgz", - "integrity": "sha512-Jm6o+75uWT7E6+lt8edg4J1F/9+BedOjaMgwE14pxS/AO43/0ZqK+rCLVVrXLoExwSAZvgvOD2B0ivy3Spsspw==", - "requires": { - "lodash.camelcase": "^4.3.0", - "protobufjs": "^6.8.6" - } - }, - "gcp-metadata": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.9.3.tgz", - "integrity": "sha512-caV4S84xAjENtpezLCT/GILEAF5h/bC4cNqZFmt/tjTn8t+JBtTkQrgBrJu3857YdsnlM8rxX/PMcKGtE8hUlw==", - "requires": { - "gaxios": "^1.0.2", - "json-bigint": "^0.3.0" - } - }, - "google-auth-library": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.1.0.tgz", - "integrity": "sha512-EntjrOgSffw5EhZGoV8+ROPwEK/aQpoMZaULw3bKailEGdjaUI25PmmFc4AN6vG/Q24YEUiuLxtTXa1Usar5Eg==", + "duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", "requires": { - "base64-js": "^1.3.0", - "fast-text-encoding": "^1.0.0", - "gaxios": "^1.2.1", - "gcp-metadata": "^0.9.3", - "gtoken": "^2.3.2", - "https-proxy-agent": "^2.2.1", - "jws": "^3.1.5", - "lru-cache": "^5.0.0", - "semver": "^5.5.0" + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" } }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "yallist": "^3.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" } } }, "google-p12-pem": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.3.tgz", - "integrity": "sha512-KGnAiMMWaJp4j4tYVvAjfP3wCKZRLv9M1Nir2wRRNWUYO7j1aX8O9Qgz+a8/EQ5rAvuo4SIu79n6SIdkNl7Msg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.4.tgz", + "integrity": "sha512-SwLAUJqUfTB2iS+wFfSS/G9p7bt4eWcc2LyfvmUXe7cWp6p3mpxDo6LLI29MXdU6wvPcQ/up298X7GMC5ylAlA==", "requires": { - "node-forge": "^0.7.5", + "node-forge": "^0.8.0", "pify": "^4.0.0" }, "dependencies": { "node-forge": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz", - "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.8.5.tgz", + "integrity": "sha512-vFMQIWt+J/7FLNyKouZ9TazT74PRV3wgv9UT4cRjC8BffxFbKXkgIWR42URCPSnHm/QDz6BOlb2Q0U4+VQT67Q==" } } }, - "google-proto-files": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/google-proto-files/-/google-proto-files-0.18.0.tgz", - "integrity": "sha512-blJ5rA3TWEiZIw7Qm0GHNERDdZeezDj46wE4O5uGnOWpZI/STQjeI6rPbqiwjmxzG+b592Hrp2+GKYfbmKR+Lg==", - "requires": { - "protobufjs": "^6.8.0", - "walkdir": "0.0.12" - } - }, "googleapis": { "version": "23.0.2", "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-23.0.2.tgz", @@ -3481,498 +4386,153 @@ } }, "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "dependencies": { - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "grpc": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/grpc/-/grpc-1.18.0.tgz", - "integrity": "sha512-M0K67Zhv2ZzCjrTbQvjWgYFPB929L+qAVnbNgXepbfO5kJxUYc30dP8m8vb+o8QdahLHAeYfIqRoIzZRcCB98Q==", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.0.tgz", + "integrity": "sha512-k9noyoIIY9EejuhaBNLyZ31D5328LeqnyPNXJQb2XlJZcKakLqN5m6O/ikhq/0lw56kUYS54fVm+D1x57YC9oQ==", + "dev": true, "requires": { - "lodash.camelcase": "^4.3.0", - "lodash.clone": "^4.5.0", - "nan": "^2.0.0", - "node-pre-gyp": "^0.12.0", - "protobufjs": "^5.0.3" + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.1", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" }, "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.2", - "bundled": 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" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true - }, - "iconv-lite": { - "version": "0.4.23", - "bundled": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true - }, - "ini": { - "version": "1.3.5", - "bundled": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.0", - "bundled": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.1.1", - "bundled": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true - } - } - }, - "ms": { - "version": "2.0.0", - "bundled": true - }, - "needle": { - "version": "2.2.4", - "bundled": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.12.0", - "bundled": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.5", - "bundled": true - }, - "npm-packlist": { - "version": "1.1.12", - "bundled": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true - }, - "protobufjs": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-5.0.3.tgz", - "integrity": "sha512-55Kcx1MhPZX0zTbVosMQEO5R6/rikNXd9b6RQK4KSPcrSIIwoXTtebIczUrXlwaSrbz4x8XUVThGPob1n8I4QA==", - "requires": { - "ascli": "~1", - "bytebuffer": "~5", - "glob": "^7.0.5", - "yargs": "^3.10.0" - } - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": 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" - } + "@sindresorhus/is": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.0.0.tgz", + "integrity": "sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==", + "dev": true }, - "rimraf": { - "version": "2.6.2", - "bundled": true, + "@szmarczak/http-timer": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.5.tgz", + "integrity": "sha512-PyRA9sm1Yayuj5OIoJ1hGt2YISX45w9WcFbh6ddT0Z/0yaFxOtGLInr4jUfU1EAFVs0Yfyfev4RNwBlUaHdlDQ==", + "dev": true, "requires": { - "glob": "^7.0.5" + "defer-to-connect": "^2.0.0" } }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true - }, - "sax": { - "version": "1.2.4", - "bundled": true - }, - "semver": { - "version": "5.6.0", - "bundled": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true + "cacheable-request": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.1.tgz", + "integrity": "sha512-lt0mJ6YAnsrBErpTMWeu5kl/tg9xMAWjavYTN6VQXM1A/teBITuNcccXsCxF0tDQQJf9DfAaX5O4e0zp0KlfZw==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^2.0.0" + } }, - "string-width": { - "version": "1.0.2", - "bundled": true, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "mimic-response": "^3.1.0" } }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, + "defer-to-connect": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.0.tgz", + "integrity": "sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg==", + "dev": true + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "pump": "^3.0.0" } }, - "strip-ansi": { + "json-buffer": { "version": "3.0.1", - "bundled": true, + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "keyv": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.0.3.tgz", + "integrity": "sha512-zdGa2TOpSZPq5mU6iowDARnMBZgtCqJ11dJROFi6tg6kTn4nuUdU09lFyLFSaHrWqpIJ+EBq4E8/Dc0Vx5vLdA==", + "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "json-buffer": "3.0.1" } }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true }, - "tar": { - "version": "4.4.8", - "bundled": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true + "p-cancelable": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.0.0.tgz", + "integrity": "sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==", + "dev": true }, - "wide-align": { - "version": "1.1.3", - "bundled": 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": { - "string-width": "^1.0.2 || 2" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "wrappy": { - "version": "1.0.2", - "bundled": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true + "responselike": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.0.tgz", + "integrity": "sha512-xH48u3FTB9VsZw7R+vvgaKeLKzT6jOogbQhEe/jewwnZgzPcnyWui2Av6JpoYZF/91uueC+lqhWqeURw5/qhCw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } } } }, + "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==" + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, "gtoken": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.2.tgz", - "integrity": "sha512-F8EObUGyC8Qd3WXTloNULZBwfUsOABoHElihB1F6zGhT/cy38iPL09wGLRY712I+hQnOyA+sYlgPFX2cOKz0qg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.3.tgz", + "integrity": "sha512-EaB49bu/TCoNeQjhCYKI/CurooBKkGxIqFHsWABW0b25fobBYVTMe84A8EBVVZhl8emiUdNypil9huMOTmyAnw==", "requires": { "gaxios": "^1.0.4", "google-p12-pem": "^1.0.0", "jws": "^3.1.5", "mime": "^2.2.0", "pify": "^4.0.0" - }, - "dependencies": { - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - } } }, "har-schema": { @@ -3981,11 +4541,11 @@ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", "requires": { - "ajv": "^6.5.5", + "ajv": "^6.12.3", "har-schema": "^2.0.0" } }, @@ -4015,18 +4575,26 @@ "has-symbol-support-x": "^1.4.1" } }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, "hash-stream-validation": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.1.tgz", - "integrity": "sha1-7Mm5l7IYvluzEphii7gHhptz3NE=", - "requires": { - "through2": "^2.0.0" - } + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.4.tgz", + "integrity": "sha512-Gjzu0Xn7IagXVkSu9cSFuK1fqzwtLwFhNhVL8IFJijRNMgUttFbBSIAzKuSIrsFMO1+g1RlsoN49zPIbwPDMGQ==" }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "home-dir": { @@ -4035,25 +4603,26 @@ "integrity": "sha1-KRfrRL3JByztqUJXlUOEfjAX/k4=" }, "http-cache-semantics": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz", - "integrity": "sha512-TcIMG3qeVLgDr1TEd2XvHaTnMPwYQUQMIBLy+5pLSDKYFc7UIqj39w8EGzZkaxoLv/l2K8HaI0t5AVA+YYgUew==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" } }, "http-parser-js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w==" + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz", + "integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ==" }, "http-proxy": { "version": "1.16.2", @@ -4064,6 +4633,54 @@ "requires-port": "1.x.x" } }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "http-response-object": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", + "integrity": "sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==", + "requires": { + "@types/node": "^10.0.3" + }, + "dependencies": { + "@types/node": { + "version": "10.17.46", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.46.tgz", + "integrity": "sha512-Tice8a+sJtlP9C1EUo0DYyjq52T37b3LexVu3p871+kfIBIN+OQ7PKPei1oF3MgF39olEpUfxaLtD+QFc1k69Q==" + } + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -4074,6 +4691,16 @@ "sshpk": "^1.7.0" } }, + "http2-wrapper": { + "version": "1.0.0-beta.5.2", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz", + "integrity": "sha512-xYz9goEyBnC8XwXDTuC/MZ6t+MrKVQZOk4s7+PaDkwIsQd8IwqvM+0M6bA/2lvG8GHXcPdf+MejTUeO2LCPCeQ==", + "dev": true, + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, "https-proxy-agent": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", @@ -4081,29 +4708,6 @@ "requires": { "agent-base": "^4.3.0", "debug": "^3.1.0" - }, - "dependencies": { - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } } }, "i": { @@ -4112,17 +4716,17 @@ "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=" }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "import-lazy": { "version": "2.1.0", @@ -4154,39 +4758,82 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "inquirer": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", - "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.3.1.tgz", + "integrity": "sha512-MmL624rfkFt4TG9y/Jvmt8vdmOo836U7Y0Hxr2aFk3RelZEGX4Igk0KabWrcaaZaTv9uzglOqWh1Vly+FAWAXA==", "requires": { - "ansi-escapes": "^1.1.0", - "ansi-regex": "^2.0.0", - "chalk": "^1.0.0", - "cli-cursor": "^1.0.1", + "ansi-escapes": "^3.2.0", + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", - "figures": "^1.3.5", - "lodash": "^4.3.0", - "readline2": "^1.0.1", - "run-async": "^0.1.0", - "rx-lite": "^3.1.2", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^2.0.0", + "lodash": "^4.17.11", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.1.0", "through": "^2.3.6" }, "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.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==", + "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==" + } } } } }, + "install-artifact-from-github": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/install-artifact-from-github/-/install-artifact-from-github-1.2.0.tgz", + "integrity": "sha512-3OxCPcY55XlVM3kkfIpeCgmoSKnMsz2A3Dbhsq0RXpIknKQmrX1YiznCeW9cD2ItFmDxziA3w6Eg8d80AoL3oA==", + "optional": true + }, "into-stream": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", @@ -4201,24 +4848,52 @@ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, "ipaddr.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", - "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "is": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==" }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, "is-ci": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", - "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", "requires": { - "ci-info": "^1.5.0" + "ci-info": "^2.0.0" } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", @@ -4227,19 +4902,32 @@ "number-is-nan": "^1.0.0" } }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-installed-globally": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", - "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", + "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", "requires": { - "global-dirs": "^0.1.0", - "is-path-inside": "^1.0.0" + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" } }, "is-npm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", - "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-obj": { "version": "1.0.1", @@ -4252,12 +4940,9 @@ "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "requires": { - "path-is-inside": "^1.0.1" - } + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" }, "is-plain-obj": { "version": "1.1.0", @@ -4265,19 +4950,14 @@ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" }, "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" - }, - "is-redirect": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", - "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" }, "is-retry-allowed": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", - "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==" }, "is-stream": { "version": "1.1.0", @@ -4299,16 +4979,26 @@ "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz", "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" }, - "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==" - }, "is-wsl": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "is2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is2/-/is2-2.0.1.tgz", + "integrity": "sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA==", + "requires": { + "deep-is": "^0.1.3", + "ip-regex": "^2.1.0", + "is-url": "^1.2.2" + } + }, "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", @@ -4348,17 +5038,10 @@ "valid-url": "^1" } }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "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" @@ -4370,11 +5053,11 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "json-bigint": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", - "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", "requires": { - "bignumber.js": "^7.0.0" + "bignumber.js": "^9.0.0" } }, "json-buffer": { @@ -4390,6 +5073,21 @@ "jju": "^1.1.0" } }, + "json-ptr": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/json-ptr/-/json-ptr-1.3.2.tgz", + "integrity": "sha512-tFH40YQ+lG7mgYYM1kGZOhQngO4SbOEHZJlA4W+NtetWZ20EUU3BPU+30uWRKumuAJoSo5eqrsXD2h72ioS8ew==", + "requires": { + "tslib": "^2.0.0" + }, + "dependencies": { + "tslib": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.3.tgz", + "integrity": "sha512-uZtkfKblCEQtZKBF6EBXVZeQNl82yqtDQdv+eck8u7tdPxjLu2/lp5/uPW+um2tpuxINHWy3GhiccY7QgEaVHQ==" + } + } + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -4419,16 +5117,16 @@ "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" }, "jsonschema": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", - "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz", + "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==" }, "jsonwebtoken": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.1.0.tgz", - "integrity": "sha1-xjl80uX9WD1lwAeoPce7eOaYK4M=", + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz", + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==", "requires": { - "jws": "^3.1.4", + "jws": "^3.2.2", "lodash.includes": "^4.3.0", "lodash.isboolean": "^3.0.3", "lodash.isinteger": "^4.0.4", @@ -4436,8 +5134,42 @@ "lodash.isplainobject": "^4.0.6", "lodash.isstring": "^4.0.1", "lodash.once": "^4.0.0", - "ms": "^2.0.0", - "xtend": "^4.0.1" + "ms": "^2.1.1", + "semver": "^5.6.0" + }, + "dependencies": { + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "requires": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "jsprim": { @@ -4452,9 +5184,9 @@ } }, "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.1.tgz", + "integrity": "sha512-aWgeGFW67BP3e5181Ep1Fv2v8z//iBJfrvyTnq8wG86vEESwmonn1zPBJ0VfmT9CJq2FIT0VsETtrNFm2a+SHA==", "dev": true }, "jwa": { @@ -4492,12 +5224,17 @@ "graceful-fs": "^4.1.9" } }, + "kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, "latest-version": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", - "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "requires": { - "package-json": "^4.0.0" + "package-json": "^6.3.0" } }, "lazystream": { @@ -4506,35 +5243,6 @@ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "requires": { "readable-stream": "^2.0.5" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "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" - } - }, - "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==", - "requires": { - "safe-buffer": "~5.1.0" - } - } } }, "lcid": { @@ -4545,6 +5253,16 @@ "invert-kv": "^1.0.0" } }, + "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==" + }, + "listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=" + }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -4555,9 +5273,9 @@ } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" }, "lodash._isnative": { "version": "2.4.1", @@ -4587,10 +5305,20 @@ "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" }, - "lodash.clone": { + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.difference": { "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", - "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=" + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", + "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" }, "lodash.get": { "version": "4.4.2", @@ -4661,16 +5389,26 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "lodash.noop": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-3.0.1.tgz", - "integrity": "sha1-OBiPTWUKOkdCWEObluxFsyYXEzw=" - }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40=" + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=" + }, + "lodash.union": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", + "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=" + }, "lodash.values": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-2.4.1.tgz", @@ -4684,11 +5422,37 @@ "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==" }, - "lolex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.0.0.tgz", - "integrity": "sha512-hcnW80h3j2lbUfFdMArd5UPA/vxZJ+G8vobd+wg3nVEQA0EigStbYcrG030FJxL6xiDDPEkoMatV9xIh5OecQQ==", - "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==", + "requires": { + "chalk": "^2.0.1" + } + }, + "logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + }, + "dependencies": { + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } }, "long": { "version": "4.0.0", @@ -4718,9 +5482,9 @@ } }, "luxon": { - "version": "1.11.4", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.11.4.tgz", - "integrity": "sha512-zTQ1DCShOGHIdNpa56yjDpUCowKDsBqeFVuEG2XBcrAM2udxN0g3N5RTZzbw94OkDiBgECsuDgLNnQTo73yghw==" + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-1.25.0.tgz", + "integrity": "sha512-hEgLurSH8kQRjY6i4YLey+mcKVAWXbDNlZRmM6AgWDJ1cY3atl8Ztf5wEY7VBReFbmGnwQPz7KYJblL8B2k0jQ==" }, "make-dir": { "version": "1.3.0", @@ -4728,6 +5492,31 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "requires": { "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "marked": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.7.0.tgz", + "integrity": "sha512-c+yYdCZJQrsRjTPhUx7VKkApw9bwDkNbHUKo1ovgcfDjb2kc8rLuRbIFyXL5WOEUwzSSKo3IXpph2K6DqB/KZg==" + }, + "marked-terminal": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-3.3.0.tgz", + "integrity": "sha512-+IUQJ5VlZoAFsM5MHNT7g3RHSkA3eETqhRCdXv4niUMAKHQ7lb1yvAcuGPmm4soxhmtX13u4Li6ZToXtvSEH+A==", + "requires": { + "ansi-escapes": "^3.1.0", + "cardinal": "^2.1.1", + "chalk": "^2.4.1", + "cli-table": "^0.3.1", + "node-emoji": "^1.4.1", + "supports-hyperlinks": "^1.0.1" } }, "media-typer": { @@ -4774,9 +5563,9 @@ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "mime": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", - "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==" + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", + "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" }, "mime-db": { "version": "1.37.0", @@ -4810,80 +5599,175 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minipass": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", - "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "optional": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "yallist": "^4.0.0" }, "dependencies": { "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true } } }, "minizlib": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", - "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + } } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz", + "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==", "dev": true, "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", + "chokidar": "3.4.3", + "debug": "4.2.0", + "diff": "4.0.2", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.6", "growl": "1.10.5", - "he": "1.1.1", + "he": "1.2.0", + "js-yaml": "3.14.0", + "log-symbols": "4.0.0", "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" + "ms": "2.1.2", + "nanoid": "3.1.12", + "serialize-javascript": "5.0.1", + "strip-json-comments": "3.1.1", + "supports-color": "7.2.0", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.0.2", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "2.0.0" }, "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "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": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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" + } + }, + "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 }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.1.2" + } + }, + "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 + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" } }, + "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 + }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "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", @@ -4894,13 +5778,236 @@ "path-is-absolute": "^1.0.0" } }, + "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 + }, + "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 + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "requires": { + "chalk": "^4.0.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "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 + }, + "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 + }, + "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 + }, + "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" + } + }, + "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" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + }, "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "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 + } + } + }, + "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 + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.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": "^13.1.2" + }, + "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-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": "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 + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -4911,15 +6018,30 @@ "integrity": "sha512-9DITV2YEMcw7XojdfvGl3gDD8J9QjZTJ7ZOUuSAkP+F3T6rDbzMJuPktxptsdHYEvZcmXrCD3LMOhdSAEq6zKA==" }, "morgan": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", - "integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", "requires": { - "basic-auth": "~2.0.0", + "basic-auth": "~2.0.1", "debug": "2.6.9", - "depd": "~1.1.2", + "depd": "~2.0.0", "on-finished": "~2.3.0", - "on-headers": "~1.0.1" + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } } }, "ms": { @@ -4933,9 +6055,16 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==" }, "nan": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "optional": true + }, + "nanoid": { + "version": "3.1.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz", + "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==", + "dev": true }, "nash": { "version": "3.0.0", @@ -4952,11 +6081,6 @@ "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" } } }, @@ -4966,9 +6090,9 @@ "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=" }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "next-tick": { "version": "1.0.0", @@ -4981,28 +6105,22 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "nise": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.8.tgz", - "integrity": "sha512-kGASVhuL4tlAV0tvA34yJYZIVihrUt/5bDwpp4tTluigxUr2bBlJeDXmivb6NuEdFkqvdv/Ybb9dm16PSKUhtw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-4.0.4.tgz", + "integrity": "sha512-bTTRUNlemx6deJa+ZyoCUTRvH3liK5+N6VQZ4NIw90AgDXY6iPnsqplNFf6STcj+ePk0H/xqxnP75Lr0J0Fq3A==", "dev": true, "requires": { - "@sinonjs/formatio": "^3.1.0", + "@sinonjs/commons": "^1.7.0", + "@sinonjs/fake-timers": "^6.0.0", + "@sinonjs/text-encoding": "^0.7.1", "just-extend": "^4.0.2", - "lolex": "^2.3.2", - "path-to-regexp": "^1.7.0", - "text-encoding": "^0.6.4" + "path-to-regexp": "^1.7.0" }, "dependencies": { - "lolex": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", - "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", - "dev": true - }, "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "dev": true, "requires": { "isarray": "0.0.1" @@ -5010,33 +6128,116 @@ } } }, + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "requires": { + "lodash.toarray": "^4.4.0" + } + }, "node-fetch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz", - "integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" }, "node-forge": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.4.tgz", "integrity": "sha512-8Df0906+tq/omxuCZD6PqhPaQDYuyJ1d+VITgxoIA8zvQd1ru+nMJcDChHH324MWitIgbVkAkQoGEEVJNpn/PA==" }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "optional": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "optional": 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" + } + }, + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "optional": true + }, + "tar": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.5.tgz", + "integrity": "sha512-0b4HOimQHj9nXNEAA7zWwMM91Zhhba3pspja6sQbgTpynOJf+bkjBnfybNYzbpLbnwXnbyB4LOREvlyXLkCHSg==", + "optional": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "optional": true + } + } + }, "node-version": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/node-version/-/node-version-1.2.0.tgz", "integrity": "sha512-ma6oU4Sk0qOoKEAymVoTvk8EdXEobdS7m/mAGhDJ8Rouugho48crHBORAmy5BoOcv8wraPM6xumapQp5hl4iIQ==" }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "abbrev": "1" } }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, "normalize-url": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", - "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" }, "npm-run-path": { "version": "2.0.2", @@ -5046,6 +6247,18 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -5070,9 +6283,9 @@ } }, "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + "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==" }, "once": { "version": "1.4.0", @@ -5082,81 +6295,85 @@ "wrappy": "1" } }, + "one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "requires": { + "fn.name": "1.x.x" + } + }, "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + } + } }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", "requires": { "is-wsl": "^1.1.0" } }, - "optjs": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/optjs/-/optjs-3.2.2.tgz", - "integrity": "sha1-aabOicRCpEQDFBrS+bNwvVu29O4=" + "openapi3-ts": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-1.4.0.tgz", + "integrity": "sha512-8DmE2oKayvSkIR3XSZ4+pRliBsx19bSNeIzkTPswY8r4wvjX86bMxsORdqwAwMxE8PefOcSAT2auvi/0TZe9yA==" }, "ora": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", - "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", - "requires": { - "chalk": "^1.1.1", - "cli-cursor": "^1.0.2", - "cli-spinners": "^0.1.2", - "object-assign": "^4.0.1" + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "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": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-regex": "^4.1.0" } } } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "^1.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=" }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, "p-cancelable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, + "p-defer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-3.0.0.tgz", + "integrity": "sha512-ugZxsxmtTln604yeYd29EGrNhazN2lywetzpKhfmQjW/VJmhpDmWbiX+h0zL8V91R0UXkhb3KtPmyq9PZw3aYw==" + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -5197,53 +6414,67 @@ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "package-json": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", - "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", - "requires": { - "got": "^6.7.1", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" }, "dependencies": { + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, "got": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", - "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", "requires": { - "create-error-class": "^3.0.0", + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-redirect": "^1.0.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "lowercase-keys": "^1.0.0", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "unzip-response": "^2.0.1", - "url-parse-lax": "^1.0.0" + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" } }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" - }, - "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { - "prepend-http": "^1.0.1" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, + "parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha1-juqz5U+laSD+Fro493+iGqzC104=" + }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "path-exists": { "version": "3.0.0", @@ -5255,22 +6486,11 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, - "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 - }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -5287,30 +6507,74 @@ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==" + }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "pkginfo": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" }, + "plist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.0.1.tgz", + "integrity": "sha512-GpgvHHocGRyQm74b6FWEZZVRroHKE1I0/BTjAmySaohK+cUn+hZpbqXkc3KWgW3gQYkqcQej35FohcT0FRlkRQ==", + "requires": { + "base64-js": "^1.2.3", + "xmlbuilder": "^9.0.7", + "xmldom": "0.1.x" + } + }, "portfinder": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", - "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "requires": { - "async": "^1.5.2", - "debug": "^2.2.0", - "mkdirp": "0.5.x" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" }, "dependencies": { "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -5320,9 +6584,9 @@ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, "prettier": { - "version": "1.16.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.16.4.tgz", - "integrity": "sha512-ZzWuos7TI5CKUeQAtFd6Zhm2s6EpAD/ZLApIhsF9pRvRtM1RFo61dM/4MSRUA0SuLugA/zgrZD8m0BaY46Og7g==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.1.2.tgz", + "integrity": "sha512-16c7K+x4qVlJg9rEbXl7HEGmQyZlG4R9AgP+oHKRMsMsuk8s+ATStlf1NpDqyBI1HpVyfjLOeMhH2LvuNvV5Vg==", "dev": true }, "process-nextick-args": { @@ -5335,6 +6599,11 @@ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, + "promise-breaker": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/promise-breaker/-/promise-breaker-5.0.0.tgz", + "integrity": "sha512-mgsWQuG4kJ1dtO6e/QlNDLFtMkMzzecsC69aI5hlLEjGHFNpHrvGhFi4LiK5jg2SMQj74/diH+wZliL9LpGsyA==" + }, "promise-polyfill": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-6.1.0.tgz", @@ -5387,9 +6656,9 @@ } }, "protobufjs": { - "version": "6.8.8", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", - "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.10.2.tgz", + "integrity": "sha512-27yj+04uF6ya9l+qfpH187aqEzfCF4+Uit0I9ZBQVqK09hk/SQzKa2MUqUpXaVa7LOFRg1TSSr3lVxGOk6c0SQ==", "requires": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -5401,15 +6670,15 @@ "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", - "@types/long": "^4.0.0", - "@types/node": "^10.1.0", + "@types/long": "^4.0.1", + "@types/node": "^13.7.0", "long": "^4.0.0" }, "dependencies": { "@types/node": { - "version": "10.12.18", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz", - "integrity": "sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ==" + "version": "13.13.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.32.tgz", + "integrity": "sha512-sPBvDnrwZE1uePhkCEyI/qQlgZM5kePPAhHIFDWNsOrWBFRBOk3LKJYmVCLeLZlL9Ub/FzMJb31OTWCg2F+06g==" } } }, @@ -5419,12 +6688,12 @@ "integrity": "sha1-mRxAfpneJkqt+PgVBLXn+ve/omA=" }, "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" + "ipaddr.js": "1.9.1" } }, "pseudomap": { @@ -5433,9 +6702,9 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, "pump": { "version": "2.0.1", @@ -5461,6 +6730,14 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -5476,20 +6753,45 @@ "strict-uri-encode": "^1.0.0" } }, + "quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.0" + } + }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } } }, "rc": { @@ -5501,13 +6803,17 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } + } + }, + "re2": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/re2/-/re2-1.15.9.tgz", + "integrity": "sha512-AXWEhpMTBdC+3oqbjdU07dk0pBCvxh5vbOMLERL6Y8FYBSGn4vXlLe8cYszn64Yy7H8keVMrgPzoSvOd4mePpg==", + "optional": true, + "requires": { + "install-artifact-from-github": "^1.2.0", + "nan": "^2.14.2", + "node-gyp": "^7.1.2" } }, "read": { @@ -5519,59 +6825,70 @@ } }, "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", "requires": { "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "readline2": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", - "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "mute-stream": "0.0.5" + "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" }, "dependencies": { - "mute-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", - "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=" + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } } } }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "redeyed": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", + "integrity": "sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs=", + "requires": { + "esprima": "~4.0.0" + } + }, "registry-auth-token": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", - "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "rc": "^1.2.8" } }, "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", "requires": { - "rc": "^1.0.1" + "rc": "^1.2.8" } }, - "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=" - }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -5580,7 +6897,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -5590,9 +6907,16 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } } }, "require-directory": { @@ -5610,14 +6934,11 @@ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } + "resolve-alpn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.0.0.tgz", + "integrity": "sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==", + "dev": true }, "responselike": { "version": "1.0.2", @@ -5628,12 +6949,22 @@ } }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + } } }, "retry-axios": { @@ -5642,11 +6973,26 @@ "integrity": "sha512-jp4YlI0qyDFfXiXGhkCOliBN1G7fRH03Nqy8YdShzGqbY5/9S2x/IR6C88ls2DFkbWuL3ASkP7QD3pVrNpPgwQ==" }, "retry-request": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.0.0.tgz", - "integrity": "sha512-S4HNLaWcMP6r8E4TMH52Y7/pM8uNayOcTDDQNBwsCccL1uI+Ol2TljxRDPzaNfbhOB30+XWP5NnZkB3LiJxi1w==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.3.tgz", + "integrity": "sha512-QnRZUpuPNgX0+D1xVxul6DbJ9slvo4Rm6iV/dn63e048MvGbUZiKySVt6Tenp04JqmchxjiLltGerOJys7kJYQ==", "requires": { - "through2": "^2.0.0" + "debug": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } } }, "revalidator": { @@ -5655,31 +7001,44 @@ "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=" }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "requires": { "glob": "^7.1.3" } }, "router": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/router/-/router-1.3.3.tgz", - "integrity": "sha1-wUL2tepNazNZAiypW2WAvSF/ic8=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/router/-/router-1.3.5.tgz", + "integrity": "sha512-kozCJZUhuSJ5VcLhSb3F8fsmGXy+8HaDbKCAerR1G6tq3mnMZFMuSohbFvGv1c5oMFipijDjRZuuN/Sq5nMf3g==", "requires": { - "array-flatten": "2.1.1", + "array-flatten": "3.0.0", "debug": "2.6.9", "methods": "~1.1.2", - "parseurl": "~1.3.2", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "setprototypeof": "1.1.0", + "setprototypeof": "1.2.0", "utils-merge": "1.0.1" }, "dependencies": { "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" } } }, @@ -5689,18 +7048,18 @@ "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" }, "run-async": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", - "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==" + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", "requires": { - "once": "^1.3.0" + "tslib": "^1.9.0" } }, - "rx-lite": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", - "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=" - }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -5717,17 +7076,24 @@ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" }, "semver-diff": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", - "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", "requires": { - "semver": "^5.0.3" + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } } }, "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -5736,21 +7102,50 @@ "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "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=" + } + } + }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "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==" } } }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "serializerr": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/serializerr/-/serializerr-1.0.3.tgz", @@ -5760,14 +7155,14 @@ } }, "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" + "parseurl": "~1.3.3", + "send": "0.17.1" } }, "set-blocking": { @@ -5775,10 +7170,15 @@ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "shebang-command": { "version": "1.2.0", @@ -5798,37 +7198,46 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, "sinon": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.2.3.tgz", - "integrity": "sha512-i6j7sqcLEqTYqUcMV327waI745VASvYuSuQMCjbAwlpAeuCgKZ3LtrjDxAbu+GjNQR0FEDpywtwGCIh8GicNyg==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.1.tgz", + "integrity": "sha512-naPfsamB5KEE1aiioaoqJ6MEhdUs/2vtI5w1hPAXX/UwvoPjXcwh1m5HiKx0HGgKR8lQSoFIgY5jM6KK8VrS9w==", "dev": true, "requires": { - "@sinonjs/commons": "^1.3.0", - "@sinonjs/formatio": "^3.1.0", - "@sinonjs/samsam": "^3.0.2", - "diff": "^3.5.0", - "lolex": "^3.0.0", - "nise": "^1.4.8", - "supports-color": "^5.5.0" + "@sinonjs/commons": "^1.8.1", + "@sinonjs/fake-timers": "^6.0.1", + "@sinonjs/formatio": "^5.0.1", + "@sinonjs/samsam": "^5.2.0", + "diff": "^4.0.2", + "nise": "^4.0.4", + "supports-color": "^7.1.0" }, "dependencies": { + "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 + }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } } } }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" - }, "snakeize": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", @@ -5843,18 +7252,18 @@ } }, "split-array-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz", - "integrity": "sha512-hmMswlVY91WvGMxs0k8MRgq8zb2mSen4FmDNc5AFiTWtrBpdZN6nwD6kROVe4vNL+ywrvbCKsWVCnEd4riELIg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-1.0.3.tgz", + "integrity": "sha1-0rdajl4Ngk1S/eyLgiWDncLjXfo=", "requires": { - "is-stream-ended": "^0.1.4" + "async": "^2.4.0", + "is-stream-ended": "^0.1.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 + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { "version": "1.16.1", @@ -5878,9 +7287,9 @@ "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "stream-events": { "version": "1.0.5", @@ -5895,6 +7304,11 @@ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" }, + "streamsearch": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -5929,9 +7343,19 @@ } }, "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } }, "strip-ansi": { "version": "3.0.1", @@ -5957,80 +7381,88 @@ "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" }, "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", + "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", "dev": true, "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" + "component-emitter": "^1.3.0", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", + "methods": "^1.1.2", + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" }, "dependencies": { + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "form-data": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz", + "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, - "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==", + "qs": { + "version": "6.9.4", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz", + "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==", "dev": true }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "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" - } + "semver": { + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", + "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==", + "dev": true } } }, "superstatic": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/superstatic/-/superstatic-6.0.4.tgz", - "integrity": "sha512-Nfli9mSPa9fJloKuDeUOdqC1lcw4c4SnxiWPB8s7Yn1iYo7Ja3pj7qc8AXMqHVqn/Kf7QsxBjAeOJTpuJ0mcrQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/superstatic/-/superstatic-7.0.1.tgz", + "integrity": "sha512-oph3y5srRKrF8qeCVnQXbysb7U9ixPZQBlqniQymZimJwy2D1xba0EMouCFquhkwRrZYLgd7YPtkSBaPwyFYZA==", "requires": { "as-array": "^2.0.0", "async": "^1.5.2", @@ -6049,7 +7481,7 @@ "home-dir": "^1.0.0", "is-url": "^1.2.2", "join-path": "^1.1.1", - "lodash": "^4.17.4", + "lodash": "^4.17.19", "mime-types": "^2.1.16", "minimatch": "^3.0.4", "morgan": "^1.8.2", @@ -6057,13 +7489,19 @@ "on-finished": "^2.2.0", "on-headers": "^1.0.0", "path-to-regexp": "^1.7.0", + "re2": "^1.15.0", "router": "^1.3.1", "rsvp": "^3.6.2", "string-length": "^1.0.0", "try-require": "^1.0.0", - "update-notifier": "^2.5.0" + "update-notifier": "^4.1.0" }, "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, "async": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", @@ -6093,118 +7531,233 @@ "rimraf": "^2.2.8" } }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", "requires": { "isarray": "0.0.1" } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" } } }, "supertest": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.4.2.tgz", - "integrity": "sha512-WZWbwceHUo2P36RoEIdXvmqfs47idNNZjCuJOqDz6rvtkk8ym56aU5oglORCpPeXGxT7l9rkJ41+O1lffQXYSA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/supertest/-/supertest-6.0.1.tgz", + "integrity": "sha512-8yDNdm+bbAN/jeDdXsRipbq9qMpVF7wRsbwLgsANHqdjPsCoecmlTuqEcLQMGpmojFBhxayZ0ckXmLXYq7e+0g==", "dev": true, "requires": { - "methods": "^1.1.2", - "superagent": "^3.8.3" + "methods": "1.1.2", + "superagent": "6.1.0" } }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "supports-hyperlinks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz", + "integrity": "sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw==", + "requires": { + "has-flag": "^2.0.0", + "supports-color": "^5.0.0" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + } + } }, "tar": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", - "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", "requires": { "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", "mkdirp": "^0.5.0", "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "yallist": "^3.0.3" }, "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "requires": { + "minipass": "^2.6.0" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "requires": { + "minipass": "^2.9.0" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, "yallist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", - "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz", + "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==", "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "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" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "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==", + } + } + }, + "tcp-port-used": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tcp-port-used/-/tcp-port-used-1.0.1.tgz", + "integrity": "sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q==", + "requires": { + "debug": "4.1.0", + "is2": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", + "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", "requires": { - "safe-buffer": "~5.1.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, "teeny-request": { - "version": "3.11.3", - "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-3.11.3.tgz", - "integrity": "sha512-CKncqSF7sH6p4rzCgkb/z/Pcos5efl0DmolzvlqRQUNcpRIruOhY9+T1FsIlyEbfWd7MsFpodROOwHYh2BaXzw==", - "requires": { - "https-proxy-agent": "^2.2.1", - "node-fetch": "^2.2.0", - "uuid": "^3.3.2" + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.0.1.tgz", + "integrity": "sha512-sasJmQ37klOlplL4Ia/786M5YlOcoLGQyq2TE4WHSRupbAuDaQW0PfVxV4MtdBtRJ4ngzS+1qim8zP6Zp35qCw==", + "requires": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.1", + "stream-events": "^1.0.5", + "uuid": "^8.0.0" + }, + "dependencies": { + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "requires": { + "ms": "2.1.2" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "uuid": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz", + "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==" + } } }, "term-size": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", - "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", - "requires": { - "execa": "^0.7.0" - } + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", + "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==" }, - "text-encoding": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", - "dev": true + "text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, "through": { "version": "2.3.8", @@ -6271,30 +7824,31 @@ "os-tmpdir": "~1.0.2" } }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } + "psl": "^1.1.28", + "punycode": "^2.1.1" } }, "toxic": { @@ -6305,6 +7859,16 @@ "lodash": "^4.17.10" } }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" + }, + "triple-beam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" + }, "try-require": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/try-require/-/try-require-1.2.1.tgz", @@ -6315,35 +7879,6 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" }, - "tslint": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", - "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", - "dev": true, - "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.3.0", - "commander": "^2.12.1", - "diff": "^3.2.0", - "glob": "^7.1.1", - "js-yaml": "^3.7.0", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.8.0", - "tsutils": "^2.27.2" - } - }, - "tsutils": { - "version": "2.29.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", - "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -6357,19 +7892,60 @@ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, + "tweetsodium": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/tweetsodium/-/tweetsodium-0.0.5.tgz", + "integrity": "sha512-T3aXZtx7KqQbutTtBfn+P5By3HdBuB1eCoGviIrRJV2sXeToxv2X2cv5RvYqgG26PSnN5m3fYixds22Gkfd11w==", + "requires": { + "blakejs": "^1.1.0", + "tweetnacl": "^1.0.1" + }, + "dependencies": { + "tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + } + } + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + }, "type-is": { - "version": "1.6.16", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", - "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "~2.1.18" + "mime-types": "~2.1.24" + }, + "dependencies": { + "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==" + }, + "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==", + "requires": { + "mime-db": "1.44.0" + } + } } }, "typedarray": { @@ -6377,10 +7953,18 @@ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, "typescript": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", - "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.1.2.tgz", + "integrity": "sha512-thGloWsGH3SOxv1SoY7QojKi0tc+8FnOmiarEGMbd/lar7QOEd3hvlx3Fp5y6FlDUGl9L+pd4n2e+oToGMmhRQ==", "dev": true }, "unique-string": { @@ -6392,27 +7976,27 @@ } }, "universal-analytics": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.20.tgz", - "integrity": "sha512-gE91dtMvNkjO+kWsPstHRtSwHXz0l2axqptGYp5ceg4MsuurloM0PU3pdOfpb5zBXUvyjT4PwhWK2m39uczZuw==", + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", + "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", "requires": { - "debug": "^3.0.0", - "request": "^2.88.0", + "debug": "^4.1.1", + "request": "^2.88.2", "uuid": "^3.0.0" }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "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==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" } } }, @@ -6421,47 +8005,160 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, - "unzip-response": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", - "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + "unzipper": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz", + "integrity": "sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw==", + "requires": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } }, "update-notifier": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", - "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", - "requires": { - "boxen": "^1.2.1", - "chalk": "^2.0.1", - "configstore": "^3.0.0", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.3.tgz", + "integrity": "sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==", + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", "import-lazy": "^2.1.0", - "is-ci": "^1.0.10", - "is-installed-globally": "^0.1.0", - "is-npm": "^1.0.0", - "latest-version": "^3.0.0", - "semver-diff": "^2.0.0", - "xdg-basedir": "^3.0.0" + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" }, "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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==", + "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==" + }, "configstore": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", - "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "requires": { - "dot-prop": "^4.1.0", + "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", - "make-dir": "^1.0.0", - "unique-string": "^1.0.0", - "write-file-atomic": "^2.0.0", - "xdg-basedir": "^3.0.0" + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" } + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" } } }, "uri-js": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", - "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", + "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==", "requires": { "punycode": "^2.1.0" } @@ -6484,14 +8181,6 @@ "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=" }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "requires": { - "os-homedir": "^1.0.0" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -6519,6 +8208,22 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=" + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } } } }, @@ -6528,9 +8233,9 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" }, "valid-url": { "version": "1.0.9", @@ -6553,16 +8258,25 @@ } }, "walkdir": { - "version": "0.0.12", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.12.tgz", - "integrity": "sha512-HFhaD4mMWPzFSqhpyDG48KDdrjfn409YQuVW7ckZYhW4sE87mYtWifdB/+73RA7+p4s4K18n5Jfx1kHthE1gBw==" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==" + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } }, "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "requires": { - "http-parser-js": ">=0.4.0", + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } }, @@ -6584,59 +8298,62 @@ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, "widest-line": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", - "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", "requires": { - "string-width": "^2.1.1" + "string-width": "^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=" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" }, "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=" + "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==" }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" } }, "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "^5.0.0" } } } }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" - }, "winston": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/winston/-/winston-1.1.2.tgz", - "integrity": "sha1-aO3Xaf951PlSjPDl2AAhqt5nSAw=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz", + "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=", "requires": { "async": "~1.0.0", "colors": "1.0.x", "cycle": "1.0.x", "eyes": "0.1.x", "isstream": "0.1.x", - "pkginfo": "0.3.x", "stack-trace": "0.0.x" }, "dependencies": { @@ -6649,14 +8366,24 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" - }, - "pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" } } }, + "winston-transport": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", + "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", + "requires": { + "readable-stream": "^2.3.7", + "triple-beam": "^1.2.0" + } + }, + "workerpool": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz", + "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==", + "dev": true + }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", @@ -6672,24 +8399,34 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz", - "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", "signal-exit": "^3.0.2" } }, + "ws": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.0.tgz", + "integrity": "sha512-kyFwXuV/5ymf+IXhS6f0+eAFvydbaBW3zjpT6hUdAh/hbVjTIB5EHBGi0bPoCLSK2wcuz3BrEkB9LrYv1Nm4NQ==" + }, "xdg-basedir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" }, - "xmlhttprequest": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz", - "integrity": "sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw=" + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + }, + "xmldom": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==" }, "xtend": { "version": "4.0.1", @@ -6707,17 +8444,118 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "requires": { - "camelcase": "^2.0.1", - "cliui": "^3.0.3", - "decamelize": "^1.1.1", - "os-locale": "^1.4.0", - "string-width": "^1.0.1", - "window-size": "^0.1.4", - "y18n": "^3.2.0" + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "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" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "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==" + }, + "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==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "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==", + "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==" + }, + "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==" + }, + "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==" + }, + "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==", + "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==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "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==" + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "yargs-parser": { @@ -6735,42 +8573,56 @@ } } }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, "requires": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "dev": true }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "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" - } + "decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true }, - "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==", + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + } + } + }, + "zip-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-2.1.3.tgz", + "integrity": "sha512-EkXc2JGcKhO5N5aZ7TmuNo45budRaFGHOmz24wtJR7znbNqDPmdZtUauKX6et8KAVseAMBOyWJqEpXcHTBsh7Q==", + "requires": { + "archiver-utils": "^2.1.0", + "compress-commons": "^2.1.1", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { - "safe-buffer": "~5.1.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } } } diff --git a/functions/package.json b/functions/package.json index a57120a..1ec9e19 100644 --- a/functions/package.json +++ b/functions/package.json @@ -13,47 +13,49 @@ }, "main": "lib/index.js", "dependencies": { - "@google-cloud/automl": "^0.1.3", - "@google-cloud/firestore": "^1.0.1", - "@google-cloud/functions-emulator": "^1.0.0-beta.5", - "@google-cloud/storage": "^2.3.4", - "@sendgrid/mail": "^6.3.1", + "@google-cloud/automl": "^2.3.0", + "@google-cloud/firestore": "^4.7.1", + "@google-cloud/functions-emulator": "^1.0.0-beta.6", + "@google-cloud/storage": "^5.5.0", + "@sendgrid/mail": "^7.4.0", "child-process-promise": "^2.2.1", - "dayjs": "^1.8.0", - "express": "^4.16.4", - "ffmpeg-static": "^2.4.0", - "firebase-admin": "~7.0.0", - "firebase-functions": "^2.3.0", - "firebase-tools": "^6.7.1", + "dayjs": "^1.9.6", + "express": "^4.17.1", + "ffmpeg-static": "^4.2.7", + "firebase-admin": "~9.4.1", + "firebase-functions": "^3.11.0", + "firebase-tools": "^8.16.2", "fluent-ffmpeg": "^2.1.2", - "google-auth-library": "^3.1.0", - "got": "^9.6.0", - "luxon": "^1.11.4", - "mkdirp": "^0.5.1", - "morgan": "^1.9.1", - "node-fetch": "^2.3.0", - "rimraf": "^2.6.3" + "google-auth-library": "^6.1.3", + "luxon": "^1.25.0", + "mkdirp": "^1.0.4", + "morgan": "^1.10.0", + "node-fetch": "^2.6.1", + "rimraf": "^3.0.2", + "got": "^11.8.0" }, "devDependencies": { - "@types/ffmpeg-static": "^2.0.0", - "@types/fluent-ffmpeg": "^2.1.9", - "@types/got": "^9.4.3", - "@types/luxon": "^1.11.1", - "@types/mkdirp": "^0.5.2", - "@types/morgan": "^1.7.35", - "@types/node-fetch": "^2.1.6", - "@types/rimraf": "^2.0.2", + "@types/ffmpeg-static": "^3.0.0", + "@types/fluent-ffmpeg": "^2.1.16", + "@types/got": "^9.6.11", + "@types/luxon": "^1.25.0", + "@types/mkdirp": "^1.0.1", + "@types/morgan": "^1.9.2", + "@types/node": "^14.14.9", + "@types/node-fetch": "^2.5.7", + "@types/rimraf": "^3.0.0", "chai": "^4.2.0", - "firebase-functions-test": "^0.1.6", - "mocha": "^5.2.0", - "prettier": "^1.16.4", - "sinon": "^7.2.3", - "supertest": "^3.4.2", - "tslint": "^5.12.0", - "typescript": "^3.2.2" + "firebase-functions-test": "^0.2.3", + "got": "^11.8.0", + "mocha": "^8.2.1", + "prettier": "^2.1.2", + "sinon": "^9.2.1", + "supertest": "^6.0.1", + "tslint": "^6.1.3", + "typescript": "^4.1.2" }, "engines": { - "node": "8" + "node": "10" }, "private": true } diff --git a/functions/src/automlapi.ts b/functions/src/automlapi.ts index c8f5818..2c0ce88 100644 --- a/functions/src/automlapi.ts +++ b/functions/src/automlapi.ts @@ -12,33 +12,37 @@ // See the License for the specific language governing permissions and // limitations under the License. -import automl from '@google-cloud/automl'; -import * as dayjs from 'dayjs'; -import * as express from 'express'; -import { auth } from 'google-auth-library'; -import * as morgan from 'morgan'; +const automl = require('@google-cloud/automl'); +import * as dayjs from "dayjs"; +import * as express from "express"; +import { GoogleAuth } from "google-auth-library"; +import * as morgan from "morgan"; import { AUTOML_API_SCOPE, AUTOML_API_URL, AUTOML_BUCKET_URL, LOCATION, PROJECT_ID, -} from './constants'; -import { OperationMetadata } from './types'; +} from "./constants"; +import { OperationMetadata } from "./types"; export const app = express(); app.use(express.json()); -app.use(morgan('combined')); +app.use(morgan("combined")); +const googleAuth = new GoogleAuth({ + scopes: 'https://www.googleapis.com/auth/cloud-platform' +}); const client = new automl.v1beta1.AutoMlClient(); +const util = require('util'); // Controls model type. For more options, see: // https://cloud.google.com/vision/automl/alpha/docs/reference/rest/v1beta1/projects.locations.models#imageclassificationmodelmetadata -const DEFAULT_MODEL_TYPE = 'mobile-high-accuracy-1'; +const DEFAULT_MODEL_TYPE = "mobile-high-accuracy-1"; const DEFAULT_TRAIN_BUDGET = 1; -const DATASET_NAME_REGEX = new RegExp('^[a-zA-Z_0-9]+$'); -const MODEL_VERSION_FORMAT = 'vYYYYMMDDHHmmss'; +const DATASET_NAME_REGEX = new RegExp("^[a-zA-Z_0-9]+$"); +const MODEL_VERSION_FORMAT = "vYYYYMMDDHHmmss"; const parent = client.locationPath(PROJECT_ID, LOCATION); // A model as returned by AutoML /models response @@ -61,20 +65,19 @@ interface ModelResp { } /// create a new dataset -function createDataset(displayName: String): Promise { +async function createDataset(displayName: String): Promise { const dataset = { name: displayName, displayName, imageClassificationDatasetMetadata: { - classificationType: 'MULTICLASS', + classificationType: "MULTICLASS", }, }; - - return client.createDataset({ parent, dataset }); + return client.createDataset({ parent: parent, dataset: dataset }); } const extractIdFromName = (datasetName: string): string => { - const parts = datasetName.split('/'); + const parts = datasetName.split("/"); return parts[parts.length - 1]; }; @@ -83,11 +86,10 @@ function getDatasetName(automlId: string): Promise { return client.listDatasets({ parent }).then((responses: any[]) => { const datasets = responses[0]; for (const dataset of datasets) { - if (extractIdFromName(dataset['name']) === automlId) { - return dataset['name']; + if (extractIdFromName(dataset["name"]) === automlId) { + return dataset["name"]; } } - return null; }); } @@ -96,23 +98,63 @@ async function importDataset( name: string, displayName: string, labels: string -): Promise { +): Promise { const inputConfig = { gcsSource: { inputUris: [`${AUTOML_BUCKET_URL}/${displayName}/${labels}`], }, }; - return client - .importData({ name, inputConfig }) - .then((responses: any[]) => responses[1]); // initial api response with operation metadata + + // return await client + // .importData({ name: name, inputConfig: inputConfig }) + // .then((responses: any[]) => responses[0].promise()); + //initial api response with operation metadata + const [responses] = await client + .importData({ name: name, inputConfig: inputConfig }); + + const operation = responses[0]; + console.log('Processing import...'); + //await listOperationStatus(); + // const [finalResp] = await operation.promise(); + // const operationDetails = finalResp[2]; + + // // Get the data import details. + // console.log('Data import details:'); + // console.log('\tOperation details:'); + // console.log(`\t\tName: ${operationDetails.name}`); + // console.log(`\t\tDone: ${operationDetails.done}`); + return responses; + + // return responses[0]; + // return + // .then(responses => { + // const operation = responses[0]; + // console.log('Processing import...'); + // return await operation.promise(); + // }) + // .then(responses => { + // // The final result of the operation. + // const operationDetails = responses[2]; + + // // Get the data import details. + // console.log('Data import details:'); + // console.log('\tOperation details:'); + // console.log(`\t\tName: ${operationDetails.name}`); + // console.log(`\t\tDone: ${operationDetails.done}`); + // }) + // .catch(err => { + // console.error(err); + // return err; + // }); + // }); } /** * List all datasets */ -app.get('/datasets', async (req, res, next) => { +app.get("/datasets", async (req, res, next) => { try { - const authClient = await auth.getClient({ scopes: [AUTOML_API_SCOPE] }); + const authClient = await googleAuth.getClient(); const url = `${AUTOML_API_URL}/datasets`; const resp = await authClient.request({ url }); res.json(resp.data); @@ -125,20 +167,20 @@ app.get('/datasets', async (req, res, next) => { /** * Endpoint to create a new dataset in automl. Requires a name parameter */ -app.post('/datasets', async (req, res, next) => { +app.post("/datasets", async (req, res, next) => { try { const { displayName } = req.body; if (displayName === undefined) { - res.status(400).send('Expected a dataset `displayName`'); + res.status(400).send("Expected a dataset `displayName`"); return; } if (!displayName.match(DATASET_NAME_REGEX)) { res .status(400) .send( - 'The displayName contains a not allowed character, the' + - ' only allowed ones are ASCII Latin letters A-Z and a-z, an underscore (_),' + - ' and ASCII digits 0-9' + "The displayName contains a not allowed character, the" + + " only allowed ones are ASCII Latin letters A-Z and a-z, an underscore (_)," + + " and ASCII digits 0-9" ); return; } @@ -147,7 +189,7 @@ app.post('/datasets', async (req, res, next) => { res.json(response); } catch (err) { res.status(500); - res.json({message: err.message}); + res.json({ message: err.message }); console.error(err); } }); @@ -155,7 +197,7 @@ app.post('/datasets', async (req, res, next) => { /** * Endpoint to delete dataset from automl */ -app.delete('/datasets/:datasetId', async (req, res, next) => { +app.delete("/datasets/:datasetId", async (req, res, next) => { try { const { datasetId } = req.params; if (!datasetId) { @@ -173,7 +215,7 @@ app.delete('/datasets/:datasetId', async (req, res, next) => { } catch (err) { console.error(err); res.status(500); - res.json({message: err.message}); + res.json({ message: err.message }); } }); @@ -186,24 +228,24 @@ app.delete('/datasets/:datasetId', async (req, res, next) => { * - labels: string - file name containing the labels information. e.g * labels.csv */ -app.post('/import', async (req, res, next) => { +app.post("/import", async (req, res, next) => { const { name, labels, datasetId } = req.body; if (!name) { - res.status(400).json({ error: 'Need a dataset name' }); + res.status(400).json({ error: "Need a dataset name" }); return; } if (!datasetId) { - res.status(400).json({ error: 'Need a dataset Id' }); + res.status(400).json({ error: "Need a dataset Id" }); return; } if (!labels) { - res.status(400).json({ error: 'Need a path for labels file' }); + res.status(400).json({ error: "Need a path for labels file" }); return; } try { const datasetName = await getDatasetName(datasetId); if (datasetName === null) { - res.status(400).json({ error: 'Dataset not found' }); + res.status(400).json({ error: "Dataset not found" }); return; } const operationMetadata = await importDataset(datasetName, name, labels); @@ -211,7 +253,7 @@ app.post('/import', async (req, res, next) => { } catch (err) { console.error(err); res.status(500); - res.json({message: err.message}); + res.json({ message: err.message }); } }); @@ -227,10 +269,13 @@ app.post('/import', async (req, res, next) => { * * Uses the rest API */ -app.post('/train', async (req, res, next) => { +app.post("/train", async (req, res, next) => { + console.log( + `Training function execute` + ); const { datasetId } = req.body; if (!datasetId) { - res.status(400).json({ error: 'Need a dataset Id' }); + res.status(400).json({ error: "Need a dataset Id" }); return; } let { trainBudget, modelType } = req.body; @@ -244,32 +289,69 @@ app.post('/train', async (req, res, next) => { try { const datasetName = await getDatasetName(datasetId); if (datasetName === null) { - res.status(400).json({ error: 'Dataset not found' }); + res.status(400).json({ error: "Dataset not found" }); return; } - const authClient = await auth.getClient({ scopes: [AUTOML_API_SCOPE] }); - const url = `${AUTOML_API_URL}/models`; + // const authClient = await auth.getClient({ scopes: [AUTOML_API_SCOPE] }); + // const url = `${AUTOML_API_URL}/models`; - const resp = await authClient.request({ - method: 'POST', - data: { + const request = { + parent: parent, + model: { displayName: `${dayjs().format(MODEL_VERSION_FORMAT)}`, - dataset_id: datasetId, - imageClassificationModelMetadata: { trainBudget, modelType }, + datasetId: datasetId, + imageClassificationModelMetadata: { trainBudget, modelType }, // Leave unset, to use the default base model }, - url, - }); - - const operationMetadata = resp.data as OperationMetadata; - res.json(operationMetadata); + }; + + const [operation] = await client.createModel(request); + console.log('Training started...'); + console.log(`Training operation name: ${operation.name}`); + console.log(`Training operation metadata: ${operation.metadata}`); + res.json(operation); + // await listOperationStatus(); + // const modelId = extractIdFromName(`${dayjs().format(MODEL_VERSION_FORMAT)}`); + // console.log(`model id: ${modelId}`); + // await deployModel(modelId); } catch (err) { console.error(err); res.status(500); - res.json({message: err.message}); + res.json({ message: err.message }); } }); +async function listOperationStatus(): Promise { + // Construct request + const request = { + name: parent, + filter: '', + }; + + const [response] = await client.operationsClient.listOperations(request); + console.log('List of operation status:'); + for (const operation of response) { + console.log(`Name: ${operation.name}`); + console.log('Operation details:'); + console.log(`${operation.done}`); + console.log(`${operation.metadata.updateTime}`); + // manageTraining + } +} + +async function deployModel(modelId: string) { + // Construct request + const request = { + name: client.modelPath(PROJECT_ID, LOCATION, modelId), + }; + + const [operation] = await client.deployModel(request); + + // Wait for operation to complete. + const [response] = await operation.promise(); + console.log(`Model deployment finished. ${response}`); +} + /** * Exports a model in tflite format to a gcspath * @@ -281,28 +363,28 @@ app.post('/train', async (req, res, next) => { * more, refer to * https://cloud.google.com/vision/automl/alpha/docs/deploy#deployment_on_mobile_models_not_core_ml */ -app.post('/export', async (req, res, next) => { +app.post("/export", async (req, res, next) => { const { modelId, gcsPath } = req.body; if (!modelId) { - res.status(400).send('need a model id: modelId'); + res.status(400).send("need a model id: modelId"); return; } if (!gcsPath) { - res.status(400).send('need a gcs path: gcsPath'); + res.status(400).send("need a gcs path: gcsPath"); return; } - const authClient = await auth.getClient({ scopes: [AUTOML_API_SCOPE] }); + const authClient = await googleAuth.getClient(); const url = `${AUTOML_API_URL}/models/${modelId}:export`; try { const operationMetadata = await authClient .request({ - method: 'POST', + method: "POST", url, data: { output_config: { - model_format: 'tflite', + model_format: "tflite", gcs_destination: { output_uri_prefix: gcsPath, }, @@ -314,21 +396,21 @@ app.post('/export', async (req, res, next) => { } catch (err) { console.error(err); res.status(500); - res.json({message: err.message}); + res.json({ message: err.message }); } }); /** * Exports the latest generated model for the dataset */ -app.post('/exportlatestmodel', async (req, res, next) => { +app.post("/exportlatestmodel", async (req, res, next) => { const { datasetId, gcsPath } = req.body; if (!datasetId) { - res.status(400).send('need a dataset id: datasetId'); + res.status(400).send("need a dataset id: datasetId"); return; } if (!gcsPath) { - res.status(400).send('need a gcs path: gcsPath'); + res.status(400).send("need a gcs path: gcsPath"); return; } @@ -340,11 +422,11 @@ app.post('/exportlatestmodel', async (req, res, next) => { const datasetModels = modelsResp.model.filter( m => m.datasetId === datasetId && - m.imageClassificationModelMetadata.modelType.startsWith('mobile-') + m.imageClassificationModelMetadata.modelType.startsWith("mobile-") ); if (datasetModels === undefined) { - throw new Error('No models found for this dataset'); + throw new Error("No models found for this dataset"); } // 3. Find the latest (based on createTime) model @@ -354,17 +436,17 @@ app.post('/exportlatestmodel', async (req, res, next) => { )[0]; // 3. Initiate its export - console.log('Initiating export for the latest model', latestModel); + console.log("Initiating export for the latest model", latestModel); const modelId = extractIdFromName(latestModel.name); - const authClient = await auth.getClient({ scopes: [AUTOML_API_SCOPE] }); + const authClient = await googleAuth.getClient(); const url = `${AUTOML_API_URL}/models/${modelId}:export`; const operationMetadata = await authClient .request({ - method: 'POST', + method: "POST", url, data: { output_config: { - model_format: 'tflite', + model_format: "tflite", gcs_destination: { output_uri_prefix: gcsPath, }, @@ -376,27 +458,28 @@ app.post('/exportlatestmodel', async (req, res, next) => { } catch (err) { console.error(err); res.status(500); - res.json({message: err.message}); + res.json({ message: err.message }); } }); /** * List all models - trying out the REST API */ -app.get('/models', async (req, res, next) => { +app.get("/models", async (req, res, next) => { try { const resp = await getAllModels(); res.json(resp.data); } catch (err) { console.error(err); res.status(500); - res.json({message: err.message}); + res.json({ message: err.message }); } }); + /** Queries all models from AutoML */ async function getAllModels() { - const authClient = await auth.getClient({ scopes: [AUTOML_API_SCOPE] }); + const authClient = await googleAuth.getClient(); const url = `${AUTOML_API_URL}/models`; return authClient.request({ url }); } diff --git a/functions/src/check_operations_progress.ts b/functions/src/check_operations_progress.ts index 8d698ec..4bc574c 100644 --- a/functions/src/check_operations_progress.ts +++ b/functions/src/check_operations_progress.ts @@ -12,18 +12,33 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as functions from 'firebase-functions'; -import * as admin from 'firebase-admin'; -import { auth, Compute, JWT, UserRefreshClient } from 'google-auth-library'; -import { AUTOML_API_SCOPE, AUTOML_ROOT_URL } from './constants'; -import { OperationMetadata } from './types'; +import * as functions from "firebase-functions"; +import * as admin from "firebase-admin"; +import { Compute, JWT, UserRefreshClient, GoogleAuth } from "google-auth-library"; +import { + AUTOML_API_SCOPE, + AUTOML_ROOT_URL, + LOCATION, + PROJECT_ID, + AUTOML_API_URL, + AUTOML_BUCKET_URL, +} from "./constants"; +import { OperationMetadata } from "./types"; import DocumentSnapshot = FirebaseFirestore.DocumentSnapshot; +const automl = require('@google-cloud/automl'); +const clientMl = new automl.v1beta1.AutoMlClient(); +const parent = clientMl.locationPath(PROJECT_ID, LOCATION); + +const auth = new GoogleAuth({ + scopes: 'https://www.googleapis.com/auth/cloud-platform' +}); + type AuthClient = Compute | JWT | UserRefreshClient; function isValidType(type: string): boolean { return ( - type === 'IMPORT_DATA' || type === 'EXPORT_MODEL' || type === 'TRAIN_MODEL' + type === "IMPORT_DATA" || type === "EXPORT_MODEL" || type === "TRAIN_MODEL" ); } @@ -33,25 +48,50 @@ function isValidType(type: string): boolean { */ export const checkOperationProgress = functions.https.onRequest( async (request, response) => { - const operationType = request.query['type']; + const operationType = request.query["type"]; if (!operationType) { - response.status(404).json({ error: 'Operation `type` needed' }); + response.status(404).json({ error: "Operation `type` needed" }); return; } - if (!isValidType(operationType)) { + if (!isValidType(operationType as string)) { response.status(400).json({ - error: 'type should be one of IMPORT_DATA, EXPORT_MODEL, TRAIN_MODEL', + error: "type should be one of IMPORT_DATA, EXPORT_MODEL, TRAIN_MODEL", }); return; } try { - const client = await auth.getClient({ scopes: [AUTOML_API_SCOPE] }); + // const snapshotToDeploy = await admin + // .firestore() + // .collection("operations") + // .where("type", "==", "TRAIN_MODEL") + // .where("done", "==", true) + // .where("deployed", "==", false) + // .get(); + // console.log(`data to train empty: ${snapshotToDeploy.empty}`); + // if (!snapshotToDeploy.empty) { + // snapshotToDeploy.docs.forEach(async doc => { + // const docData = doc.data(); + // await deployModel(docData["dataset_id"]); + // console.log(`Deployed, update state`); + // //update ref + // await doc.ref.set( + // { + // last_updated: Date.now(), + // deployed: true + // }, + // { merge: true } + // ); + // }); + // } + + // const client = await auth.getClient({ scopes: [AUTOML_API_SCOPE] }); + const client = await auth.getClient(); const snapshot = await admin .firestore() - .collection('operations') - .where('type', '==', operationType) - .where('done', '==', false) + .collection("operations") + .where("type", "==", operationType) + .where("done", "==", false) .get(); if (snapshot.empty) { @@ -65,12 +105,14 @@ export const checkOperationProgress = functions.https.onRequest( snapshot.docs.forEach(async doc => { await updateOperation(doc, client); }); + console.log("Deploy model with ml"); + response.status(200).json({ success: `${snapshot.docs.length} operations updated: ${operationType}`, }); } catch (err) { - response.status(500).json({ error: err.toJSON() }); + response.status(500).json({ error: err.json }); } } ); @@ -95,15 +137,23 @@ async function updateOperation(doc: DocumentSnapshot, client: AuthClient) { if (data === undefined) { return; } - const operationName = data['name']; + const operationName = data["name"]; + console.log(`dataset: ${operationName}`); + const resp = await queryOperationStatus(operationName, client); + // const resp = await operationStatus(operationName); + console.log(`update operation with: ${resp.done}`); await doc.ref.set( { last_updated: Date.now(), done: resp.done ? resp.done : false, + deployed: data["deployed"] === undefined ? false : data["deployed"] }, { merge: true } ); + + console.log(resp.name); // Full model path + console.log(resp.name.replace(/projects\/[a-zA-Z0-9-]*\/locations\/[a-zA-Z0-9-]*\/models\//, '')); // Just the model-id } async function queryOperationStatus( @@ -114,3 +164,33 @@ async function queryOperationStatus( const resp = await client.request({ url }); return resp.data as OperationMetadata; } + +async function deployModel(modelId: String) { + // Construct request + const request = { + name: clientMl.modelPath(PROJECT_ID, LOCATION, 'v20201209133002'), + }; + + const [operation] = await clientMl.deployModel(request); + + // Wait for operation to complete. + const [response] = await operation.promise(); + console.log(`Model deployment finished. ${response}`); +} + +async function logOperationInFirestore( + datasetId: string, + operationMetadata: OperationMetadata, + type: string +) { + return await admin + .firestore() + .collection("operations") + .add({ + last_updated: Date.now(), + type, + done: false, + dataset_id: datasetId, + name: operationMetadata.name, + }); +} \ No newline at end of file diff --git a/functions/src/constants.ts b/functions/src/constants.ts index e9035ee..8b0f4e0 100644 --- a/functions/src/constants.ts +++ b/functions/src/constants.ts @@ -16,26 +16,27 @@ export const PROJECT_ID = process.env.GCLOUD_PROJECT; // The name of the app -export const APP_NAME = 'Custom Image Classifier'; +export const APP_NAME = "Custom Image Classifier"; // AutoML bucket name export const AUTOML_BUCKET = `${PROJECT_ID}-vcm`; // Location for the project -export const LOCATION = 'us-central1'; +export const LOCATION = "us-central1"; // AutoML bucket path -export const AUTOML_BUCKET_URL = `gs://${PROJECT_ID}-vcm`; +export const AUTOML_BUCKET_URL = `gs://${PROJECT_ID}-vcm`;//testproject-afd2f.appspot.com +//export const AUTOML_BUCKET_URL = `gs://${PROJECT_ID}.appspot.com/vcm`; export const AUTOML_API_SCOPE = - 'https://www.googleapis.com/auth/cloud-platform'; + "https://www.googleapis.com/auth/cloud-platform"; export const AUTOML_API_URL = `https://automl.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}`; -export const AUTOML_ROOT_URL = 'https://automl.googleapis.com/v1beta1'; +export const AUTOML_ROOT_URL = "https://automl.googleapis.com/v1"; // TODO: Set this as a part of onboarding -export const FROM_EMAIL = 'customimageclassifier-no-reply@example.com'; +export const FROM_EMAIL = "emigrantdd@gmail.com"; // URL for the Firebase function that serves the AutoML API export const AUTOML_FUNCTIONS_BACKEND = `https://${LOCATION}-${PROJECT_ID}.cloudfunctions.net/automlApi`; diff --git a/functions/src/delete_dataset.ts b/functions/src/delete_dataset.ts index 8dcb0f0..567f29f 100644 --- a/functions/src/delete_dataset.ts +++ b/functions/src/delete_dataset.ts @@ -25,7 +25,7 @@ export const deleteDataset = functions.firestore .document('datasets/{datasetId}') .onDelete(async (snap, context) => { const { datasetId } = context.params; - const { name, automlId } = snap.data() as any; + const { name, automlId } = snap.data(); console.log(`Attempting to delete dataset: ${name} with id: ${datasetId}`); @@ -118,7 +118,7 @@ export const deleteDataset = functions.firestore export const deleteLabel = functions.firestore .document('labels/{labelId}') .onDelete(async (snap, context) => { - const { name } = snap.data() as any; + const { name } = snap.data(); const { labelId } = context.params; console.log(`Attempting to delete label: ${name}`); await deleteImagesForLabels(labelId); @@ -138,7 +138,7 @@ function deleteQueryBatch( db: admin.firestore.Firestore, query: FirebaseFirestore.Query, batchSize: number, - resolve: () => void, + resolve:(unknown) => void, reject: () => void ) { query @@ -161,7 +161,7 @@ function deleteQueryBatch( }) .then(numDeleted => { if (numDeleted === 0) { - resolve(); + resolve.call; return; } @@ -170,6 +170,7 @@ function deleteQueryBatch( process.nextTick(() => { deleteQueryBatch(db, query, batchSize, resolve, reject); }); + return; }) .catch(reject); } diff --git a/functions/src/generate_label_file.ts b/functions/src/generate_label_file.ts index ec6873f..b48d54f 100644 --- a/functions/src/generate_label_file.ts +++ b/functions/src/generate_label_file.ts @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Storage } from '@google-cloud/storage'; -import * as fs from 'fs'; -import * as os from 'os'; -import * as path from 'path'; -import * as functions from 'firebase-functions'; -import { PROJECT_ID, AUTOML_BUCKET } from './constants'; +import { Storage } from "@google-cloud/storage"; +import * as fs from "fs"; +import * as os from "os"; +import * as path from "path"; +import * as functions from "firebase-functions"; +import { PROJECT_ID, AUTOML_BUCKET } from "./constants"; /** * Generates a label file for a dataset (provided as a query param) @@ -27,12 +27,12 @@ import { PROJECT_ID, AUTOML_BUCKET } from './constants'; */ export const generateLabelFile = functions.https.onRequest( async (request, response) => { - const dataset = request.query['dataset']; + const dataset = request.query["dataset"]; if (!dataset) { - response.status(404).json({ error: 'Dataset not found' }); + response.status(404).json({ error: "Dataset not found" }); } try { - const labelsFile = await generateLabel(dataset); + const labelsFile = await generateLabel(dataset as string); response.json({ success: `File uploaded to ${labelsFile}` }); } catch (err) { response.status(500).json({ error: err.toString() }); @@ -68,7 +68,7 @@ async function generateLabel(dataset: string): Promise { .filter((metadata): metadata is ImageMetadata => metadata !== null) .map(({ label, fullPath }) => `gs://${AUTOML_BUCKET}/${fullPath},${label}`); - console.log('Total rows in labels.csv:', csvRows.length); + console.log("Total rows in labels.csv:", csvRows.length); // No videos found, abort if (csvRows.length === 0) { @@ -77,15 +77,15 @@ async function generateLabel(dataset: string): Promise { // now that we have the contents of the file, we write this to storage const destination = `${dataset}/labels.csv`; - const localFilePath = path.join(os.tmpdir(), 'tmp_labels.csv'); + const localFilePath = path.join(os.tmpdir(), "tmp_labels.csv"); return new Promise((resolve, reject) => { - fs.writeFile(localFilePath, csvRows.join('\n'), async err => { + fs.writeFile(localFilePath, csvRows.join("\n"), async err => { if (err) { reject(err); } // upload the file adjacent to the images folder - console.log('Uploading to', destination); + console.log("Uploading to", destination); await storage .bucket(AUTOML_BUCKET) .upload(localFilePath, { destination }); @@ -104,9 +104,9 @@ async function generateLabel(dataset: string): Promise { * format: `datasets/{dataset}/{label}/{image_number}.jpg` */ function getMetadata(fullPath: string): ImageMetadata | null { - const parts = fullPath.replace('datasets/', '').split(path.sep); + const parts = fullPath.replace("datasets/", "").split(path.sep); if (parts.length < 3) { - console.log('unable to split path:' + fullPath); + console.log("unable to split path:" + fullPath); return null; } const [dataset, label] = parts; diff --git a/functions/src/images_upload_delete.ts b/functions/src/images_upload_delete.ts index 6345c7f..5914a33 100644 --- a/functions/src/images_upload_delete.ts +++ b/functions/src/images_upload_delete.ts @@ -25,7 +25,7 @@ export const deleteImage = functions.firestore .document('images/{imageId}') .onDelete(async change => { // 1. Decrement the total images count in label - const { parent_key, uploadPath } = change.data() as any; + const { parent_key, uploadPath } = change.data(); const labelSnapshot = await admin .firestore() @@ -35,11 +35,12 @@ export const deleteImage = functions.firestore await admin.firestore().runTransaction(transaction => { return transaction.get(labelSnapshot).then(labelRef => { if (labelRef.exists) { - const { total_images } = labelRef.data() as any; + const { total_images } = labelRef.data(); transaction.update(labelSnapshot, { total_images: Math.max(total_images - 1, 0), }); } + return null; }); }); diff --git a/functions/src/index.ts b/functions/src/index.ts index d9bbf25..259630a 100644 --- a/functions/src/index.ts +++ b/functions/src/index.ts @@ -12,49 +12,53 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as sgMail from '@sendgrid/mail'; -import * as admin from 'firebase-admin'; -import * as functions from 'firebase-functions'; +import * as sgMail from "@sendgrid/mail"; +import * as admin from "firebase-admin"; +import * as functions from "firebase-functions"; /** App for serving the API that interacts with AutoML API */ -import { app } from './automlapi'; +import { app } from "./automlapi"; -admin.initializeApp(); +// admin.initializeApp(); +const serviceAccount = require('../service-account-key.json'); +admin.initializeApp({ + credential: admin.credential.cert(serviceAccount) +}); sgMail.setApiKey(functions.config().sendgrid.key); /** * A function to check & update progress of a long running operations * in AutoML. */ -export { checkOperationProgress } from './check_operations_progress'; +export { checkOperationProgress } from "./check_operations_progress"; /** * Clean up related metadata (labels, models, videos) from Firestore and storage * when a dataset is deleted, or when a label is deleted */ -export { deleteDataset, deleteLabel } from './delete_dataset'; +export { deleteDataset, deleteLabel } from "./delete_dataset"; /** * Generates a label file for a dataset (provided as a query param) * * For more info on the format of the file refer to * https://cloud.google.com/vision/automl/alpha/docs/prepare#csv */ -export { generateLabelFile } from './generate_label_file'; +export { generateLabelFile } from "./generate_label_file"; /** * A function to initiate all parts of training on automl. * * It listens for changes on operations collections and initiates subsequent * operations accordingly. */ -export { manageTraining } from './manage_training'; +export { manageTraining } from "./manage_training"; /** - * Deletes a collaborator's email from its parent dataset's field + * Deletes a collaborator"s email from its parent dataset"s field * when the collaborator is removed from the collaborators collection */ -export { removeCollaborator } from './remove_collaborator'; +export { removeCollaborator } from "./remove_collaborator"; /** * A function to send an email invite to any new collaborator - * that's added to a dataset + * that"s added to a dataset */ -export { sendInvite } from './send_invite'; +export { sendInvite } from "./send_invite"; /** * A function to convert a video to a set of images. * @@ -64,12 +68,12 @@ export { sendInvite } from './send_invite'; * which should be uploaded to: * `gs://{AUTOML_BUCKET}/{dataset_name}/{label}/{video_ts}/` */ -export { videoToImages } from './video_to_images'; +export { videoToImages } from "./video_to_images"; /** * Functions to manage sample counts and clean up images when new * samples are deleted */ -export { deleteImage } from './images_upload_delete'; +export { deleteImage } from "./images_upload_delete"; /** * Cron-jobs for checking operations progress */ @@ -77,6 +81,6 @@ export { importDataProgressCron, exportModelProgressCron, trainModelProgressCron, -} from './operations_crons'; +} from "./operations_crons"; export const automlApi = functions.https.onRequest(app); diff --git a/functions/src/manage_training.ts b/functions/src/manage_training.ts index 179a3ad..2c3c2dd 100644 --- a/functions/src/manage_training.ts +++ b/functions/src/manage_training.ts @@ -12,22 +12,22 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as functions from 'firebase-functions'; -import * as admin from 'firebase-admin'; -import * as path from 'path'; -import fetch from 'node-fetch'; -import * as luxon from 'luxon'; -import { AUTOML_FUNCTIONS_BACKEND, AUTOML_BUCKET_URL } from './constants'; -import { OperationMetadata } from './types'; -import { Storage } from '@google-cloud/storage'; - -const IMPORT_DATA_OPERATION = 'IMPORT_DATA'; -const TRAIN_MODEL_OPERATION = 'TRAIN_MODEL'; -const EXPORT_MODEL_OPERATION = 'EXPORT_MODEL'; -const MODEL_FILE_NAME = 'model.tflite'; -const LABELS_FILE_NAME = 'dict.txt'; +import * as functions from "firebase-functions"; +import * as admin from "firebase-admin"; +import * as path from "path"; +import fetch from "node-fetch"; +import * as luxon from "luxon"; +import { AUTOML_FUNCTIONS_BACKEND, AUTOML_BUCKET_URL } from "./constants"; +import { OperationMetadata } from "./types"; +import { Storage } from "@google-cloud/storage"; + +const IMPORT_DATA_OPERATION = "IMPORT_DATA"; +const TRAIN_MODEL_OPERATION = "TRAIN_MODEL"; +const EXPORT_MODEL_OPERATION = "EXPORT_MODEL"; +const MODEL_FILE_NAME = "model.tflite"; +const LABELS_FILE_NAME = "dict.txt"; // Format from https://cloud.google.com/vision/automl/alpha/docs/reference/rest/v1beta1/projects.locations.models/export#modelexportoutputconfig -const MODEL_EXPORT_DATE_FORMAT = 'yyyy-MM-dd_HH-mm-ss-SSS'; +const MODEL_EXPORT_DATE_FORMAT = "yyyy-MM-dd_HH-mm-ss-SSS"; /** * A function to initiate all parts of training on automl. @@ -38,28 +38,28 @@ const MODEL_EXPORT_DATE_FORMAT = 'yyyy-MM-dd_HH-mm-ss-SSS'; * IMPORT_DATA -> TRAIN_MODEL -> EXPORT_MODEL */ export const manageTraining = functions.firestore - .document('operations/{operationId}') + .document("operations/{operationId}") .onUpdate(async (change, context) => { const { after, before } = change; console.log(`Operation updated: ${context.params.operationId}`); if (after === undefined || before === undefined) { - console.log('One of after|before is undefined. Aborting...'); + console.log("One of after|before is undefined. Aborting..."); return; } - const { done: newDoneState } = after.data() as any; + const { done: newDoneState } = after.data(); const { type, done: previousDoneState, dataset_id: datasetId, training_budget, - } = before.data() as any; + } = before.data(); // If an IMPORT_DATA operation just went from done: false -> done: true // we initiate TRAIN_MODEL operation to create a new model. if (!previousDoneState && newDoneState && type === IMPORT_DATA_OPERATION) { - console.log('Detected an IMPORT_DATA operation completion'); + console.log("Detected an IMPORT_DATA operation completion"); // 1. trigger the next step, i.e TRAIN_MODEL console.log( @@ -67,20 +67,20 @@ export const manageTraining = functions.firestore ); // call the functions autoML backend to initiate training - const resp = await fetch(AUTOML_FUNCTIONS_BACKEND + '/train', { - method: 'POST', + const resp = await fetch(AUTOML_FUNCTIONS_BACKEND + "/train", { + method: "POST", body: JSON.stringify({ datasetId: datasetId, trainBudget: training_budget === undefined ? 1 : training_budget, }), - headers: { 'Content-Type': 'application/json' }, + headers: { "Content-Type": "application/json" }, }); const json = await resp.json(); - console.log('Got operation response:', json); + console.log("Got operation response:", json); // 2. Add this in operations collection if (resp.status !== 200) { - console.error('Error while initiating training the dataset', resp.body); + console.error("Error while initiating training the dataset", resp.body); return; } @@ -90,38 +90,39 @@ export const manageTraining = functions.firestore operationMetadata, TRAIN_MODEL_OPERATION ); - console.log('Saved operation in firestore'); + console.log("Saved operation in firestore"); } // If a TRAIN_MODEL operation just went from done: false -> done: true, // we initiate EXPORT_MODEL operation for the latest model available if (!previousDoneState && newDoneState && type === TRAIN_MODEL_OPERATION) { - console.log('Detected a TRAIN_MODEL operation completion.'); + console.log("Detected a TRAIN_MODEL operation completion."); // 1. trigger the next sep i.e. EXPORT_MODEL console.log(`Attempting to initiate export for datasetId: ${datasetId}`); // call the functions autoML backend to initiate export const gcsPath = `${AUTOML_BUCKET_URL}/models/on-device/${datasetId}`; - console.log('Attempting to initiate export to gcs path', gcsPath); + console.log("Attempting to initiate export to gcs path", gcsPath); const resp = await fetch( - AUTOML_FUNCTIONS_BACKEND + '/exportlatestmodel', + AUTOML_FUNCTIONS_BACKEND + "/exportlatestmodel", { - method: 'POST', + method: "POST", body: JSON.stringify({ datasetId, gcsPath }), - headers: { 'Content-Type': 'application/json' }, + headers: { "Content-Type": "application/json" }, } ); + console.log('got response to export model'); if (resp.status !== 200) { console.error(`Error while exporting model`, resp.body); return; } const json = await resp.json(); - console.log('Got operation response:', json); + console.log("Got operation response:", json); // 2. Add this in operations collection if (resp.status !== 200) { - console.error('Error while exporting the model for dataset', resp.body); + console.error("Error while exporting the model for dataset", resp.body); return; } @@ -131,15 +132,15 @@ export const manageTraining = functions.firestore operationMetadata, EXPORT_MODEL_OPERATION ); - console.log('Saved operation in firestore'); + console.log("Saved operation in firestore"); } // If an EXPORT_MODEL operationgg just went from done: false -> done: true // we write the file details of the latest export in firestore models if (!previousDoneState && newDoneState && type === EXPORT_MODEL_OPERATION) { - console.log('Detected a EXPORT_MODEL operation completion'); + console.log("Detected a EXPORT_MODEL operation completion"); - console.log('Attempting to find the path for the latest model generated'); + console.log("Attempting to find the path for the latest model generated"); // Model files are stored in AUTOML_BUCKET/models/on-device/$dataset_id/$timestamp/ @@ -158,11 +159,11 @@ export const manageTraining = functions.firestore ); // [3] => folder name if (allExports.length === 0) { - throw new Error('No exports found in ' + prefix); + throw new Error("No exports found in " + prefix); } // Sample folder generated by automl: 2019-03-19_21-30-02-757_tflite/ - const sanitizeFolderName = (s: string) => s.replace('_tflite', ''); + const sanitizeFolderName = (s: string) => s.replace("_tflite", ""); // 2. To get the latest folder, sort the folder names by converting them to dates const latestExportFolder = allExports.sort((a, b) => { @@ -175,10 +176,10 @@ export const manageTraining = functions.firestore MODEL_EXPORT_DATE_FORMAT ); if (!d1.isValid) { - throw new Error('Unable to parse folder name: ' + a); + throw new Error("Unable to parse folder name: " + a); } if (!d2.isValid) { - throw new Error('Unable to parse folder name: ' + b); + throw new Error("Unable to parse folder name: " + b); } return d2.toMillis() - d1.toMillis(); })[0]; @@ -189,9 +190,9 @@ export const manageTraining = functions.firestore ); console.log( - 'Latest export found: ', + "Latest export found: ", latestExportFolder, - 'for timestamp:', + "for timestamp:", latestExportTs.toISO() ); @@ -207,11 +208,11 @@ export const manageTraining = functions.firestore const modelFile = getOnlyElement( modelFiles.filter(filename => filename.includes(MODEL_FILE_NAME)) ); - console.log('Model file:', modelFile, '\nlabels file:', labelsFile); + console.log("Model file:", modelFile, "\nlabels file:", labelsFile); await admin .firestore() - .collection('models') + .collection("models") .add({ dataset_id: datasetId, model: modelFile, @@ -219,7 +220,7 @@ export const manageTraining = functions.firestore generated_at: latestExportTs.toMillis(), }); - console.log('Saved model export info to firestore'); + console.log("Saved model export info to firestore"); // send a push notification to the owner await notifyOwner(datasetId); @@ -230,31 +231,31 @@ async function notifyOwner(datasetId: string) { try { const snapshot = await admin .firestore() - .collection('datasets') - .where('automlId', '==', datasetId) + .collection("datasets") + .where("automlId", "==", datasetId) .get(); const document = getOnlyElement(snapshot.docs); const { token, name } = document.data() as any; await admin.messaging().sendToDevice(token, { notification: { - title: 'Training Complete', + title: "Training Complete", body: `Dataset: ${name} has been trained successfully & can now be used for inference`, }, }); - console.log('sent notification to admin for dataset: ', name); + console.log("sent notification to admin for dataset: ", name); } catch (err) { - console.error('Error sending push notification for dataset ', datasetId); + console.error("Error sending push notification for dataset ", datasetId); console.error(err); } } function getOnlyElement(arr: T[]): T { if (arr.length > 1) { - throw new Error('Too many elements. Expected 1'); + throw new Error("Too many elements. Expected 1"); } if (arr.length === 0) { - throw new Error('Too few elements. Expected 1'); + throw new Error("Too few elements. Expected 1"); } return arr[0]; } @@ -266,7 +267,7 @@ async function logOperationInFirestore( ) { return await admin .firestore() - .collection('operations') + .collection("operations") .add({ last_updated: Date.now(), type, diff --git a/functions/src/operations_crons.ts b/functions/src/operations_crons.ts index 4b0bc49..e522bb0 100644 --- a/functions/src/operations_crons.ts +++ b/functions/src/operations_crons.ts @@ -12,19 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as functions from 'firebase-functions'; -import * as got from 'got'; -import { CHECK_OPERATIONS_URL } from './constants'; +import * as functions from "firebase-functions"; +const got = require('got'); +import { CHECK_OPERATIONS_URL } from "./constants"; /** * Check progress for import data operations */ export const importDataProgressCron = functions.pubsub - .schedule('every 5 minutes') + .schedule("every 5 minutes") .onRun(async () => { try { const response = await got(`${CHECK_OPERATIONS_URL}?type=IMPORT_DATA`); - console.log('successful response', response.body); + console.log("successful response", response.body); } catch (error) { console.error(error.response.body); } @@ -34,11 +34,11 @@ export const importDataProgressCron = functions.pubsub * Check progress for export model operations */ export const exportModelProgressCron = functions.pubsub - .schedule('every 10 minutes') + .schedule("every 10 minutes") .onRun(async () => { try { const response = await got(`${CHECK_OPERATIONS_URL}?type=EXPORT_MODEL`); - console.log('successful response', response.body); + console.log("successful response", response.body); } catch (error) { console.error(error.response.body); } @@ -48,11 +48,11 @@ export const exportModelProgressCron = functions.pubsub * Check progress for train model operations */ export const trainModelProgressCron = functions.pubsub - .schedule('every 15 minutes') + .schedule("every 15 minutes") .onRun(async () => { try { const response = await got(`${CHECK_OPERATIONS_URL}?type=TRAIN_MODEL`); - console.log('successful response', response.body); + console.log("successful response", response.body); } catch (error) { console.error(error.response.body); } diff --git a/functions/src/remove_collaborator.ts b/functions/src/remove_collaborator.ts index 05f4c1d..3a4b7fc 100644 --- a/functions/src/remove_collaborator.ts +++ b/functions/src/remove_collaborator.ts @@ -12,18 +12,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as functions from 'firebase-functions'; -import * as admin from 'firebase-admin'; -import { FieldValue } from '@google-cloud/firestore'; +import * as functions from "firebase-functions"; +import * as admin from "firebase-admin"; +import { FieldValue } from "@google-cloud/firestore"; /** - * Deletes a collaborator's email from its parent dataset's field + * Deletes a collaborator"s email from its parent dataset"s field * when the collaborator is removed from the collaborators collection */ export const removeCollaborator = functions.firestore - .document('collaborators/{collaboratorId}') + .document("collaborators/{collaboratorId}") .onDelete(async (snap, context) => { - const { email, parent_key: datasetKey } = snap.data() as any; + const { email, parent_key: datasetKey } = snap.data(); console.log( `Attempting to remove ${email} from dataset with key: ${datasetKey}` @@ -31,7 +31,7 @@ export const removeCollaborator = functions.firestore try { const datasetRef = admin .firestore() - .collection('datasets') + .collection("datasets") .doc(datasetKey); await datasetRef.update({ collaborators: FieldValue.arrayRemove(email) }); } catch (err) { diff --git a/functions/src/send_invite.ts b/functions/src/send_invite.ts index fbd8ec8..2005955 100644 --- a/functions/src/send_invite.ts +++ b/functions/src/send_invite.ts @@ -12,22 +12,22 @@ // See the License for the specific language governing permissions and // limitations under the License. -import * as sgMail from '@sendgrid/mail'; -import * as admin from 'firebase-admin'; -import * as functions from 'firebase-functions'; -import { FROM_EMAIL, APP_NAME } from './constants'; +import * as sgMail from "@sendgrid/mail"; +import * as admin from "firebase-admin"; +import * as functions from "firebase-functions"; +import { FROM_EMAIL, APP_NAME } from "./constants"; /** * A function to send an email invite to any new collaborator - * that's added to a dataset + * that"s added to a dataset */ export const sendInvite = functions.firestore - .document('collaborators/{collaboratorId}') + .document("collaborators/{collaboratorId}") .onCreate(async (change, context) => { - const { email, parent_key: datasetId } = change.data() as any; + const { email, parent_key: datasetId } = change.data(); const datasetSnapshot = await admin .firestore() - .collection('datasets') + .collection("datasets") .doc(datasetId) .get(); @@ -36,10 +36,10 @@ export const sendInvite = functions.firestore const msg = { to: email, from: FROM_EMAIL, - subject: `You've been invited to ${APP_NAME}!`, - text: `You've been invited to collaborate on a dataset on ${APP_NAME}!`, + subject: `You"ve been invited to ${APP_NAME}!`, + text: `You"ve been invited to collaborate on a dataset on ${APP_NAME}!`, html: - `You've been invited to collaborate on the ${datasetName} dataset` + + `You"ve been invited to collaborate on the ${datasetName} dataset` + ` on ${APP_NAME}. Open the app and login to access the dataset.`, }; @@ -47,7 +47,7 @@ export const sendInvite = functions.firestore await sgMail.send(msg); console.log(`Sent invite to user: ${email} for dataset: ${datasetName}`); } catch (err) { - console.error('Unable to send email'); + console.error("Unable to send email"); console.error(err); } }); diff --git a/functions/src/video_to_images.ts b/functions/src/video_to_images.ts index 72a005f..dae448a 100644 --- a/functions/src/video_to_images.ts +++ b/functions/src/video_to_images.ts @@ -12,17 +12,17 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Storage, Bucket } from '@google-cloud/storage'; -import * as functions from 'firebase-functions'; -import * as path from 'path'; -import * as mkdirp from 'mkdirp'; -import * as ffmpeg from 'fluent-ffmpeg'; -import * as ffmpeg_static from 'ffmpeg-static'; -import * as os from 'os'; -import * as fs from 'fs'; -import * as rimraf from 'rimraf'; -import * as admin from 'firebase-admin'; -import { PROJECT_ID, AUTOML_BUCKET } from './constants'; +import { Storage, Bucket } from "@google-cloud/storage"; +import * as functions from "firebase-functions"; +import * as path from "path"; +import * as mkdirp from "mkdirp"; +import * as ffmpeg from "fluent-ffmpeg"; +import * as ffmpeg_static from "ffmpeg-static"; +import * as os from "os"; +import * as fs from "fs"; +import * as rimraf from "rimraf"; +import * as admin from "firebase-admin"; +import { PROJECT_ID, AUTOML_BUCKET } from "./constants"; interface VideoMetadata { uploader: string; @@ -47,11 +47,11 @@ export const videoToImages = functions.storage const filePath = object.name!; const fileName = path.basename(filePath); const videoMetadata = (object.metadata as unknown) as VideoMetadata; - console.log('Video with metadata', videoMetadata); + console.log("Video with metadata", videoMetadata); // Exit if this is triggered on a file that is not an image. - if (!filePath.endsWith('mp4')) { - console.log('Not a dataset video. Exiting...'); + if (!filePath.endsWith("mp4")) { + console.log("Not a dataset video. Exiting..."); return; } @@ -60,25 +60,25 @@ export const videoToImages = functions.storage const tempFilePath = path.join(os.tmpdir(), fileName); const videoFile = bucket.file(filePath); await videoFile.download({ destination: tempFilePath }); - console.log('File path', filePath); - console.log('Video downloaded locally to', tempFilePath); + console.log("File path", filePath); + console.log("Video downloaded locally to", tempFilePath); // Generate images from the video const videoTitle = path .basename(filePath) - .replace(path.extname(filePath), ''); + .replace(path.extname(filePath), ""); const imgOutputDir = path.join(os.tmpdir(), `images/${videoTitle}`); - // create the folder for generating images if it doesn't exist, - // so that ffmpeg doesn't fail + // create the folder for generating images if it doesn"t exist, + // so that ffmpeg doesn"t fail if (!fs.existsSync(imgOutputDir)) { mkdirp.sync(imgOutputDir); } console.log(`Generating images in ${imgOutputDir}`); const command = ffmpeg(tempFilePath) - .setFfmpegPath(ffmpeg_static.path) - .outputOption('-vf fps=1') + .setFfmpegPath(ffmpeg_static) + .outputOption("-vf fps=1") .output(`${imgOutputDir}/img-%4d.jpg`); // run the command @@ -90,11 +90,11 @@ export const videoToImages = functions.storage // construct upload destination const uploadDestination = buildUploadPath(filePath); - console.log('Uploading images from video to ', uploadDestination); + console.log("Uploading images from video to ", uploadDestination); // upload generated images to gcs bucket // A service-account key is required for signing the URL. - const keyFilename = path.join(__dirname, 'service-account-key.json'); + const keyFilename = path.join(__dirname, "service-account-key.json"); const autoMlBucket = new Storage({ keyFilename }).bucket(AUTOML_BUCKET); await uploadFolderToGCS( autoMlBucket, @@ -103,13 +103,13 @@ export const videoToImages = functions.storage videoMetadata, videoTitle ); - console.log('Upload completed.. Proceeding to deletion'); + console.log("Upload completed.. Proceeding to deletion"); // delete the video locally (& GCS) along with the files generated await videoFile.delete(); fs.unlinkSync(tempFilePath); rimraf.sync(imgOutputDir); - console.log('Conversion completed'); + console.log("Conversion completed"); }); /** @@ -120,9 +120,9 @@ export const videoToImages = functions.storage function buildUploadPath(videoPath: string): string { const parts = videoPath.split(path.sep); if (parts.length < 4) { - throw new Error('too few parts in path' + videoPath); + throw new Error("too few parts in path" + videoPath); } - return path.join('datasets', parts[1] /** dataset */, parts[2] /** label */); + return path.join("datasets", parts[1] /** dataset */, parts[2] /** label */); } /** @@ -131,8 +131,8 @@ function buildUploadPath(videoPath: string): string { function promisifyCommand(command: ffmpeg.FfmpegCommand): Promise { return new Promise((resolve, reject) => { command - .on('end', resolve) - .on('error', reject) + .on("end", resolve) + .on("error", reject) .run(); }); } @@ -156,7 +156,7 @@ async function uploadFolderToGCS( videoTitle: string ) { console.log(`Uploading to gs://${bucket.name}/${destination}`); - const imagesCollectionRef = await admin.firestore().collection('images'); + const imagesCollectionRef = await admin.firestore().collection("images"); const { uploader, dataset_parent_key, parent_key } = videoMetadata; const neverExpireTs = new Date(2050, 1, 1).getTime(); @@ -174,11 +174,11 @@ async function uploadFolderToGCS( // get a signed url const [signedUrl] = await bucket .file(fileDest) - .getSignedUrl({ action: 'read', expires: neverExpireTs }); + .getSignedUrl({ action: "read", expires: neverExpireTs }); // and add it in firestore await imagesCollectionRef.doc().set({ - type: 'TRAIN', + type: "TRAIN", filename: filename, parent_key: parent_key, uploader: uploader, @@ -201,15 +201,17 @@ async function uploadFolderToGCS( // Update the total count in Firestore const labelSnapshot = await admin .firestore() - .collection('labels') + .collection("labels") .doc(parent_key); return admin.firestore().runTransaction(transaction => { return transaction.get(labelSnapshot).then(labelRef => { - const { total_images } = labelRef.data() as any; + const { total_images } = labelRef.data(); transaction.update(labelSnapshot, { total_images: total_images + uploadPromises.length, }); + return; }); + }); } diff --git a/functions/tsconfig.json b/functions/tsconfig.json index 75bf38d..60a669b 100644 --- a/functions/tsconfig.json +++ b/functions/tsconfig.json @@ -1,14 +1,17 @@ { "compilerOptions": { + "lib": ["es2020"], "module": "commonjs", "noImplicitReturns": true, - "noUnusedLocals": true, "outDir": "lib", "sourceMap": true, - "strict": true, - "target": "es2015" + "target": "es2020" }, "compileOnSave": true, +// "rules": { +// "no-implicit-dependencies": [true, "dev"], + +// }, "include": [ "src" ] diff --git a/functions/tslint.json b/functions/tslint.json index befb9f4..4d35c4e 100644 --- a/functions/tslint.json +++ b/functions/tslint.json @@ -96,7 +96,7 @@ // Warn when using deprecated APIs. "deprecation": {"severity": "warning"}, - // -- Light Warnings -- + // -- Light Warnigns -- // These rules are intended to help developers use better style. Simpler code has fewer bugs. These would be "info" // if TSLint supported such a level. @@ -107,10 +107,13 @@ // Warns if function overloads could be unified into a single function with optional or rest parameters. "unified-signatures": {"severity": "warning"}, + // Warns if code has an import or variable that is unused. + "no-unused-variable": {"severity": "warning"}, + // Prefer const for values that will not change. This better documents code. "prefer-const": {"severity": "warning"}, - // Multi-line object literals and function calls should have a trailing comma. This helps avoid merge conflicts. + // Multi-line object liiterals and function calls should have a trailing comma. This helps avoid merge conflicts. "trailing-comma": {"severity": "warning"} },