├── .gitignore
├── .metadata
├── README.md
├── android
├── app
│ ├── build.gradle
│ └── src
│ │ ├── debug
│ │ └── AndroidManifest.xml
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ │ └── com
│ │ │ │ └── example
│ │ │ │ └── websocket_lan_chat
│ │ │ │ └── MainActivity.java
│ │ └── res
│ │ │ ├── drawable
│ │ │ └── launch_background.xml
│ │ │ ├── mipmap-hdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxxhdpi
│ │ │ └── ic_launcher.png
│ │ │ └── values
│ │ │ └── styles.xml
│ │ └── profile
│ │ └── AndroidManifest.xml
├── build.gradle
├── gradle.properties
├── gradle
│ └── wrapper
│ │ └── gradle-wrapper.properties
└── settings.gradle
├── ios
├── Flutter
│ ├── AppFrameworkInfo.plist
│ ├── Debug.xcconfig
│ └── Release.xcconfig
├── Runner.xcodeproj
│ ├── project.pbxproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ └── xcshareddata
│ │ └── xcschemes
│ │ └── Runner.xcscheme
├── Runner.xcworkspace
│ └── contents.xcworkspacedata
└── Runner
│ ├── AppDelegate.h
│ ├── AppDelegate.m
│ ├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ ├── Contents.json
│ │ ├── Icon-App-1024x1024@1x.png
│ │ ├── Icon-App-20x20@1x.png
│ │ ├── Icon-App-20x20@2x.png
│ │ ├── Icon-App-20x20@3x.png
│ │ ├── Icon-App-29x29@1x.png
│ │ ├── Icon-App-29x29@2x.png
│ │ ├── Icon-App-29x29@3x.png
│ │ ├── Icon-App-40x40@1x.png
│ │ ├── Icon-App-40x40@2x.png
│ │ ├── Icon-App-40x40@3x.png
│ │ ├── Icon-App-60x60@2x.png
│ │ ├── Icon-App-60x60@3x.png
│ │ ├── Icon-App-76x76@1x.png
│ │ ├── Icon-App-76x76@2x.png
│ │ └── Icon-App-83.5x83.5@2x.png
│ └── LaunchImage.imageset
│ │ ├── Contents.json
│ │ ├── LaunchImage.png
│ │ ├── LaunchImage@2x.png
│ │ ├── LaunchImage@3x.png
│ │ └── README.md
│ ├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
│ ├── Info.plist
│ └── main.m
├── lib
├── config
│ └── config.dart
├── data
│ └── data.dart
├── main.dart
└── src
│ ├── models
│ ├── message.dart
│ └── user.dart
│ ├── screens
│ ├── home_screen.dart
│ └── welcome_screen.dart
│ └── widgets
│ ├── message_input.dart
│ ├── message_item.dart
│ └── message_list.dart
├── pubspec.lock
├── pubspec.yaml
├── test
└── widget_test.dart
└── websocket
├── .gitignore
├── README.md
├── app
├── client.js
└── server.js
├── config
└── config.js
├── package-lock.json
└── package.json
/.gitignore:
--------------------------------------------------------------------------------
1 | # Miscellaneous
2 | *.class
3 | *.log
4 | *.pyc
5 | *.swp
6 | .DS_Store
7 | .atom/
8 | .buildlog/
9 | .history
10 | .svn/
11 |
12 | # IntelliJ related
13 | *.iml
14 | *.ipr
15 | *.iws
16 | .idea/
17 |
18 | # Visual Studio Code related
19 | .vscode/
20 |
21 | # Flutter/Dart/Pub related
22 | **/doc/api/
23 | .dart_tool/
24 | .flutter-plugins
25 | .packages
26 | .pub-cache/
27 | .pub/
28 | /build/
29 |
30 | # Android related
31 | **/android/**/gradle-wrapper.jar
32 | **/android/.gradle
33 | **/android/captures/
34 | **/android/gradlew
35 | **/android/gradlew.bat
36 | **/android/local.properties
37 | **/android/**/GeneratedPluginRegistrant.java
38 |
39 | # iOS/XCode related
40 | **/ios/**/*.mode1v3
41 | **/ios/**/*.mode2v3
42 | **/ios/**/*.moved-aside
43 | **/ios/**/*.pbxuser
44 | **/ios/**/*.perspectivev3
45 | **/ios/**/*sync/
46 | **/ios/**/.sconsign.dblite
47 | **/ios/**/.tags*
48 | **/ios/**/.vagrant/
49 | **/ios/**/DerivedData/
50 | **/ios/**/Icon?
51 | **/ios/**/Pods/
52 | **/ios/**/.symlinks/
53 | **/ios/**/profile
54 | **/ios/**/xcuserdata
55 | **/ios/.generated/
56 | **/ios/Flutter/App.framework
57 | **/ios/Flutter/Flutter.framework
58 | **/ios/Flutter/Generated.xcconfig
59 | **/ios/Flutter/app.flx
60 | **/ios/Flutter/app.zip
61 | **/ios/Flutter/flutter_assets/
62 | **/ios/ServiceDefinitions.json
63 | **/ios/Runner/GeneratedPluginRegistrant.*
64 |
65 | # Exceptions to above rules.
66 | !**/ios/**/default.mode1v3
67 | !**/ios/**/default.mode2v3
68 | !**/ios/**/default.pbxuser
69 | !**/ios/**/default.perspectivev3
70 | !/packages/flutter_tools/test/data/dart_dependencies_test/**/.packages
71 |
--------------------------------------------------------------------------------
/.metadata:
--------------------------------------------------------------------------------
1 | # This file tracks properties of this Flutter project.
2 | # Used by Flutter tool to assess capabilities and perform upgrades etc.
3 | #
4 | # This file should be version controlled and should not be manually edited.
5 |
6 | version:
7 | revision: 7a4c33425ddd78c54aba07d86f3f9a4a0051769b
8 | channel: stable
9 |
10 | project_type: app
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Flutter WebSocket LAN Chat
2 |
3 | 💬 Chat on your Local Area Network with this Flutter application.
4 |
5 | ## Structure
6 | This repository contains 2 main projects:
7 | 1. A NodeJS project that is located under the `websocket` folder.
8 | 2. Flutter project that is in fact all these folders except for the `websocket` folder.
9 |
10 | ## Getting Started
11 |
12 | It is really easy to get started:
13 | 1. Run the WebSocket -> [Guide](https://github.com/devrnt/flutter-websocket-LAN-chat/blob/master/websocket/README.md)
14 | 2. Build the flutter project -> `flutter build apk --release` and `flutter install`
15 |
16 | ## Why
17 | This project is mainly created to show of the power of a WebSocket. I also made a Flutter application to show some best practices, like using the `provider`, `web_socket_channel` and `uuid` packages.
18 |
19 | And ofcourse LAN chatting is very useful if there is a Zombie 🧟. *I've actually no idea why I've said that*.
20 |
21 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | def localProperties = new Properties()
2 | def localPropertiesFile = rootProject.file('local.properties')
3 | if (localPropertiesFile.exists()) {
4 | localPropertiesFile.withReader('UTF-8') { reader ->
5 | localProperties.load(reader)
6 | }
7 | }
8 |
9 | def flutterRoot = localProperties.getProperty('flutter.sdk')
10 | if (flutterRoot == null) {
11 | throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
12 | }
13 |
14 | def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
15 | if (flutterVersionCode == null) {
16 | flutterVersionCode = '1'
17 | }
18 |
19 | def flutterVersionName = localProperties.getProperty('flutter.versionName')
20 | if (flutterVersionName == null) {
21 | flutterVersionName = '1.0'
22 | }
23 |
24 | apply plugin: 'com.android.application'
25 | apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
26 |
27 | android {
28 | compileSdkVersion 28
29 |
30 | lintOptions {
31 | disable 'InvalidPackage'
32 | }
33 |
34 | defaultConfig {
35 | // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
36 | applicationId "com.example.websocket_lan_chat"
37 | minSdkVersion 16
38 | targetSdkVersion 28
39 | versionCode flutterVersionCode.toInteger()
40 | versionName flutterVersionName
41 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
42 | }
43 |
44 | buildTypes {
45 | release {
46 | // TODO: Add your own signing config for the release build.
47 | // Signing with the debug keys for now, so `flutter run --release` works.
48 | signingConfig signingConfigs.debug
49 | }
50 | }
51 | }
52 |
53 | flutter {
54 | source '../..'
55 | }
56 |
57 | dependencies {
58 | testImplementation 'junit:junit:4.12'
59 | androidTestImplementation 'com.android.support.test:runner:1.0.2'
60 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
61 | }
62 |
--------------------------------------------------------------------------------
/android/app/src/debug/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
11 |
15 |
22 |
26 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/example/websocket_lan_chat/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.example.websocket_lan_chat;
2 |
3 | import android.os.Bundle;
4 | import io.flutter.app.FlutterActivity;
5 | import io.flutter.plugins.GeneratedPluginRegistrant;
6 |
7 | public class MainActivity extends FlutterActivity {
8 | @Override
9 | protected void onCreate(Bundle savedInstanceState) {
10 | super.onCreate(savedInstanceState);
11 | GeneratedPluginRegistrant.registerWith(this);
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/launch_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
12 |
13 |
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/android/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
8 |
9 |
--------------------------------------------------------------------------------
/android/app/src/profile/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | buildscript {
2 | repositories {
3 | google()
4 | jcenter()
5 | }
6 |
7 | dependencies {
8 | classpath 'com.android.tools.build:gradle:3.2.1'
9 | }
10 | }
11 |
12 | allprojects {
13 | repositories {
14 | google()
15 | jcenter()
16 | }
17 | }
18 |
19 | rootProject.buildDir = '../build'
20 | subprojects {
21 | project.buildDir = "${rootProject.buildDir}/${project.name}"
22 | }
23 | subprojects {
24 | project.evaluationDependsOn(':app')
25 | }
26 |
27 | task clean(type: Delete) {
28 | delete rootProject.buildDir
29 | }
30 |
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | org.gradle.jvmargs=-Xmx1536M
2 |
--------------------------------------------------------------------------------
/android/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Fri Jun 23 08:50:38 CEST 2017
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip
7 |
--------------------------------------------------------------------------------
/android/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app'
2 |
3 | def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
4 |
5 | def plugins = new Properties()
6 | def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
7 | if (pluginsFile.exists()) {
8 | pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
9 | }
10 |
11 | plugins.each { name, path ->
12 | def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
13 | include ":$name"
14 | project(":$name").projectDir = pluginDirectory
15 | }
16 |
--------------------------------------------------------------------------------
/ios/Flutter/AppFrameworkInfo.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | App
9 | CFBundleIdentifier
10 | io.flutter.flutter.app
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | App
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1.0
23 | MinimumOSVersion
24 | 8.0
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Flutter/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Flutter/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Generated.xcconfig"
2 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; };
11 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
12 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; };
13 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 3B80C3931E831B6300D905FE /* App.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
14 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; };
15 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 9740EEBA1CF902C7004384FC /* Flutter.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
16 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 9740EEB21CF90195004384FC /* Debug.xcconfig */; };
17 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */; };
18 | 97C146F31CF9000F007C117D /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 97C146F21CF9000F007C117D /* main.m */; };
19 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; };
20 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; };
21 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; };
22 | /* End PBXBuildFile section */
23 |
24 | /* Begin PBXCopyFilesBuildPhase section */
25 | 9705A1C41CF9048500538489 /* Embed Frameworks */ = {
26 | isa = PBXCopyFilesBuildPhase;
27 | buildActionMask = 2147483647;
28 | dstPath = "";
29 | dstSubfolderSpec = 10;
30 | files = (
31 | 3B80C3951E831B6300D905FE /* App.framework in Embed Frameworks */,
32 | 9705A1C71CF904A300538489 /* Flutter.framework in Embed Frameworks */,
33 | );
34 | name = "Embed Frameworks";
35 | runOnlyForDeploymentPostprocessing = 0;
36 | };
37 | /* End PBXCopyFilesBuildPhase section */
38 |
39 | /* Begin PBXFileReference section */
40 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; };
41 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; };
42 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; };
43 | 3B80C3931E831B6300D905FE /* App.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = App.framework; path = Flutter/App.framework; sourceTree = ""; };
44 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; };
45 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
46 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; };
47 | 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; };
48 | 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; };
49 | 9740EEBA1CF902C7004384FC /* Flutter.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Flutter.framework; path = Flutter/Flutter.framework; sourceTree = ""; };
50 | 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; };
51 | 97C146F21CF9000F007C117D /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
52 | 97C146FB1CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
53 | 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
54 | 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
55 | 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
56 | /* End PBXFileReference section */
57 |
58 | /* Begin PBXFrameworksBuildPhase section */
59 | 97C146EB1CF9000F007C117D /* Frameworks */ = {
60 | isa = PBXFrameworksBuildPhase;
61 | buildActionMask = 2147483647;
62 | files = (
63 | 9705A1C61CF904A100538489 /* Flutter.framework in Frameworks */,
64 | 3B80C3941E831B6300D905FE /* App.framework in Frameworks */,
65 | );
66 | runOnlyForDeploymentPostprocessing = 0;
67 | };
68 | /* End PBXFrameworksBuildPhase section */
69 |
70 | /* Begin PBXGroup section */
71 | 9740EEB11CF90186004384FC /* Flutter */ = {
72 | isa = PBXGroup;
73 | children = (
74 | 3B80C3931E831B6300D905FE /* App.framework */,
75 | 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */,
76 | 9740EEBA1CF902C7004384FC /* Flutter.framework */,
77 | 9740EEB21CF90195004384FC /* Debug.xcconfig */,
78 | 7AFA3C8E1D35360C0083082E /* Release.xcconfig */,
79 | 9740EEB31CF90195004384FC /* Generated.xcconfig */,
80 | );
81 | name = Flutter;
82 | sourceTree = "";
83 | };
84 | 97C146E51CF9000F007C117D = {
85 | isa = PBXGroup;
86 | children = (
87 | 9740EEB11CF90186004384FC /* Flutter */,
88 | 97C146F01CF9000F007C117D /* Runner */,
89 | 97C146EF1CF9000F007C117D /* Products */,
90 | CF3B75C9A7D2FA2A4C99F110 /* Frameworks */,
91 | );
92 | sourceTree = "";
93 | };
94 | 97C146EF1CF9000F007C117D /* Products */ = {
95 | isa = PBXGroup;
96 | children = (
97 | 97C146EE1CF9000F007C117D /* Runner.app */,
98 | );
99 | name = Products;
100 | sourceTree = "";
101 | };
102 | 97C146F01CF9000F007C117D /* Runner */ = {
103 | isa = PBXGroup;
104 | children = (
105 | 7AFFD8ED1D35381100E5BB4D /* AppDelegate.h */,
106 | 7AFFD8EE1D35381100E5BB4D /* AppDelegate.m */,
107 | 97C146FA1CF9000F007C117D /* Main.storyboard */,
108 | 97C146FD1CF9000F007C117D /* Assets.xcassets */,
109 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */,
110 | 97C147021CF9000F007C117D /* Info.plist */,
111 | 97C146F11CF9000F007C117D /* Supporting Files */,
112 | 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */,
113 | 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */,
114 | );
115 | path = Runner;
116 | sourceTree = "";
117 | };
118 | 97C146F11CF9000F007C117D /* Supporting Files */ = {
119 | isa = PBXGroup;
120 | children = (
121 | 97C146F21CF9000F007C117D /* main.m */,
122 | );
123 | name = "Supporting Files";
124 | sourceTree = "";
125 | };
126 | /* End PBXGroup section */
127 |
128 | /* Begin PBXNativeTarget section */
129 | 97C146ED1CF9000F007C117D /* Runner */ = {
130 | isa = PBXNativeTarget;
131 | buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */;
132 | buildPhases = (
133 | 9740EEB61CF901F6004384FC /* Run Script */,
134 | 97C146EA1CF9000F007C117D /* Sources */,
135 | 97C146EB1CF9000F007C117D /* Frameworks */,
136 | 97C146EC1CF9000F007C117D /* Resources */,
137 | 9705A1C41CF9048500538489 /* Embed Frameworks */,
138 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */,
139 | );
140 | buildRules = (
141 | );
142 | dependencies = (
143 | );
144 | name = Runner;
145 | productName = Runner;
146 | productReference = 97C146EE1CF9000F007C117D /* Runner.app */;
147 | productType = "com.apple.product-type.application";
148 | };
149 | /* End PBXNativeTarget section */
150 |
151 | /* Begin PBXProject section */
152 | 97C146E61CF9000F007C117D /* Project object */ = {
153 | isa = PBXProject;
154 | attributes = {
155 | LastUpgradeCheck = 0910;
156 | ORGANIZATIONNAME = "The Chromium Authors";
157 | TargetAttributes = {
158 | 97C146ED1CF9000F007C117D = {
159 | CreatedOnToolsVersion = 7.3.1;
160 | };
161 | };
162 | };
163 | buildConfigurationList = 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */;
164 | compatibilityVersion = "Xcode 3.2";
165 | developmentRegion = English;
166 | hasScannedForEncodings = 0;
167 | knownRegions = (
168 | en,
169 | Base,
170 | );
171 | mainGroup = 97C146E51CF9000F007C117D;
172 | productRefGroup = 97C146EF1CF9000F007C117D /* Products */;
173 | projectDirPath = "";
174 | projectRoot = "";
175 | targets = (
176 | 97C146ED1CF9000F007C117D /* Runner */,
177 | );
178 | };
179 | /* End PBXProject section */
180 |
181 | /* Begin PBXResourcesBuildPhase section */
182 | 97C146EC1CF9000F007C117D /* Resources */ = {
183 | isa = PBXResourcesBuildPhase;
184 | buildActionMask = 2147483647;
185 | files = (
186 | 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */,
187 | 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */,
188 | 9740EEB41CF90195004384FC /* Debug.xcconfig in Resources */,
189 | 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */,
190 | 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */,
191 | );
192 | runOnlyForDeploymentPostprocessing = 0;
193 | };
194 | /* End PBXResourcesBuildPhase section */
195 |
196 | /* Begin PBXShellScriptBuildPhase section */
197 | 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = {
198 | isa = PBXShellScriptBuildPhase;
199 | buildActionMask = 2147483647;
200 | files = (
201 | );
202 | inputPaths = (
203 | );
204 | name = "Thin Binary";
205 | outputPaths = (
206 | );
207 | runOnlyForDeploymentPostprocessing = 0;
208 | shellPath = /bin/sh;
209 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" thin";
210 | };
211 | 9740EEB61CF901F6004384FC /* Run Script */ = {
212 | isa = PBXShellScriptBuildPhase;
213 | buildActionMask = 2147483647;
214 | files = (
215 | );
216 | inputPaths = (
217 | );
218 | name = "Run Script";
219 | outputPaths = (
220 | );
221 | runOnlyForDeploymentPostprocessing = 0;
222 | shellPath = /bin/sh;
223 | shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build";
224 | };
225 | /* End PBXShellScriptBuildPhase section */
226 |
227 | /* Begin PBXSourcesBuildPhase section */
228 | 97C146EA1CF9000F007C117D /* Sources */ = {
229 | isa = PBXSourcesBuildPhase;
230 | buildActionMask = 2147483647;
231 | files = (
232 | 978B8F6F1D3862AE00F588F7 /* AppDelegate.m in Sources */,
233 | 97C146F31CF9000F007C117D /* main.m in Sources */,
234 | 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */,
235 | );
236 | runOnlyForDeploymentPostprocessing = 0;
237 | };
238 | /* End PBXSourcesBuildPhase section */
239 |
240 | /* Begin PBXVariantGroup section */
241 | 97C146FA1CF9000F007C117D /* Main.storyboard */ = {
242 | isa = PBXVariantGroup;
243 | children = (
244 | 97C146FB1CF9000F007C117D /* Base */,
245 | );
246 | name = Main.storyboard;
247 | sourceTree = "";
248 | };
249 | 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */ = {
250 | isa = PBXVariantGroup;
251 | children = (
252 | 97C147001CF9000F007C117D /* Base */,
253 | );
254 | name = LaunchScreen.storyboard;
255 | sourceTree = "";
256 | };
257 | /* End PBXVariantGroup section */
258 |
259 | /* Begin XCBuildConfiguration section */
260 | 249021D3217E4FDB00AE95B9 /* Profile */ = {
261 | isa = XCBuildConfiguration;
262 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
263 | buildSettings = {
264 | ALWAYS_SEARCH_USER_PATHS = NO;
265 | CLANG_ANALYZER_NONNULL = YES;
266 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
267 | CLANG_CXX_LIBRARY = "libc++";
268 | CLANG_ENABLE_MODULES = YES;
269 | CLANG_ENABLE_OBJC_ARC = YES;
270 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
271 | CLANG_WARN_BOOL_CONVERSION = YES;
272 | CLANG_WARN_COMMA = YES;
273 | CLANG_WARN_CONSTANT_CONVERSION = YES;
274 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
275 | CLANG_WARN_EMPTY_BODY = YES;
276 | CLANG_WARN_ENUM_CONVERSION = YES;
277 | CLANG_WARN_INFINITE_RECURSION = YES;
278 | CLANG_WARN_INT_CONVERSION = YES;
279 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
280 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
281 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
282 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
283 | CLANG_WARN_STRICT_PROTOTYPES = YES;
284 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
285 | CLANG_WARN_UNREACHABLE_CODE = YES;
286 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
287 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
288 | COPY_PHASE_STRIP = NO;
289 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
290 | ENABLE_NS_ASSERTIONS = NO;
291 | ENABLE_STRICT_OBJC_MSGSEND = YES;
292 | GCC_C_LANGUAGE_STANDARD = gnu99;
293 | GCC_NO_COMMON_BLOCKS = YES;
294 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
295 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
296 | GCC_WARN_UNDECLARED_SELECTOR = YES;
297 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
298 | GCC_WARN_UNUSED_FUNCTION = YES;
299 | GCC_WARN_UNUSED_VARIABLE = YES;
300 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
301 | MTL_ENABLE_DEBUG_INFO = NO;
302 | SDKROOT = iphoneos;
303 | TARGETED_DEVICE_FAMILY = "1,2";
304 | VALIDATE_PRODUCT = YES;
305 | };
306 | name = Profile;
307 | };
308 | 249021D4217E4FDB00AE95B9 /* Profile */ = {
309 | isa = XCBuildConfiguration;
310 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
311 | buildSettings = {
312 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
313 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
314 | DEVELOPMENT_TEAM = S8QB4VV633;
315 | ENABLE_BITCODE = NO;
316 | FRAMEWORK_SEARCH_PATHS = (
317 | "$(inherited)",
318 | "$(PROJECT_DIR)/Flutter",
319 | );
320 | INFOPLIST_FILE = Runner/Info.plist;
321 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
322 | LIBRARY_SEARCH_PATHS = (
323 | "$(inherited)",
324 | "$(PROJECT_DIR)/Flutter",
325 | );
326 | PRODUCT_BUNDLE_IDENTIFIER = com.example.websocketLanChat;
327 | PRODUCT_NAME = "$(TARGET_NAME)";
328 | VERSIONING_SYSTEM = "apple-generic";
329 | };
330 | name = Profile;
331 | };
332 | 97C147031CF9000F007C117D /* Debug */ = {
333 | isa = XCBuildConfiguration;
334 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
335 | buildSettings = {
336 | ALWAYS_SEARCH_USER_PATHS = NO;
337 | CLANG_ANALYZER_NONNULL = YES;
338 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
339 | CLANG_CXX_LIBRARY = "libc++";
340 | CLANG_ENABLE_MODULES = YES;
341 | CLANG_ENABLE_OBJC_ARC = YES;
342 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
343 | CLANG_WARN_BOOL_CONVERSION = YES;
344 | CLANG_WARN_COMMA = YES;
345 | CLANG_WARN_CONSTANT_CONVERSION = YES;
346 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
347 | CLANG_WARN_EMPTY_BODY = YES;
348 | CLANG_WARN_ENUM_CONVERSION = YES;
349 | CLANG_WARN_INFINITE_RECURSION = YES;
350 | CLANG_WARN_INT_CONVERSION = YES;
351 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
352 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
353 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
354 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
355 | CLANG_WARN_STRICT_PROTOTYPES = YES;
356 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
357 | CLANG_WARN_UNREACHABLE_CODE = YES;
358 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
359 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
360 | COPY_PHASE_STRIP = NO;
361 | DEBUG_INFORMATION_FORMAT = dwarf;
362 | ENABLE_STRICT_OBJC_MSGSEND = YES;
363 | ENABLE_TESTABILITY = YES;
364 | GCC_C_LANGUAGE_STANDARD = gnu99;
365 | GCC_DYNAMIC_NO_PIC = NO;
366 | GCC_NO_COMMON_BLOCKS = YES;
367 | GCC_OPTIMIZATION_LEVEL = 0;
368 | GCC_PREPROCESSOR_DEFINITIONS = (
369 | "DEBUG=1",
370 | "$(inherited)",
371 | );
372 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
373 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
374 | GCC_WARN_UNDECLARED_SELECTOR = YES;
375 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
376 | GCC_WARN_UNUSED_FUNCTION = YES;
377 | GCC_WARN_UNUSED_VARIABLE = YES;
378 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
379 | MTL_ENABLE_DEBUG_INFO = YES;
380 | ONLY_ACTIVE_ARCH = YES;
381 | SDKROOT = iphoneos;
382 | TARGETED_DEVICE_FAMILY = "1,2";
383 | };
384 | name = Debug;
385 | };
386 | 97C147041CF9000F007C117D /* Release */ = {
387 | isa = XCBuildConfiguration;
388 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
389 | buildSettings = {
390 | ALWAYS_SEARCH_USER_PATHS = NO;
391 | CLANG_ANALYZER_NONNULL = YES;
392 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
393 | CLANG_CXX_LIBRARY = "libc++";
394 | CLANG_ENABLE_MODULES = YES;
395 | CLANG_ENABLE_OBJC_ARC = YES;
396 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
397 | CLANG_WARN_BOOL_CONVERSION = YES;
398 | CLANG_WARN_COMMA = YES;
399 | CLANG_WARN_CONSTANT_CONVERSION = YES;
400 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
401 | CLANG_WARN_EMPTY_BODY = YES;
402 | CLANG_WARN_ENUM_CONVERSION = YES;
403 | CLANG_WARN_INFINITE_RECURSION = YES;
404 | CLANG_WARN_INT_CONVERSION = YES;
405 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
406 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
407 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
408 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
409 | CLANG_WARN_STRICT_PROTOTYPES = YES;
410 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
411 | CLANG_WARN_UNREACHABLE_CODE = YES;
412 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
413 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
414 | COPY_PHASE_STRIP = NO;
415 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
416 | ENABLE_NS_ASSERTIONS = NO;
417 | ENABLE_STRICT_OBJC_MSGSEND = YES;
418 | GCC_C_LANGUAGE_STANDARD = gnu99;
419 | GCC_NO_COMMON_BLOCKS = YES;
420 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
421 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
422 | GCC_WARN_UNDECLARED_SELECTOR = YES;
423 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
424 | GCC_WARN_UNUSED_FUNCTION = YES;
425 | GCC_WARN_UNUSED_VARIABLE = YES;
426 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
427 | MTL_ENABLE_DEBUG_INFO = NO;
428 | SDKROOT = iphoneos;
429 | TARGETED_DEVICE_FAMILY = "1,2";
430 | VALIDATE_PRODUCT = YES;
431 | };
432 | name = Release;
433 | };
434 | 97C147061CF9000F007C117D /* Debug */ = {
435 | isa = XCBuildConfiguration;
436 | baseConfigurationReference = 9740EEB21CF90195004384FC /* Debug.xcconfig */;
437 | buildSettings = {
438 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
439 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
440 | ENABLE_BITCODE = NO;
441 | FRAMEWORK_SEARCH_PATHS = (
442 | "$(inherited)",
443 | "$(PROJECT_DIR)/Flutter",
444 | );
445 | INFOPLIST_FILE = Runner/Info.plist;
446 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
447 | LIBRARY_SEARCH_PATHS = (
448 | "$(inherited)",
449 | "$(PROJECT_DIR)/Flutter",
450 | );
451 | PRODUCT_BUNDLE_IDENTIFIER = com.example.websocketLanChat;
452 | PRODUCT_NAME = "$(TARGET_NAME)";
453 | VERSIONING_SYSTEM = "apple-generic";
454 | };
455 | name = Debug;
456 | };
457 | 97C147071CF9000F007C117D /* Release */ = {
458 | isa = XCBuildConfiguration;
459 | baseConfigurationReference = 7AFA3C8E1D35360C0083082E /* Release.xcconfig */;
460 | buildSettings = {
461 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
462 | CURRENT_PROJECT_VERSION = "$(FLUTTER_BUILD_NUMBER)";
463 | ENABLE_BITCODE = NO;
464 | FRAMEWORK_SEARCH_PATHS = (
465 | "$(inherited)",
466 | "$(PROJECT_DIR)/Flutter",
467 | );
468 | INFOPLIST_FILE = Runner/Info.plist;
469 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
470 | LIBRARY_SEARCH_PATHS = (
471 | "$(inherited)",
472 | "$(PROJECT_DIR)/Flutter",
473 | );
474 | PRODUCT_BUNDLE_IDENTIFIER = com.example.websocketLanChat;
475 | PRODUCT_NAME = "$(TARGET_NAME)";
476 | VERSIONING_SYSTEM = "apple-generic";
477 | };
478 | name = Release;
479 | };
480 | /* End XCBuildConfiguration section */
481 |
482 | /* Begin XCConfigurationList section */
483 | 97C146E91CF9000F007C117D /* Build configuration list for PBXProject "Runner" */ = {
484 | isa = XCConfigurationList;
485 | buildConfigurations = (
486 | 97C147031CF9000F007C117D /* Debug */,
487 | 97C147041CF9000F007C117D /* Release */,
488 | 249021D3217E4FDB00AE95B9 /* Profile */,
489 | );
490 | defaultConfigurationIsVisible = 0;
491 | defaultConfigurationName = Release;
492 | };
493 | 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */ = {
494 | isa = XCConfigurationList;
495 | buildConfigurations = (
496 | 97C147061CF9000F007C117D /* Debug */,
497 | 97C147071CF9000F007C117D /* Release */,
498 | 249021D4217E4FDB00AE95B9 /* Profile */,
499 | );
500 | defaultConfigurationIsVisible = 0;
501 | defaultConfigurationName = Release;
502 | };
503 | /* End XCConfigurationList section */
504 | };
505 | rootObject = 97C146E61CF9000F007C117D /* Project object */;
506 | }
507 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
33 |
34 |
40 |
41 |
42 |
43 |
44 |
45 |
56 |
58 |
64 |
65 |
66 |
67 |
68 |
69 |
75 |
77 |
83 |
84 |
85 |
86 |
88 |
89 |
92 |
93 |
94 |
--------------------------------------------------------------------------------
/ios/Runner.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.h:
--------------------------------------------------------------------------------
1 | #import
2 | #import
3 |
4 | @interface AppDelegate : FlutterAppDelegate
5 |
6 | @end
7 |
--------------------------------------------------------------------------------
/ios/Runner/AppDelegate.m:
--------------------------------------------------------------------------------
1 | #include "AppDelegate.h"
2 | #include "GeneratedPluginRegistrant.h"
3 |
4 | @implementation AppDelegate
5 |
6 | - (BOOL)application:(UIApplication *)application
7 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
8 | [GeneratedPluginRegistrant registerWithRegistry:self];
9 | // Override point for customization after application launch.
10 | return [super application:application didFinishLaunchingWithOptions:launchOptions];
11 | }
12 |
13 | @end
14 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "size" : "20x20",
5 | "idiom" : "iphone",
6 | "filename" : "Icon-App-20x20@2x.png",
7 | "scale" : "2x"
8 | },
9 | {
10 | "size" : "20x20",
11 | "idiom" : "iphone",
12 | "filename" : "Icon-App-20x20@3x.png",
13 | "scale" : "3x"
14 | },
15 | {
16 | "size" : "29x29",
17 | "idiom" : "iphone",
18 | "filename" : "Icon-App-29x29@1x.png",
19 | "scale" : "1x"
20 | },
21 | {
22 | "size" : "29x29",
23 | "idiom" : "iphone",
24 | "filename" : "Icon-App-29x29@2x.png",
25 | "scale" : "2x"
26 | },
27 | {
28 | "size" : "29x29",
29 | "idiom" : "iphone",
30 | "filename" : "Icon-App-29x29@3x.png",
31 | "scale" : "3x"
32 | },
33 | {
34 | "size" : "40x40",
35 | "idiom" : "iphone",
36 | "filename" : "Icon-App-40x40@2x.png",
37 | "scale" : "2x"
38 | },
39 | {
40 | "size" : "40x40",
41 | "idiom" : "iphone",
42 | "filename" : "Icon-App-40x40@3x.png",
43 | "scale" : "3x"
44 | },
45 | {
46 | "size" : "60x60",
47 | "idiom" : "iphone",
48 | "filename" : "Icon-App-60x60@2x.png",
49 | "scale" : "2x"
50 | },
51 | {
52 | "size" : "60x60",
53 | "idiom" : "iphone",
54 | "filename" : "Icon-App-60x60@3x.png",
55 | "scale" : "3x"
56 | },
57 | {
58 | "size" : "20x20",
59 | "idiom" : "ipad",
60 | "filename" : "Icon-App-20x20@1x.png",
61 | "scale" : "1x"
62 | },
63 | {
64 | "size" : "20x20",
65 | "idiom" : "ipad",
66 | "filename" : "Icon-App-20x20@2x.png",
67 | "scale" : "2x"
68 | },
69 | {
70 | "size" : "29x29",
71 | "idiom" : "ipad",
72 | "filename" : "Icon-App-29x29@1x.png",
73 | "scale" : "1x"
74 | },
75 | {
76 | "size" : "29x29",
77 | "idiom" : "ipad",
78 | "filename" : "Icon-App-29x29@2x.png",
79 | "scale" : "2x"
80 | },
81 | {
82 | "size" : "40x40",
83 | "idiom" : "ipad",
84 | "filename" : "Icon-App-40x40@1x.png",
85 | "scale" : "1x"
86 | },
87 | {
88 | "size" : "40x40",
89 | "idiom" : "ipad",
90 | "filename" : "Icon-App-40x40@2x.png",
91 | "scale" : "2x"
92 | },
93 | {
94 | "size" : "76x76",
95 | "idiom" : "ipad",
96 | "filename" : "Icon-App-76x76@1x.png",
97 | "scale" : "1x"
98 | },
99 | {
100 | "size" : "76x76",
101 | "idiom" : "ipad",
102 | "filename" : "Icon-App-76x76@2x.png",
103 | "scale" : "2x"
104 | },
105 | {
106 | "size" : "83.5x83.5",
107 | "idiom" : "ipad",
108 | "filename" : "Icon-App-83.5x83.5@2x.png",
109 | "scale" : "2x"
110 | },
111 | {
112 | "size" : "1024x1024",
113 | "idiom" : "ios-marketing",
114 | "filename" : "Icon-App-1024x1024@1x.png",
115 | "scale" : "1x"
116 | }
117 | ],
118 | "info" : {
119 | "version" : 1,
120 | "author" : "xcode"
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "filename" : "LaunchImage.png",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "universal",
10 | "filename" : "LaunchImage@2x.png",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "universal",
15 | "filename" : "LaunchImage@3x.png",
16 | "scale" : "3x"
17 | }
18 | ],
19 | "info" : {
20 | "version" : 1,
21 | "author" : "xcode"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/devrnt/flutter-websocket-lan-chat/64f306080658b7812d80aa1d0d0ff7668dea1f63/ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png
--------------------------------------------------------------------------------
/ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md:
--------------------------------------------------------------------------------
1 | # Launch Screen Assets
2 |
3 | You can customize the launch screen with your own desired assets by replacing the image files in this directory.
4 |
5 | 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.
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
--------------------------------------------------------------------------------
/ios/Runner/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/ios/Runner/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | websocket_lan_chat
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | $(FLUTTER_BUILD_NAME)
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(FLUTTER_BUILD_NUMBER)
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIViewControllerBasedStatusBarAppearance
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/ios/Runner/main.m:
--------------------------------------------------------------------------------
1 | #import
2 | #import
3 | #import "AppDelegate.h"
4 |
5 | int main(int argc, char* argv[]) {
6 | @autoreleasepool {
7 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/lib/config/config.dart:
--------------------------------------------------------------------------------
1 | class Config {
2 | static String ip = '192.168.0.229';
3 | static int port = 8080;
4 | }
5 |
--------------------------------------------------------------------------------
/lib/data/data.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:websocket_lan_chat/src/models/user.dart';
3 |
4 | class Data {
5 | static User user = new User(
6 | name: 'Jonas',
7 | imageUrl:
8 | 'https://images.pexels.com/photos/220453/pexels-photo-220453.jpeg?auto=compress&cs=tinysrgb&dpr=1&w=500',
9 | color: Colors.green);
10 | }
11 |
--------------------------------------------------------------------------------
/lib/main.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:websocket_lan_chat/src/screens/welcome_screen.dart';
3 |
4 | void main() => runApp(MyApp());
5 |
6 | class MyApp extends StatelessWidget {
7 | @override
8 | Widget build(BuildContext context) {
9 | return MaterialApp(
10 | title: 'Flutter Demo',
11 | theme: ThemeData(primarySwatch: Colors.blue),
12 | home: WelcomeScreen(),
13 | );
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/lib/src/models/message.dart:
--------------------------------------------------------------------------------
1 | import 'package:websocket_lan_chat/src/models/user.dart';
2 |
3 | class Message {
4 | String id;
5 | User author;
6 | String body;
7 |
8 | Message({this.id, this.author, this.body});
9 |
10 | factory Message.fromJson(Map json) => new Message(
11 | id: json['id'],
12 | author: User.fromJson(json['author']),
13 | body: json['body']);
14 |
15 | Map toJson() =>
16 | {'id': id, 'author': author.toJson(), 'body': body};
17 | }
18 |
--------------------------------------------------------------------------------
/lib/src/models/user.dart:
--------------------------------------------------------------------------------
1 | import 'dart:ui';
2 |
3 | class User {
4 | String name;
5 | String imageUrl;
6 | Color color;
7 |
8 | User({this.name, this.imageUrl, this.color});
9 |
10 | factory User.fromJson(Map json) => new User(
11 | name: json['name'],
12 | imageUrl: json['imageUrl'],
13 | color: hexToColor(json['color']));
14 |
15 | Map toJson() =>
16 | {'name': name, 'imageUrl': imageUrl, 'color': colorToHex(color)};
17 | }
18 |
19 | // Color of the format #RRGGBB.
20 | Color hexToColor(String code) =>
21 | new Color(int.parse(code.substring(1, 7), radix: 16) + 0xFF000000);
22 |
23 | String colorToHex(Color color) => '#${color.value.toRadixString(16)}';
24 |
--------------------------------------------------------------------------------
/lib/src/screens/home_screen.dart:
--------------------------------------------------------------------------------
1 | import 'dart:convert';
2 |
3 | import 'package:flutter/material.dart';
4 | import 'package:provider/provider.dart';
5 | import 'package:uuid/uuid.dart';
6 |
7 | import 'package:web_socket_channel/io.dart';
8 | import 'package:web_socket_channel/status.dart' as status;
9 | import 'package:websocket_lan_chat/config/config.dart';
10 | import 'package:websocket_lan_chat/src/models/user.dart';
11 | import 'package:websocket_lan_chat/src/widgets/message_input.dart';
12 | import 'package:websocket_lan_chat/src/widgets/message_list.dart';
13 | import 'package:websocket_lan_chat/src/models/message.dart';
14 |
15 | class HomeScreen extends StatefulWidget {
16 | @override
17 | _HomeScreenState createState() => _HomeScreenState();
18 | }
19 |
20 | class _HomeScreenState extends State {
21 | final IOWebSocketChannel channel =
22 | IOWebSocketChannel.connect('ws://${Config.ip}:${Config.port}');
23 |
24 | final TextEditingController _textEditingController =
25 | new TextEditingController();
26 |
27 | List messages = [];
28 |
29 | @override
30 | Widget build(BuildContext context) {
31 | return Scaffold(
32 | body: Container(
33 | padding: EdgeInsets.all(8),
34 | child: Column(
35 | children: [
36 | Expanded(
37 | flex: 9,
38 | child: StreamBuilder(
39 | stream: channel.stream,
40 | builder: (context, snapshot) {
41 | if (snapshot.hasError) {
42 | return Center(child: Text(snapshot.error.toString()));
43 | }
44 |
45 | if (snapshot.data == null) {
46 | return Center(
47 | child: Text('No messages yet, start typing...'));
48 | } else {
49 | Message message =
50 | Message.fromJson(jsonDecode(snapshot.data));
51 | // This makes sure that the last messages is not just duplicated
52 | // into the messages list
53 | if (messages.isEmpty) {
54 | messages.add(message);
55 | } else {
56 | if (message.id != messages.last.id) {
57 | messages.add(message);
58 | }
59 | }
60 | }
61 | return MessageList(messages: messages);
62 | },
63 | ),
64 | ),
65 | Expanded(
66 | child: MessageInput(
67 | textEditingController: _textEditingController,
68 | onPressed: _sendMessage,
69 | ),
70 | )
71 | ],
72 | ),
73 | ),
74 | );
75 | }
76 |
77 | @override
78 | void dispose() {
79 | channel.sink.close(status.goingAway);
80 | super.dispose();
81 | }
82 |
83 | void _sendMessage() {
84 | final User user = Provider.of(context);
85 |
86 | final messageBody = _textEditingController.text;
87 |
88 | final Message message =
89 | new Message(id: new Uuid().v1(), author: user, body: messageBody);
90 | final jsonMessage = jsonEncode(message);
91 |
92 | channel.sink.add(jsonMessage);
93 |
94 | _textEditingController.clear();
95 | }
96 | }
97 |
--------------------------------------------------------------------------------
/lib/src/screens/welcome_screen.dart:
--------------------------------------------------------------------------------
1 | import 'dart:math';
2 |
3 | import 'package:flutter/material.dart';
4 | import 'package:provider/provider.dart';
5 | import 'package:websocket_lan_chat/src/models/user.dart';
6 | import 'package:websocket_lan_chat/src/screens/home_screen.dart';
7 |
8 | class WelcomeScreen extends StatefulWidget {
9 | @override
10 | _WelcomeScreenState createState() => _WelcomeScreenState();
11 | }
12 |
13 | class _WelcomeScreenState extends State {
14 | final TextEditingController textEditingController =
15 | new TextEditingController();
16 |
17 | @override
18 | Widget build(BuildContext context) {
19 | return Scaffold(
20 | body: Container(
21 | padding: EdgeInsets.all(8),
22 | child: Column(
23 | mainAxisAlignment: MainAxisAlignment.center,
24 | crossAxisAlignment: CrossAxisAlignment.stretch,
25 | children: [
26 | TextField(
27 | controller: textEditingController,
28 | decoration: InputDecoration(
29 | contentPadding:
30 | EdgeInsets.symmetric(vertical: 10, horizontal: 15),
31 | filled: true,
32 | border: InputBorder.none,
33 | hintText: 'What\'s your name?',
34 | ),
35 | ),
36 | FlatButton(
37 | color: Theme.of(context).primaryColor,
38 | child: Text('Next'),
39 | onPressed: _createUser,
40 | ),
41 | ],
42 | ),
43 | ),
44 | );
45 | }
46 |
47 | void _createUser() {
48 | // TODO: move logic to other widget
49 | final List colors = [
50 | Colors.pink,
51 | Colors.teal,
52 | Colors.blue,
53 | Colors.orange,
54 | Colors.yellow,
55 | Colors.purple,
56 | Colors.red
57 | ];
58 |
59 | final List imageUrls = [
60 | 'https://cdn4.iconfinder.com/data/icons/user-avatar-flat-icons/512/User_Avatar-04-512.png',
61 | 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQ4LRADmE5sIaCA5kC7SaM2WDgzUH_ngB30-rgL6xfIcFdbnsUW',
62 | 'https://image.flaticon.com/icons/png/512/306/306473.png',
63 | 'https://banner2.kisspng.com/20180403/tkw/kisspng-avatar-computer-icons-user-profile-business-user-avatar-5ac3a1f7d96614.9721182215227704238905.jpg'
64 | 'https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTkYcbCCLAF3opunLo7FJ7si5fwDhQJp0C__SpRM3QxSpVKJYOa',
65 | ];
66 |
67 | colors.shuffle();
68 | imageUrls.shuffle();
69 |
70 | Random random = new Random();
71 |
72 | int indexImage = random.nextInt(imageUrls.length - 1);
73 | int indexColor = random.nextInt(colors.length - 1);
74 |
75 | final User user = new User(
76 | name: textEditingController.text,
77 | imageUrl: imageUrls[indexImage],
78 | color: colors[indexColor]);
79 |
80 | Navigator.of(context).pushReplacement(
81 | MaterialPageRoute(
82 | builder: (context) => Provider(
83 | builder: (_) => user,
84 | child: MaterialApp(
85 | title: 'Flutter Demo',
86 | theme: ThemeData(
87 | primarySwatch: Colors.blue,
88 | ),
89 | home: HomeScreen()),
90 | ),
91 | ),
92 | );
93 | }
94 | }
95 |
--------------------------------------------------------------------------------
/lib/src/widgets/message_input.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | class MessageInput extends StatefulWidget {
4 | final TextEditingController textEditingController;
5 | final Function onPressed;
6 |
7 | MessageInput({@required this.textEditingController, this.onPressed});
8 |
9 | @override
10 | _MessageInputState createState() => _MessageInputState();
11 | }
12 |
13 | class _MessageInputState extends State {
14 | @override
15 | Widget build(BuildContext context) {
16 | return Container(
17 | child: Row(
18 | mainAxisSize: MainAxisSize.min,
19 | children: [
20 | Flexible(
21 | flex: 9,
22 | child: TextField(
23 | controller: widget.textEditingController,
24 | decoration: InputDecoration(
25 | filled: true,
26 | fillColor: Colors.grey[200],
27 | border: InputBorder.none,
28 | hintText: 'Send a message...'),
29 | ),
30 | ),
31 | Flexible(
32 | child: IconButton(
33 | color: Theme.of(context).primaryColor,
34 | disabledColor: Theme.of(context).primaryColorDark,
35 | icon: Icon(Icons.send),
36 | onPressed: widget.onPressed,
37 | ),
38 | )
39 | ],
40 | ),
41 | );
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/lib/src/widgets/message_item.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:provider/provider.dart';
3 | import 'package:websocket_lan_chat/src/models/message.dart';
4 | import 'package:websocket_lan_chat/src/models/user.dart';
5 |
6 | class MessageItem extends StatelessWidget {
7 | final Message message;
8 |
9 | MessageItem({@required this.message});
10 |
11 | @override
12 | Widget build(BuildContext context) {
13 | final User user = Provider.of(context);
14 |
15 | return Align(
16 | alignment: message.author.name == user.name
17 | ? Alignment.topRight
18 | : Alignment.topLeft,
19 | child: Chip(
20 | backgroundColor: message.author.color,
21 | padding: EdgeInsets.all(4),
22 | label: Text(message.body),
23 | avatar: CircleAvatar(
24 | backgroundColor: message.author.color,
25 | radius: 100.0,
26 | backgroundImage: NetworkImage(message.author.imageUrl),
27 | // child: Image.network(message.author.imageUrl),
28 | ),
29 | ),
30 | );
31 | }
32 | }
33 |
--------------------------------------------------------------------------------
/lib/src/widgets/message_list.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 |
3 | import 'package:websocket_lan_chat/src/widgets/message_item.dart';
4 | import 'package:websocket_lan_chat/src/models/message.dart';
5 |
6 | class MessageList extends StatelessWidget {
7 | final List messages;
8 |
9 | MessageList({this.messages});
10 |
11 | @override
12 | Widget build(BuildContext context) {
13 | return ListView.builder(
14 | itemCount: messages.length,
15 | itemBuilder: (context, index) => MessageItem(message: messages[index]),
16 | );
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/pubspec.lock:
--------------------------------------------------------------------------------
1 | # Generated by pub
2 | # See https://www.dartlang.org/tools/pub/glossary#lockfile
3 | packages:
4 | analyzer:
5 | dependency: transitive
6 | description:
7 | name: analyzer
8 | url: "https://pub.dartlang.org"
9 | source: hosted
10 | version: "0.36.3"
11 | args:
12 | dependency: transitive
13 | description:
14 | name: args
15 | url: "https://pub.dartlang.org"
16 | source: hosted
17 | version: "1.5.1"
18 | async:
19 | dependency: transitive
20 | description:
21 | name: async
22 | url: "https://pub.dartlang.org"
23 | source: hosted
24 | version: "2.1.0"
25 | boolean_selector:
26 | dependency: transitive
27 | description:
28 | name: boolean_selector
29 | url: "https://pub.dartlang.org"
30 | source: hosted
31 | version: "1.0.4"
32 | charcode:
33 | dependency: transitive
34 | description:
35 | name: charcode
36 | url: "https://pub.dartlang.org"
37 | source: hosted
38 | version: "1.1.2"
39 | collection:
40 | dependency: transitive
41 | description:
42 | name: collection
43 | url: "https://pub.dartlang.org"
44 | source: hosted
45 | version: "1.14.11"
46 | convert:
47 | dependency: transitive
48 | description:
49 | name: convert
50 | url: "https://pub.dartlang.org"
51 | source: hosted
52 | version: "2.1.1"
53 | crypto:
54 | dependency: transitive
55 | description:
56 | name: crypto
57 | url: "https://pub.dartlang.org"
58 | source: hosted
59 | version: "2.0.6"
60 | csslib:
61 | dependency: transitive
62 | description:
63 | name: csslib
64 | url: "https://pub.dartlang.org"
65 | source: hosted
66 | version: "0.16.0"
67 | cupertino_icons:
68 | dependency: "direct main"
69 | description:
70 | name: cupertino_icons
71 | url: "https://pub.dartlang.org"
72 | source: hosted
73 | version: "0.1.2"
74 | flutter:
75 | dependency: "direct main"
76 | description: flutter
77 | source: sdk
78 | version: "0.0.0"
79 | flutter_test:
80 | dependency: "direct dev"
81 | description: flutter
82 | source: sdk
83 | version: "0.0.0"
84 | front_end:
85 | dependency: transitive
86 | description:
87 | name: front_end
88 | url: "https://pub.dartlang.org"
89 | source: hosted
90 | version: "0.1.18"
91 | glob:
92 | dependency: transitive
93 | description:
94 | name: glob
95 | url: "https://pub.dartlang.org"
96 | source: hosted
97 | version: "1.1.7"
98 | html:
99 | dependency: transitive
100 | description:
101 | name: html
102 | url: "https://pub.dartlang.org"
103 | source: hosted
104 | version: "0.14.0+2"
105 | http:
106 | dependency: transitive
107 | description:
108 | name: http
109 | url: "https://pub.dartlang.org"
110 | source: hosted
111 | version: "0.12.0+2"
112 | http_multi_server:
113 | dependency: transitive
114 | description:
115 | name: http_multi_server
116 | url: "https://pub.dartlang.org"
117 | source: hosted
118 | version: "2.0.6"
119 | http_parser:
120 | dependency: transitive
121 | description:
122 | name: http_parser
123 | url: "https://pub.dartlang.org"
124 | source: hosted
125 | version: "3.1.3"
126 | image_test_utils:
127 | dependency: "direct dev"
128 | description:
129 | name: image_test_utils
130 | url: "https://pub.dartlang.org"
131 | source: hosted
132 | version: "1.0.0"
133 | io:
134 | dependency: transitive
135 | description:
136 | name: io
137 | url: "https://pub.dartlang.org"
138 | source: hosted
139 | version: "0.3.3"
140 | js:
141 | dependency: transitive
142 | description:
143 | name: js
144 | url: "https://pub.dartlang.org"
145 | source: hosted
146 | version: "0.6.1+1"
147 | json_rpc_2:
148 | dependency: transitive
149 | description:
150 | name: json_rpc_2
151 | url: "https://pub.dartlang.org"
152 | source: hosted
153 | version: "2.1.0"
154 | kernel:
155 | dependency: transitive
156 | description:
157 | name: kernel
158 | url: "https://pub.dartlang.org"
159 | source: hosted
160 | version: "0.3.18"
161 | matcher:
162 | dependency: transitive
163 | description:
164 | name: matcher
165 | url: "https://pub.dartlang.org"
166 | source: hosted
167 | version: "0.12.5"
168 | meta:
169 | dependency: transitive
170 | description:
171 | name: meta
172 | url: "https://pub.dartlang.org"
173 | source: hosted
174 | version: "1.1.6"
175 | mime:
176 | dependency: transitive
177 | description:
178 | name: mime
179 | url: "https://pub.dartlang.org"
180 | source: hosted
181 | version: "0.9.6+2"
182 | mockito:
183 | dependency: transitive
184 | description:
185 | name: mockito
186 | url: "https://pub.dartlang.org"
187 | source: hosted
188 | version: "3.0.2"
189 | multi_server_socket:
190 | dependency: transitive
191 | description:
192 | name: multi_server_socket
193 | url: "https://pub.dartlang.org"
194 | source: hosted
195 | version: "1.0.2"
196 | node_preamble:
197 | dependency: transitive
198 | description:
199 | name: node_preamble
200 | url: "https://pub.dartlang.org"
201 | source: hosted
202 | version: "1.4.4"
203 | package_config:
204 | dependency: transitive
205 | description:
206 | name: package_config
207 | url: "https://pub.dartlang.org"
208 | source: hosted
209 | version: "1.0.5"
210 | package_resolver:
211 | dependency: transitive
212 | description:
213 | name: package_resolver
214 | url: "https://pub.dartlang.org"
215 | source: hosted
216 | version: "1.0.10"
217 | path:
218 | dependency: transitive
219 | description:
220 | name: path
221 | url: "https://pub.dartlang.org"
222 | source: hosted
223 | version: "1.6.2"
224 | pedantic:
225 | dependency: transitive
226 | description:
227 | name: pedantic
228 | url: "https://pub.dartlang.org"
229 | source: hosted
230 | version: "1.5.0"
231 | pool:
232 | dependency: transitive
233 | description:
234 | name: pool
235 | url: "https://pub.dartlang.org"
236 | source: hosted
237 | version: "1.4.0"
238 | provider:
239 | dependency: "direct main"
240 | description:
241 | name: provider
242 | url: "https://pub.dartlang.org"
243 | source: hosted
244 | version: "2.0.1"
245 | pub_semver:
246 | dependency: transitive
247 | description:
248 | name: pub_semver
249 | url: "https://pub.dartlang.org"
250 | source: hosted
251 | version: "1.4.2"
252 | quiver:
253 | dependency: transitive
254 | description:
255 | name: quiver
256 | url: "https://pub.dartlang.org"
257 | source: hosted
258 | version: "2.0.2"
259 | shelf:
260 | dependency: transitive
261 | description:
262 | name: shelf
263 | url: "https://pub.dartlang.org"
264 | source: hosted
265 | version: "0.7.5"
266 | shelf_packages_handler:
267 | dependency: transitive
268 | description:
269 | name: shelf_packages_handler
270 | url: "https://pub.dartlang.org"
271 | source: hosted
272 | version: "1.0.4"
273 | shelf_static:
274 | dependency: transitive
275 | description:
276 | name: shelf_static
277 | url: "https://pub.dartlang.org"
278 | source: hosted
279 | version: "0.2.8"
280 | shelf_web_socket:
281 | dependency: transitive
282 | description:
283 | name: shelf_web_socket
284 | url: "https://pub.dartlang.org"
285 | source: hosted
286 | version: "0.2.3"
287 | sky_engine:
288 | dependency: transitive
289 | description: flutter
290 | source: sdk
291 | version: "0.0.99"
292 | source_map_stack_trace:
293 | dependency: transitive
294 | description:
295 | name: source_map_stack_trace
296 | url: "https://pub.dartlang.org"
297 | source: hosted
298 | version: "1.1.5"
299 | source_maps:
300 | dependency: transitive
301 | description:
302 | name: source_maps
303 | url: "https://pub.dartlang.org"
304 | source: hosted
305 | version: "0.10.8"
306 | source_span:
307 | dependency: transitive
308 | description:
309 | name: source_span
310 | url: "https://pub.dartlang.org"
311 | source: hosted
312 | version: "1.5.5"
313 | stack_trace:
314 | dependency: transitive
315 | description:
316 | name: stack_trace
317 | url: "https://pub.dartlang.org"
318 | source: hosted
319 | version: "1.9.3"
320 | stream_channel:
321 | dependency: transitive
322 | description:
323 | name: stream_channel
324 | url: "https://pub.dartlang.org"
325 | source: hosted
326 | version: "2.0.0"
327 | string_scanner:
328 | dependency: transitive
329 | description:
330 | name: string_scanner
331 | url: "https://pub.dartlang.org"
332 | source: hosted
333 | version: "1.0.4"
334 | term_glyph:
335 | dependency: transitive
336 | description:
337 | name: term_glyph
338 | url: "https://pub.dartlang.org"
339 | source: hosted
340 | version: "1.1.0"
341 | test:
342 | dependency: transitive
343 | description:
344 | name: test
345 | url: "https://pub.dartlang.org"
346 | source: hosted
347 | version: "1.6.1"
348 | test_api:
349 | dependency: transitive
350 | description:
351 | name: test_api
352 | url: "https://pub.dartlang.org"
353 | source: hosted
354 | version: "0.2.4"
355 | test_core:
356 | dependency: transitive
357 | description:
358 | name: test_core
359 | url: "https://pub.dartlang.org"
360 | source: hosted
361 | version: "0.2.3"
362 | typed_data:
363 | dependency: transitive
364 | description:
365 | name: typed_data
366 | url: "https://pub.dartlang.org"
367 | source: hosted
368 | version: "1.1.6"
369 | uuid:
370 | dependency: "direct main"
371 | description:
372 | name: uuid
373 | url: "https://pub.dartlang.org"
374 | source: hosted
375 | version: "2.0.1"
376 | vector_math:
377 | dependency: transitive
378 | description:
379 | name: vector_math
380 | url: "https://pub.dartlang.org"
381 | source: hosted
382 | version: "2.0.8"
383 | vm_service_client:
384 | dependency: transitive
385 | description:
386 | name: vm_service_client
387 | url: "https://pub.dartlang.org"
388 | source: hosted
389 | version: "0.2.6+2"
390 | watcher:
391 | dependency: transitive
392 | description:
393 | name: watcher
394 | url: "https://pub.dartlang.org"
395 | source: hosted
396 | version: "0.9.7+10"
397 | web_socket_channel:
398 | dependency: "direct main"
399 | description:
400 | name: web_socket_channel
401 | url: "https://pub.dartlang.org"
402 | source: hosted
403 | version: "1.0.12"
404 | yaml:
405 | dependency: transitive
406 | description:
407 | name: yaml
408 | url: "https://pub.dartlang.org"
409 | source: hosted
410 | version: "2.1.15"
411 | sdks:
412 | dart: ">=2.2.0 <3.0.0"
413 |
--------------------------------------------------------------------------------
/pubspec.yaml:
--------------------------------------------------------------------------------
1 | name: websocket_lan_chat
2 | description: A new Flutter project.
3 |
4 | # The following defines the version and build number for your application.
5 | # A version number is three numbers separated by dots, like 1.2.43
6 | # followed by an optional build number separated by a +.
7 | # Both the version and the builder number may be overridden in flutter
8 | # build by specifying --build-name and --build-number, respectively.
9 | # In Android, build-name is used as versionName while build-number used as versionCode.
10 | # Read more about Android versioning at https://developer.android.com/studio/publish/versioning
11 | # In iOS, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
12 | # Read more about iOS versioning at
13 | # https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
14 | version: 1.0.0+1
15 |
16 | environment:
17 | sdk: ">=2.1.0 <3.0.0"
18 |
19 | dependencies:
20 | flutter:
21 | sdk: flutter
22 |
23 | # The following adds the Cupertino Icons font to your application.
24 | # Use with the CupertinoIcons class for iOS style icons.
25 | cupertino_icons: ^0.1.2
26 | web_socket_channel: ^1.0.12
27 | provider: ^2.0.1
28 | uuid: ^2.0.1
29 |
30 | dev_dependencies:
31 | flutter_test:
32 | sdk: flutter
33 | image_test_utils: ^1.0.0
34 |
35 |
36 | # For information on the generic Dart part of this file, see the
37 | # following page: https://www.dartlang.org/tools/pub/pubspec
38 |
39 | # The following section is specific to Flutter.
40 | flutter:
41 |
42 | # The following line ensures that the Material Icons font is
43 | # included with your application, so that you can use the icons in
44 | # the material Icons class.
45 | uses-material-design: true
46 |
47 | # To add assets to your application, add an assets section, like this:
48 | # assets:
49 | # - images/a_dot_burr.jpeg
50 | # - images/a_dot_ham.jpeg
51 |
52 | # An image asset can refer to one or more resolution-specific "variants", see
53 | # https://flutter.dev/assets-and-images/#resolution-aware.
54 |
55 | # For details regarding adding assets from package dependencies, see
56 | # https://flutter.dev/assets-and-images/#from-packages
57 |
58 | # To add custom fonts to your application, add a fonts section here,
59 | # in this "flutter" section. Each entry in this list should have a
60 | # "family" key with the font family name, and a "fonts" key with a
61 | # list giving the asset and other descriptors for the font. For
62 | # example:
63 | # fonts:
64 | # - family: Schyler
65 | # fonts:
66 | # - asset: fonts/Schyler-Regular.ttf
67 | # - asset: fonts/Schyler-Italic.ttf
68 | # style: italic
69 | # - family: Trajan Pro
70 | # fonts:
71 | # - asset: fonts/TrajanPro.ttf
72 | # - asset: fonts/TrajanPro_Bold.ttf
73 | # weight: 700
74 | #
75 | # For details regarding fonts from package dependencies,
76 | # see https://flutter.dev/custom-fonts/#from-packages
77 |
--------------------------------------------------------------------------------
/test/widget_test.dart:
--------------------------------------------------------------------------------
1 | import 'package:flutter/material.dart';
2 | import 'package:flutter_test/flutter_test.dart';
3 | import 'package:provider/provider.dart';
4 | import 'package:uuid/uuid.dart';
5 | import 'package:image_test_utils/image_test_utils.dart';
6 | import 'package:websocket_lan_chat/data/data.dart';
7 | import 'package:websocket_lan_chat/src/models/message.dart';
8 | import 'package:websocket_lan_chat/src/models/user.dart';
9 | import 'package:websocket_lan_chat/src/widgets/message_input.dart';
10 | import 'package:websocket_lan_chat/src/widgets/message_item.dart';
11 | import 'package:websocket_lan_chat/src/widgets/message_list.dart';
12 |
13 | void main() {
14 | group('MessageInput', () {
15 | testWidgets('on message send, the input field is cleared', (tester) async {
16 | var _textEditingController = new TextEditingController();
17 | Function _onPressed = () => _textEditingController.clear();
18 | var messageInput = MessageInput(
19 | textEditingController: _textEditingController,
20 | onPressed: _onPressed,
21 | );
22 | final String inputText = 'This is my message';
23 |
24 | await tester.pumpWidget(MaterialApp(home: Scaffold(body: messageInput)));
25 |
26 | expect(find.byType(IconButton), findsOneWidget);
27 |
28 | await tester.enterText(find.byType(TextField), inputText);
29 | expect(find.text(inputText), findsOneWidget);
30 |
31 | await tester.tap(find.byType(IconButton));
32 |
33 | expect(find.text(inputText), findsNothing);
34 | });
35 | });
36 |
37 | group('MessageItem', () {
38 | testWidgets('message item has a message field and a circleavatar',
39 | (tester) async {
40 | var _message = new Message(
41 | author: Data.user, body: 'Message body', id: new Uuid().v1());
42 |
43 | var messageInput = MessageItem(
44 | message: _message,
45 | );
46 |
47 | await provideMockedNetworkImages(() async {
48 | await tester.pumpWidget(Provider(
49 | builder: (_) => Data.user,
50 | child: MaterialApp(home: Scaffold(body: messageInput)),
51 | ));
52 | });
53 |
54 | expect(find.byType(Text), findsOneWidget);
55 | expect(find.byType(CircleAvatar), findsOneWidget);
56 | });
57 |
58 | testWidgets('messages sent by user are right aligned', (tester) async {
59 | final message = new Message(
60 | author: Data.user, body: 'Message body', id: new Uuid().v1());
61 |
62 | await provideMockedNetworkImages(() async {
63 | await tester.pumpWidget(Provider(
64 | builder: (_) => Data.user,
65 | child:
66 | MaterialApp(home: Scaffold(body: MessageItem(message: message))),
67 | ));
68 | });
69 |
70 | await tester.pumpAndSettle();
71 |
72 | expect(
73 | find.byWidgetPredicate((widget) =>
74 | widget is Align && widget.alignment == Alignment.topRight),
75 | findsOneWidget);
76 | });
77 |
78 | testWidgets('messages sent by someone else are left aligned',
79 | (tester) async {
80 | final otherUser = new User(
81 | name: 'OtherUser',
82 | imageUrl: 'https://i.stack.imgur.com/pcS8T.png',
83 | color: Colors.green);
84 |
85 | final message = new Message(
86 | author: otherUser,
87 | body: 'Message by someone else',
88 | id: new Uuid().v1());
89 |
90 | await provideMockedNetworkImages(() async {
91 | await tester.pumpWidget(Provider(
92 | builder: (_) => Data.user,
93 | child: MaterialApp(
94 | home: Scaffold(body: MessageItem(message: message)))));
95 | });
96 |
97 | expect(
98 | find.byWidgetPredicate((widget) =>
99 | widget is Align && widget.alignment == Alignment.topLeft),
100 | findsOneWidget);
101 | });
102 |
103 | group('MessageList', () {
104 | testWidgets('messages are correctly displayed in a list', (tester) async {
105 | var messages = [
106 | new Message(
107 | author: Data.user, body: 'Message body', id: new Uuid().v1()),
108 | new Message(
109 | author: Data.user, body: 'Message body', id: new Uuid().v1()),
110 | ];
111 |
112 | var messageList = MessageList(messages: messages);
113 |
114 | await provideMockedNetworkImages(() async {
115 | await tester.pumpWidget(Provider(
116 | builder: (_) => Data.user,
117 | child: MaterialApp(home: Scaffold(body: messageList)),
118 | ));
119 | });
120 |
121 | expect(find.byType(MessageItem), findsNWidgets(messages.length));
122 | });
123 | });
124 | });
125 | }
126 |
--------------------------------------------------------------------------------
/websocket/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | lerna-debug.log*
8 |
9 | # Diagnostic reports (https://nodejs.org/api/report.html)
10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
11 |
12 | # Runtime data
13 | pids
14 | *.pid
15 | *.seed
16 | *.pid.lock
17 |
18 | # Directory for instrumented libs generated by jscoverage/JSCover
19 | lib-cov
20 |
21 | # Coverage directory used by tools like istanbul
22 | coverage
23 | *.lcov
24 |
25 | # nyc test coverage
26 | .nyc_output
27 |
28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
29 | .grunt
30 |
31 | # Bower dependency directory (https://bower.io/)
32 | bower_components
33 |
34 | # node-waf configuration
35 | .lock-wscript
36 |
37 | # Compiled binary addons (https://nodejs.org/api/addons.html)
38 | build/Release
39 |
40 | # Dependency directories
41 | node_modules/
42 | jspm_packages/
43 |
44 | # TypeScript v1 declaration files
45 | typings/
46 |
47 | # TypeScript cache
48 | *.tsbuildinfo
49 |
50 | # Optional npm cache directory
51 | .npm
52 |
53 | # Optional eslint cache
54 | .eslintcache
55 |
56 | # Optional REPL history
57 | .node_repl_history
58 |
59 | # Output of 'npm pack'
60 | *.tgz
61 |
62 | # Yarn Integrity file
63 | .yarn-integrity
64 |
65 | # dotenv environment variables file
66 | .env
67 | .env.test
68 |
69 | # parcel-bundler cache (https://parceljs.org/)
70 | .cache
71 |
72 | # next.js build output
73 | .next
74 |
75 | # nuxt.js build output
76 | .nuxt
77 |
78 | # vuepress build output
79 | .vuepress/dist
80 |
81 | # Serverless directories
82 | .serverless/
83 |
84 | # FuseBox cache
85 | .fusebox/
86 |
87 | # DynamoDB Local files
88 | .dynamodb/
--------------------------------------------------------------------------------
/websocket/README.md:
--------------------------------------------------------------------------------
1 | # Node.js WebSocket Broadcast
2 | ## Used for a Flutter chat application
3 |
4 | ### About
5 | This is the `node.js` server that creates a websocket from the `ws` npm packages. This WebSocket is used for a Flutter application. The app makes it possible to chat on a LAN.
6 |
7 | ### Structure
8 | 2 main files in the `app` folder:
9 | * `server.js` is used to run the websocket and to listen for incoming connections.
10 | * `client.js` is a client that connects to the `server.js` websocket.
11 | * An automatic message is sent whenever there is an succesful connection with the websocket.
12 |
13 |
14 | ### How to Run
15 | 1. `git clone` this repo
16 | 2. `cd` into the `websocket` folder
17 | 3. Run `npm install` in command line
18 | 4. Open `app/config/config.js` and fill in your IP and port where the WebSocket should be running
19 | 4. Open `app/client.js`
20 | 5. Run `npm start`, this will execute the command `nodemon ./app/server.js`. Now your WebSocket is running
21 | 6. Run `npm run client ./app/client.js` to establish a connection and send a message
22 |
23 | **Notes:**
24 | * It is possible to change the websocket port in the `server.js` file.
25 | * You can find your IP by opening your terminal and type `ipconfig -all` and look for your IPv4 Address.
26 | * If other devices can't reach your WebSocket it means that your firewall is blocking the connection. Follow the steps provided by the article and allow incoming connections to the port that you specified in `config.js` [https://www.blackbaud.com/files/support/infinityinstaller/content/installermaster/cofirewalls.htm](https://www.blackbaud.com/files/support/infinityinstaller/content/installermaster/cofirewalls.htm)
27 |
--------------------------------------------------------------------------------
/websocket/app/client.js:
--------------------------------------------------------------------------------
1 | const config = require('../config/config');
2 |
3 | const WebSocket = require('ws');
4 | const url = `ws://${config.Ip}:${config.port}`;
5 | const connection = new WebSocket(url)
6 |
7 | // Send message when the connection with the websocket is established
8 | connection.onopen = () => {
9 | connection.send(
10 | // Send any json object to the websocket and other devices
11 | JSON.stringify({
12 | 'id':'6c84fb90-12c4-11e1-840d-7b25c5ee775a',
13 | 'author': { 'name': 'Peter', 'imageUrl': 'https://www.gravatar.com/avatar/205e460b479e2e5b48aec07710c08d50?s=200', 'color': '#4286f4', },
14 | 'body': 'This is the a message from client.js',
15 | })
16 | );
17 | }
18 |
19 | // Print messages from other clients in the client terminal
20 | connection.onmessage = (event) => console.log(event.data);
21 |
22 | // Print Websocket error in the client terminal
23 | connection.onerror = (error) => console.log(`WebSocket error: ${error}`);
--------------------------------------------------------------------------------
/websocket/app/server.js:
--------------------------------------------------------------------------------
1 | const WebSocket = require('ws')
2 |
3 | const wss = new WebSocket.Server({ port: 8080 });
4 | console.log('[WebSocket] Starting WebSocket server...');
5 |
6 | wss.on('connection', (ws, request) => {
7 | const clientIp = request.connection.remoteAddress;
8 | console.log(`[WebSocket] Client with IP ${clientIp} has connected`);
9 |
10 | // Broadcast to all connected clients
11 | ws.on('message', message => {
12 | wss.clients.forEach(client => {
13 | if (client.readyState === WebSocket.OPEN) {
14 | client.send(message);
15 | }
16 | });
17 | console.log(`[WebSocket] Message ${message} was received`)
18 | });
19 | });
--------------------------------------------------------------------------------
/websocket/config/config.js:
--------------------------------------------------------------------------------
1 | const config = {
2 | Ip: '192.168.0.229',
3 | port: 8080
4 | }
5 |
6 | module.exports = config;
--------------------------------------------------------------------------------
/websocket/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "lel",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "abbrev": {
8 | "version": "1.1.1",
9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
11 | "dev": true
12 | },
13 | "ansi-align": {
14 | "version": "2.0.0",
15 | "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz",
16 | "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=",
17 | "dev": true,
18 | "requires": {
19 | "string-width": "^2.0.0"
20 | }
21 | },
22 | "ansi-regex": {
23 | "version": "3.0.0",
24 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
25 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
26 | "dev": true
27 | },
28 | "ansi-styles": {
29 | "version": "3.2.1",
30 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
31 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
32 | "dev": true,
33 | "requires": {
34 | "color-convert": "^1.9.0"
35 | }
36 | },
37 | "anymatch": {
38 | "version": "2.0.0",
39 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
40 | "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
41 | "dev": true,
42 | "requires": {
43 | "micromatch": "^3.1.4",
44 | "normalize-path": "^2.1.1"
45 | },
46 | "dependencies": {
47 | "normalize-path": {
48 | "version": "2.1.1",
49 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
50 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
51 | "dev": true,
52 | "requires": {
53 | "remove-trailing-separator": "^1.0.1"
54 | }
55 | }
56 | }
57 | },
58 | "arr-diff": {
59 | "version": "4.0.0",
60 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
61 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
62 | "dev": true
63 | },
64 | "arr-flatten": {
65 | "version": "1.1.0",
66 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
67 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
68 | "dev": true
69 | },
70 | "arr-union": {
71 | "version": "3.1.0",
72 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
73 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
74 | "dev": true
75 | },
76 | "array-unique": {
77 | "version": "0.3.2",
78 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
79 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
80 | "dev": true
81 | },
82 | "assign-symbols": {
83 | "version": "1.0.0",
84 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
85 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
86 | "dev": true
87 | },
88 | "async-each": {
89 | "version": "1.0.3",
90 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
91 | "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
92 | "dev": true
93 | },
94 | "async-limiter": {
95 | "version": "1.0.0",
96 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
97 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg=="
98 | },
99 | "atob": {
100 | "version": "2.1.2",
101 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
102 | "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
103 | "dev": true
104 | },
105 | "balanced-match": {
106 | "version": "1.0.0",
107 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
108 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
109 | "dev": true
110 | },
111 | "base": {
112 | "version": "0.11.2",
113 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
114 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
115 | "dev": true,
116 | "requires": {
117 | "cache-base": "^1.0.1",
118 | "class-utils": "^0.3.5",
119 | "component-emitter": "^1.2.1",
120 | "define-property": "^1.0.0",
121 | "isobject": "^3.0.1",
122 | "mixin-deep": "^1.2.0",
123 | "pascalcase": "^0.1.1"
124 | },
125 | "dependencies": {
126 | "define-property": {
127 | "version": "1.0.0",
128 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
129 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
130 | "dev": true,
131 | "requires": {
132 | "is-descriptor": "^1.0.0"
133 | }
134 | },
135 | "is-accessor-descriptor": {
136 | "version": "1.0.0",
137 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
138 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
139 | "dev": true,
140 | "requires": {
141 | "kind-of": "^6.0.0"
142 | }
143 | },
144 | "is-data-descriptor": {
145 | "version": "1.0.0",
146 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
147 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
148 | "dev": true,
149 | "requires": {
150 | "kind-of": "^6.0.0"
151 | }
152 | },
153 | "is-descriptor": {
154 | "version": "1.0.2",
155 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
156 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
157 | "dev": true,
158 | "requires": {
159 | "is-accessor-descriptor": "^1.0.0",
160 | "is-data-descriptor": "^1.0.0",
161 | "kind-of": "^6.0.2"
162 | }
163 | }
164 | }
165 | },
166 | "binary-extensions": {
167 | "version": "1.13.1",
168 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
169 | "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
170 | "dev": true
171 | },
172 | "boxen": {
173 | "version": "1.3.0",
174 | "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz",
175 | "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==",
176 | "dev": true,
177 | "requires": {
178 | "ansi-align": "^2.0.0",
179 | "camelcase": "^4.0.0",
180 | "chalk": "^2.0.1",
181 | "cli-boxes": "^1.0.0",
182 | "string-width": "^2.0.0",
183 | "term-size": "^1.2.0",
184 | "widest-line": "^2.0.0"
185 | }
186 | },
187 | "brace-expansion": {
188 | "version": "1.1.11",
189 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
190 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
191 | "dev": true,
192 | "requires": {
193 | "balanced-match": "^1.0.0",
194 | "concat-map": "0.0.1"
195 | }
196 | },
197 | "braces": {
198 | "version": "2.3.2",
199 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
200 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
201 | "dev": true,
202 | "requires": {
203 | "arr-flatten": "^1.1.0",
204 | "array-unique": "^0.3.2",
205 | "extend-shallow": "^2.0.1",
206 | "fill-range": "^4.0.0",
207 | "isobject": "^3.0.1",
208 | "repeat-element": "^1.1.2",
209 | "snapdragon": "^0.8.1",
210 | "snapdragon-node": "^2.0.1",
211 | "split-string": "^3.0.2",
212 | "to-regex": "^3.0.1"
213 | },
214 | "dependencies": {
215 | "extend-shallow": {
216 | "version": "2.0.1",
217 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
218 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
219 | "dev": true,
220 | "requires": {
221 | "is-extendable": "^0.1.0"
222 | }
223 | }
224 | }
225 | },
226 | "cache-base": {
227 | "version": "1.0.1",
228 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
229 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
230 | "dev": true,
231 | "requires": {
232 | "collection-visit": "^1.0.0",
233 | "component-emitter": "^1.2.1",
234 | "get-value": "^2.0.6",
235 | "has-value": "^1.0.0",
236 | "isobject": "^3.0.1",
237 | "set-value": "^2.0.0",
238 | "to-object-path": "^0.3.0",
239 | "union-value": "^1.0.0",
240 | "unset-value": "^1.0.0"
241 | }
242 | },
243 | "camelcase": {
244 | "version": "4.1.0",
245 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
246 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
247 | "dev": true
248 | },
249 | "capture-stack-trace": {
250 | "version": "1.0.1",
251 | "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz",
252 | "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==",
253 | "dev": true
254 | },
255 | "chalk": {
256 | "version": "2.4.2",
257 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
258 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
259 | "dev": true,
260 | "requires": {
261 | "ansi-styles": "^3.2.1",
262 | "escape-string-regexp": "^1.0.5",
263 | "supports-color": "^5.3.0"
264 | }
265 | },
266 | "chokidar": {
267 | "version": "2.1.6",
268 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.6.tgz",
269 | "integrity": "sha512-V2jUo67OKkc6ySiRpJrjlpJKl9kDuG+Xb8VgsGzb+aEouhgS1D0weyPU4lEzdAcsCAvrih2J2BqyXqHWvVLw5g==",
270 | "dev": true,
271 | "requires": {
272 | "anymatch": "^2.0.0",
273 | "async-each": "^1.0.1",
274 | "braces": "^2.3.2",
275 | "fsevents": "^1.2.7",
276 | "glob-parent": "^3.1.0",
277 | "inherits": "^2.0.3",
278 | "is-binary-path": "^1.0.0",
279 | "is-glob": "^4.0.0",
280 | "normalize-path": "^3.0.0",
281 | "path-is-absolute": "^1.0.0",
282 | "readdirp": "^2.2.1",
283 | "upath": "^1.1.1"
284 | }
285 | },
286 | "ci-info": {
287 | "version": "1.6.0",
288 | "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz",
289 | "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==",
290 | "dev": true
291 | },
292 | "class-utils": {
293 | "version": "0.3.6",
294 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
295 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
296 | "dev": true,
297 | "requires": {
298 | "arr-union": "^3.1.0",
299 | "define-property": "^0.2.5",
300 | "isobject": "^3.0.0",
301 | "static-extend": "^0.1.1"
302 | },
303 | "dependencies": {
304 | "define-property": {
305 | "version": "0.2.5",
306 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
307 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
308 | "dev": true,
309 | "requires": {
310 | "is-descriptor": "^0.1.0"
311 | }
312 | }
313 | }
314 | },
315 | "cli-boxes": {
316 | "version": "1.0.0",
317 | "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
318 | "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
319 | "dev": true
320 | },
321 | "collection-visit": {
322 | "version": "1.0.0",
323 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
324 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
325 | "dev": true,
326 | "requires": {
327 | "map-visit": "^1.0.0",
328 | "object-visit": "^1.0.0"
329 | }
330 | },
331 | "color-convert": {
332 | "version": "1.9.3",
333 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
334 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
335 | "dev": true,
336 | "requires": {
337 | "color-name": "1.1.3"
338 | }
339 | },
340 | "color-name": {
341 | "version": "1.1.3",
342 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
343 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
344 | "dev": true
345 | },
346 | "component-emitter": {
347 | "version": "1.3.0",
348 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
349 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
350 | "dev": true
351 | },
352 | "concat-map": {
353 | "version": "0.0.1",
354 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
355 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
356 | "dev": true
357 | },
358 | "configstore": {
359 | "version": "3.1.2",
360 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz",
361 | "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==",
362 | "dev": true,
363 | "requires": {
364 | "dot-prop": "^4.1.0",
365 | "graceful-fs": "^4.1.2",
366 | "make-dir": "^1.0.0",
367 | "unique-string": "^1.0.0",
368 | "write-file-atomic": "^2.0.0",
369 | "xdg-basedir": "^3.0.0"
370 | }
371 | },
372 | "copy-descriptor": {
373 | "version": "0.1.1",
374 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
375 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
376 | "dev": true
377 | },
378 | "core-util-is": {
379 | "version": "1.0.2",
380 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
381 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
382 | "dev": true
383 | },
384 | "create-error-class": {
385 | "version": "3.0.2",
386 | "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
387 | "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
388 | "dev": true,
389 | "requires": {
390 | "capture-stack-trace": "^1.0.0"
391 | }
392 | },
393 | "cross-spawn": {
394 | "version": "5.1.0",
395 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
396 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
397 | "dev": true,
398 | "requires": {
399 | "lru-cache": "^4.0.1",
400 | "shebang-command": "^1.2.0",
401 | "which": "^1.2.9"
402 | }
403 | },
404 | "crypto-random-string": {
405 | "version": "1.0.0",
406 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
407 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
408 | "dev": true
409 | },
410 | "debug": {
411 | "version": "3.2.6",
412 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
413 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
414 | "dev": true,
415 | "requires": {
416 | "ms": "^2.1.1"
417 | },
418 | "dependencies": {
419 | "ms": {
420 | "version": "2.1.1",
421 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
422 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
423 | "dev": true
424 | }
425 | }
426 | },
427 | "decode-uri-component": {
428 | "version": "0.2.0",
429 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
430 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
431 | "dev": true
432 | },
433 | "deep-extend": {
434 | "version": "0.6.0",
435 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
436 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
437 | "dev": true
438 | },
439 | "define-property": {
440 | "version": "2.0.2",
441 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
442 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
443 | "dev": true,
444 | "requires": {
445 | "is-descriptor": "^1.0.2",
446 | "isobject": "^3.0.1"
447 | },
448 | "dependencies": {
449 | "is-accessor-descriptor": {
450 | "version": "1.0.0",
451 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
452 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
453 | "dev": true,
454 | "requires": {
455 | "kind-of": "^6.0.0"
456 | }
457 | },
458 | "is-data-descriptor": {
459 | "version": "1.0.0",
460 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
461 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
462 | "dev": true,
463 | "requires": {
464 | "kind-of": "^6.0.0"
465 | }
466 | },
467 | "is-descriptor": {
468 | "version": "1.0.2",
469 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
470 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
471 | "dev": true,
472 | "requires": {
473 | "is-accessor-descriptor": "^1.0.0",
474 | "is-data-descriptor": "^1.0.0",
475 | "kind-of": "^6.0.2"
476 | }
477 | }
478 | }
479 | },
480 | "dot-prop": {
481 | "version": "4.2.0",
482 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz",
483 | "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==",
484 | "dev": true,
485 | "requires": {
486 | "is-obj": "^1.0.0"
487 | }
488 | },
489 | "duplexer3": {
490 | "version": "0.1.4",
491 | "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
492 | "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
493 | "dev": true
494 | },
495 | "escape-string-regexp": {
496 | "version": "1.0.5",
497 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
498 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
499 | "dev": true
500 | },
501 | "execa": {
502 | "version": "0.7.0",
503 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz",
504 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=",
505 | "dev": true,
506 | "requires": {
507 | "cross-spawn": "^5.0.1",
508 | "get-stream": "^3.0.0",
509 | "is-stream": "^1.1.0",
510 | "npm-run-path": "^2.0.0",
511 | "p-finally": "^1.0.0",
512 | "signal-exit": "^3.0.0",
513 | "strip-eof": "^1.0.0"
514 | }
515 | },
516 | "expand-brackets": {
517 | "version": "2.1.4",
518 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
519 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
520 | "dev": true,
521 | "requires": {
522 | "debug": "^2.3.3",
523 | "define-property": "^0.2.5",
524 | "extend-shallow": "^2.0.1",
525 | "posix-character-classes": "^0.1.0",
526 | "regex-not": "^1.0.0",
527 | "snapdragon": "^0.8.1",
528 | "to-regex": "^3.0.1"
529 | },
530 | "dependencies": {
531 | "debug": {
532 | "version": "2.6.9",
533 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
534 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
535 | "dev": true,
536 | "requires": {
537 | "ms": "2.0.0"
538 | }
539 | },
540 | "define-property": {
541 | "version": "0.2.5",
542 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
543 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
544 | "dev": true,
545 | "requires": {
546 | "is-descriptor": "^0.1.0"
547 | }
548 | },
549 | "extend-shallow": {
550 | "version": "2.0.1",
551 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
552 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
553 | "dev": true,
554 | "requires": {
555 | "is-extendable": "^0.1.0"
556 | }
557 | }
558 | }
559 | },
560 | "extend-shallow": {
561 | "version": "3.0.2",
562 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
563 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
564 | "dev": true,
565 | "requires": {
566 | "assign-symbols": "^1.0.0",
567 | "is-extendable": "^1.0.1"
568 | },
569 | "dependencies": {
570 | "is-extendable": {
571 | "version": "1.0.1",
572 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
573 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
574 | "dev": true,
575 | "requires": {
576 | "is-plain-object": "^2.0.4"
577 | }
578 | }
579 | }
580 | },
581 | "extglob": {
582 | "version": "2.0.4",
583 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
584 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
585 | "dev": true,
586 | "requires": {
587 | "array-unique": "^0.3.2",
588 | "define-property": "^1.0.0",
589 | "expand-brackets": "^2.1.4",
590 | "extend-shallow": "^2.0.1",
591 | "fragment-cache": "^0.2.1",
592 | "regex-not": "^1.0.0",
593 | "snapdragon": "^0.8.1",
594 | "to-regex": "^3.0.1"
595 | },
596 | "dependencies": {
597 | "define-property": {
598 | "version": "1.0.0",
599 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
600 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
601 | "dev": true,
602 | "requires": {
603 | "is-descriptor": "^1.0.0"
604 | }
605 | },
606 | "extend-shallow": {
607 | "version": "2.0.1",
608 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
609 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
610 | "dev": true,
611 | "requires": {
612 | "is-extendable": "^0.1.0"
613 | }
614 | },
615 | "is-accessor-descriptor": {
616 | "version": "1.0.0",
617 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
618 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
619 | "dev": true,
620 | "requires": {
621 | "kind-of": "^6.0.0"
622 | }
623 | },
624 | "is-data-descriptor": {
625 | "version": "1.0.0",
626 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
627 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
628 | "dev": true,
629 | "requires": {
630 | "kind-of": "^6.0.0"
631 | }
632 | },
633 | "is-descriptor": {
634 | "version": "1.0.2",
635 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
636 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
637 | "dev": true,
638 | "requires": {
639 | "is-accessor-descriptor": "^1.0.0",
640 | "is-data-descriptor": "^1.0.0",
641 | "kind-of": "^6.0.2"
642 | }
643 | }
644 | }
645 | },
646 | "fill-range": {
647 | "version": "4.0.0",
648 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
649 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
650 | "dev": true,
651 | "requires": {
652 | "extend-shallow": "^2.0.1",
653 | "is-number": "^3.0.0",
654 | "repeat-string": "^1.6.1",
655 | "to-regex-range": "^2.1.0"
656 | },
657 | "dependencies": {
658 | "extend-shallow": {
659 | "version": "2.0.1",
660 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
661 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
662 | "dev": true,
663 | "requires": {
664 | "is-extendable": "^0.1.0"
665 | }
666 | }
667 | }
668 | },
669 | "for-in": {
670 | "version": "1.0.2",
671 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
672 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
673 | "dev": true
674 | },
675 | "fragment-cache": {
676 | "version": "0.2.1",
677 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
678 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
679 | "dev": true,
680 | "requires": {
681 | "map-cache": "^0.2.2"
682 | }
683 | },
684 | "fsevents": {
685 | "version": "1.2.9",
686 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz",
687 | "integrity": "sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw==",
688 | "dev": true,
689 | "optional": true,
690 | "requires": {
691 | "nan": "^2.12.1",
692 | "node-pre-gyp": "^0.12.0"
693 | },
694 | "dependencies": {
695 | "abbrev": {
696 | "version": "1.1.1",
697 | "bundled": true,
698 | "dev": true,
699 | "optional": true
700 | },
701 | "ansi-regex": {
702 | "version": "2.1.1",
703 | "bundled": true,
704 | "dev": true,
705 | "optional": true
706 | },
707 | "aproba": {
708 | "version": "1.2.0",
709 | "bundled": true,
710 | "dev": true,
711 | "optional": true
712 | },
713 | "are-we-there-yet": {
714 | "version": "1.1.5",
715 | "bundled": true,
716 | "dev": true,
717 | "optional": true,
718 | "requires": {
719 | "delegates": "^1.0.0",
720 | "readable-stream": "^2.0.6"
721 | }
722 | },
723 | "balanced-match": {
724 | "version": "1.0.0",
725 | "bundled": true,
726 | "dev": true,
727 | "optional": true
728 | },
729 | "brace-expansion": {
730 | "version": "1.1.11",
731 | "bundled": true,
732 | "dev": true,
733 | "optional": true,
734 | "requires": {
735 | "balanced-match": "^1.0.0",
736 | "concat-map": "0.0.1"
737 | }
738 | },
739 | "chownr": {
740 | "version": "1.1.1",
741 | "bundled": true,
742 | "dev": true,
743 | "optional": true
744 | },
745 | "code-point-at": {
746 | "version": "1.1.0",
747 | "bundled": true,
748 | "dev": true,
749 | "optional": true
750 | },
751 | "concat-map": {
752 | "version": "0.0.1",
753 | "bundled": true,
754 | "dev": true,
755 | "optional": true
756 | },
757 | "console-control-strings": {
758 | "version": "1.1.0",
759 | "bundled": true,
760 | "dev": true,
761 | "optional": true
762 | },
763 | "core-util-is": {
764 | "version": "1.0.2",
765 | "bundled": true,
766 | "dev": true,
767 | "optional": true
768 | },
769 | "debug": {
770 | "version": "4.1.1",
771 | "bundled": true,
772 | "dev": true,
773 | "optional": true,
774 | "requires": {
775 | "ms": "^2.1.1"
776 | }
777 | },
778 | "deep-extend": {
779 | "version": "0.6.0",
780 | "bundled": true,
781 | "dev": true,
782 | "optional": true
783 | },
784 | "delegates": {
785 | "version": "1.0.0",
786 | "bundled": true,
787 | "dev": true,
788 | "optional": true
789 | },
790 | "detect-libc": {
791 | "version": "1.0.3",
792 | "bundled": true,
793 | "dev": true,
794 | "optional": true
795 | },
796 | "fs-minipass": {
797 | "version": "1.2.5",
798 | "bundled": true,
799 | "dev": true,
800 | "optional": true,
801 | "requires": {
802 | "minipass": "^2.2.1"
803 | }
804 | },
805 | "fs.realpath": {
806 | "version": "1.0.0",
807 | "bundled": true,
808 | "dev": true,
809 | "optional": true
810 | },
811 | "gauge": {
812 | "version": "2.7.4",
813 | "bundled": true,
814 | "dev": true,
815 | "optional": true,
816 | "requires": {
817 | "aproba": "^1.0.3",
818 | "console-control-strings": "^1.0.0",
819 | "has-unicode": "^2.0.0",
820 | "object-assign": "^4.1.0",
821 | "signal-exit": "^3.0.0",
822 | "string-width": "^1.0.1",
823 | "strip-ansi": "^3.0.1",
824 | "wide-align": "^1.1.0"
825 | }
826 | },
827 | "glob": {
828 | "version": "7.1.3",
829 | "bundled": true,
830 | "dev": true,
831 | "optional": true,
832 | "requires": {
833 | "fs.realpath": "^1.0.0",
834 | "inflight": "^1.0.4",
835 | "inherits": "2",
836 | "minimatch": "^3.0.4",
837 | "once": "^1.3.0",
838 | "path-is-absolute": "^1.0.0"
839 | }
840 | },
841 | "has-unicode": {
842 | "version": "2.0.1",
843 | "bundled": true,
844 | "dev": true,
845 | "optional": true
846 | },
847 | "iconv-lite": {
848 | "version": "0.4.24",
849 | "bundled": true,
850 | "dev": true,
851 | "optional": true,
852 | "requires": {
853 | "safer-buffer": ">= 2.1.2 < 3"
854 | }
855 | },
856 | "ignore-walk": {
857 | "version": "3.0.1",
858 | "bundled": true,
859 | "dev": true,
860 | "optional": true,
861 | "requires": {
862 | "minimatch": "^3.0.4"
863 | }
864 | },
865 | "inflight": {
866 | "version": "1.0.6",
867 | "bundled": true,
868 | "dev": true,
869 | "optional": true,
870 | "requires": {
871 | "once": "^1.3.0",
872 | "wrappy": "1"
873 | }
874 | },
875 | "inherits": {
876 | "version": "2.0.3",
877 | "bundled": true,
878 | "dev": true,
879 | "optional": true
880 | },
881 | "ini": {
882 | "version": "1.3.5",
883 | "bundled": true,
884 | "dev": true,
885 | "optional": true
886 | },
887 | "is-fullwidth-code-point": {
888 | "version": "1.0.0",
889 | "bundled": true,
890 | "dev": true,
891 | "optional": true,
892 | "requires": {
893 | "number-is-nan": "^1.0.0"
894 | }
895 | },
896 | "isarray": {
897 | "version": "1.0.0",
898 | "bundled": true,
899 | "dev": true,
900 | "optional": true
901 | },
902 | "minimatch": {
903 | "version": "3.0.4",
904 | "bundled": true,
905 | "dev": true,
906 | "optional": true,
907 | "requires": {
908 | "brace-expansion": "^1.1.7"
909 | }
910 | },
911 | "minimist": {
912 | "version": "0.0.8",
913 | "bundled": true,
914 | "dev": true,
915 | "optional": true
916 | },
917 | "minipass": {
918 | "version": "2.3.5",
919 | "bundled": true,
920 | "dev": true,
921 | "optional": true,
922 | "requires": {
923 | "safe-buffer": "^5.1.2",
924 | "yallist": "^3.0.0"
925 | }
926 | },
927 | "minizlib": {
928 | "version": "1.2.1",
929 | "bundled": true,
930 | "dev": true,
931 | "optional": true,
932 | "requires": {
933 | "minipass": "^2.2.1"
934 | }
935 | },
936 | "mkdirp": {
937 | "version": "0.5.1",
938 | "bundled": true,
939 | "dev": true,
940 | "optional": true,
941 | "requires": {
942 | "minimist": "0.0.8"
943 | }
944 | },
945 | "ms": {
946 | "version": "2.1.1",
947 | "bundled": true,
948 | "dev": true,
949 | "optional": true
950 | },
951 | "needle": {
952 | "version": "2.3.0",
953 | "bundled": true,
954 | "dev": true,
955 | "optional": true,
956 | "requires": {
957 | "debug": "^4.1.0",
958 | "iconv-lite": "^0.4.4",
959 | "sax": "^1.2.4"
960 | }
961 | },
962 | "node-pre-gyp": {
963 | "version": "0.12.0",
964 | "bundled": true,
965 | "dev": true,
966 | "optional": true,
967 | "requires": {
968 | "detect-libc": "^1.0.2",
969 | "mkdirp": "^0.5.1",
970 | "needle": "^2.2.1",
971 | "nopt": "^4.0.1",
972 | "npm-packlist": "^1.1.6",
973 | "npmlog": "^4.0.2",
974 | "rc": "^1.2.7",
975 | "rimraf": "^2.6.1",
976 | "semver": "^5.3.0",
977 | "tar": "^4"
978 | }
979 | },
980 | "nopt": {
981 | "version": "4.0.1",
982 | "bundled": true,
983 | "dev": true,
984 | "optional": true,
985 | "requires": {
986 | "abbrev": "1",
987 | "osenv": "^0.1.4"
988 | }
989 | },
990 | "npm-bundled": {
991 | "version": "1.0.6",
992 | "bundled": true,
993 | "dev": true,
994 | "optional": true
995 | },
996 | "npm-packlist": {
997 | "version": "1.4.1",
998 | "bundled": true,
999 | "dev": true,
1000 | "optional": true,
1001 | "requires": {
1002 | "ignore-walk": "^3.0.1",
1003 | "npm-bundled": "^1.0.1"
1004 | }
1005 | },
1006 | "npmlog": {
1007 | "version": "4.1.2",
1008 | "bundled": true,
1009 | "dev": true,
1010 | "optional": true,
1011 | "requires": {
1012 | "are-we-there-yet": "~1.1.2",
1013 | "console-control-strings": "~1.1.0",
1014 | "gauge": "~2.7.3",
1015 | "set-blocking": "~2.0.0"
1016 | }
1017 | },
1018 | "number-is-nan": {
1019 | "version": "1.0.1",
1020 | "bundled": true,
1021 | "dev": true,
1022 | "optional": true
1023 | },
1024 | "object-assign": {
1025 | "version": "4.1.1",
1026 | "bundled": true,
1027 | "dev": true,
1028 | "optional": true
1029 | },
1030 | "once": {
1031 | "version": "1.4.0",
1032 | "bundled": true,
1033 | "dev": true,
1034 | "optional": true,
1035 | "requires": {
1036 | "wrappy": "1"
1037 | }
1038 | },
1039 | "os-homedir": {
1040 | "version": "1.0.2",
1041 | "bundled": true,
1042 | "dev": true,
1043 | "optional": true
1044 | },
1045 | "os-tmpdir": {
1046 | "version": "1.0.2",
1047 | "bundled": true,
1048 | "dev": true,
1049 | "optional": true
1050 | },
1051 | "osenv": {
1052 | "version": "0.1.5",
1053 | "bundled": true,
1054 | "dev": true,
1055 | "optional": true,
1056 | "requires": {
1057 | "os-homedir": "^1.0.0",
1058 | "os-tmpdir": "^1.0.0"
1059 | }
1060 | },
1061 | "path-is-absolute": {
1062 | "version": "1.0.1",
1063 | "bundled": true,
1064 | "dev": true,
1065 | "optional": true
1066 | },
1067 | "process-nextick-args": {
1068 | "version": "2.0.0",
1069 | "bundled": true,
1070 | "dev": true,
1071 | "optional": true
1072 | },
1073 | "rc": {
1074 | "version": "1.2.8",
1075 | "bundled": true,
1076 | "dev": true,
1077 | "optional": true,
1078 | "requires": {
1079 | "deep-extend": "^0.6.0",
1080 | "ini": "~1.3.0",
1081 | "minimist": "^1.2.0",
1082 | "strip-json-comments": "~2.0.1"
1083 | },
1084 | "dependencies": {
1085 | "minimist": {
1086 | "version": "1.2.0",
1087 | "bundled": true,
1088 | "dev": true,
1089 | "optional": true
1090 | }
1091 | }
1092 | },
1093 | "readable-stream": {
1094 | "version": "2.3.6",
1095 | "bundled": true,
1096 | "dev": true,
1097 | "optional": true,
1098 | "requires": {
1099 | "core-util-is": "~1.0.0",
1100 | "inherits": "~2.0.3",
1101 | "isarray": "~1.0.0",
1102 | "process-nextick-args": "~2.0.0",
1103 | "safe-buffer": "~5.1.1",
1104 | "string_decoder": "~1.1.1",
1105 | "util-deprecate": "~1.0.1"
1106 | }
1107 | },
1108 | "rimraf": {
1109 | "version": "2.6.3",
1110 | "bundled": true,
1111 | "dev": true,
1112 | "optional": true,
1113 | "requires": {
1114 | "glob": "^7.1.3"
1115 | }
1116 | },
1117 | "safe-buffer": {
1118 | "version": "5.1.2",
1119 | "bundled": true,
1120 | "dev": true,
1121 | "optional": true
1122 | },
1123 | "safer-buffer": {
1124 | "version": "2.1.2",
1125 | "bundled": true,
1126 | "dev": true,
1127 | "optional": true
1128 | },
1129 | "sax": {
1130 | "version": "1.2.4",
1131 | "bundled": true,
1132 | "dev": true,
1133 | "optional": true
1134 | },
1135 | "semver": {
1136 | "version": "5.7.0",
1137 | "bundled": true,
1138 | "dev": true,
1139 | "optional": true
1140 | },
1141 | "set-blocking": {
1142 | "version": "2.0.0",
1143 | "bundled": true,
1144 | "dev": true,
1145 | "optional": true
1146 | },
1147 | "signal-exit": {
1148 | "version": "3.0.2",
1149 | "bundled": true,
1150 | "dev": true,
1151 | "optional": true
1152 | },
1153 | "string-width": {
1154 | "version": "1.0.2",
1155 | "bundled": true,
1156 | "dev": true,
1157 | "optional": true,
1158 | "requires": {
1159 | "code-point-at": "^1.0.0",
1160 | "is-fullwidth-code-point": "^1.0.0",
1161 | "strip-ansi": "^3.0.0"
1162 | }
1163 | },
1164 | "string_decoder": {
1165 | "version": "1.1.1",
1166 | "bundled": true,
1167 | "dev": true,
1168 | "optional": true,
1169 | "requires": {
1170 | "safe-buffer": "~5.1.0"
1171 | }
1172 | },
1173 | "strip-ansi": {
1174 | "version": "3.0.1",
1175 | "bundled": true,
1176 | "dev": true,
1177 | "optional": true,
1178 | "requires": {
1179 | "ansi-regex": "^2.0.0"
1180 | }
1181 | },
1182 | "strip-json-comments": {
1183 | "version": "2.0.1",
1184 | "bundled": true,
1185 | "dev": true,
1186 | "optional": true
1187 | },
1188 | "tar": {
1189 | "version": "4.4.8",
1190 | "bundled": true,
1191 | "dev": true,
1192 | "optional": true,
1193 | "requires": {
1194 | "chownr": "^1.1.1",
1195 | "fs-minipass": "^1.2.5",
1196 | "minipass": "^2.3.4",
1197 | "minizlib": "^1.1.1",
1198 | "mkdirp": "^0.5.0",
1199 | "safe-buffer": "^5.1.2",
1200 | "yallist": "^3.0.2"
1201 | }
1202 | },
1203 | "util-deprecate": {
1204 | "version": "1.0.2",
1205 | "bundled": true,
1206 | "dev": true,
1207 | "optional": true
1208 | },
1209 | "wide-align": {
1210 | "version": "1.1.3",
1211 | "bundled": true,
1212 | "dev": true,
1213 | "optional": true,
1214 | "requires": {
1215 | "string-width": "^1.0.2 || 2"
1216 | }
1217 | },
1218 | "wrappy": {
1219 | "version": "1.0.2",
1220 | "bundled": true,
1221 | "dev": true,
1222 | "optional": true
1223 | },
1224 | "yallist": {
1225 | "version": "3.0.3",
1226 | "bundled": true,
1227 | "dev": true,
1228 | "optional": true
1229 | }
1230 | }
1231 | },
1232 | "get-stream": {
1233 | "version": "3.0.0",
1234 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
1235 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
1236 | "dev": true
1237 | },
1238 | "get-value": {
1239 | "version": "2.0.6",
1240 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
1241 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
1242 | "dev": true
1243 | },
1244 | "glob-parent": {
1245 | "version": "3.1.0",
1246 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
1247 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
1248 | "dev": true,
1249 | "requires": {
1250 | "is-glob": "^3.1.0",
1251 | "path-dirname": "^1.0.0"
1252 | },
1253 | "dependencies": {
1254 | "is-glob": {
1255 | "version": "3.1.0",
1256 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
1257 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
1258 | "dev": true,
1259 | "requires": {
1260 | "is-extglob": "^2.1.0"
1261 | }
1262 | }
1263 | }
1264 | },
1265 | "global-dirs": {
1266 | "version": "0.1.1",
1267 | "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz",
1268 | "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=",
1269 | "dev": true,
1270 | "requires": {
1271 | "ini": "^1.3.4"
1272 | }
1273 | },
1274 | "got": {
1275 | "version": "6.7.1",
1276 | "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
1277 | "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
1278 | "dev": true,
1279 | "requires": {
1280 | "create-error-class": "^3.0.0",
1281 | "duplexer3": "^0.1.4",
1282 | "get-stream": "^3.0.0",
1283 | "is-redirect": "^1.0.0",
1284 | "is-retry-allowed": "^1.0.0",
1285 | "is-stream": "^1.0.0",
1286 | "lowercase-keys": "^1.0.0",
1287 | "safe-buffer": "^5.0.1",
1288 | "timed-out": "^4.0.0",
1289 | "unzip-response": "^2.0.1",
1290 | "url-parse-lax": "^1.0.0"
1291 | }
1292 | },
1293 | "graceful-fs": {
1294 | "version": "4.1.15",
1295 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
1296 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
1297 | "dev": true
1298 | },
1299 | "has-flag": {
1300 | "version": "3.0.0",
1301 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1302 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1303 | "dev": true
1304 | },
1305 | "has-value": {
1306 | "version": "1.0.0",
1307 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
1308 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
1309 | "dev": true,
1310 | "requires": {
1311 | "get-value": "^2.0.6",
1312 | "has-values": "^1.0.0",
1313 | "isobject": "^3.0.0"
1314 | }
1315 | },
1316 | "has-values": {
1317 | "version": "1.0.0",
1318 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
1319 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
1320 | "dev": true,
1321 | "requires": {
1322 | "is-number": "^3.0.0",
1323 | "kind-of": "^4.0.0"
1324 | },
1325 | "dependencies": {
1326 | "kind-of": {
1327 | "version": "4.0.0",
1328 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
1329 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
1330 | "dev": true,
1331 | "requires": {
1332 | "is-buffer": "^1.1.5"
1333 | }
1334 | }
1335 | }
1336 | },
1337 | "ignore-by-default": {
1338 | "version": "1.0.1",
1339 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
1340 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
1341 | "dev": true
1342 | },
1343 | "import-lazy": {
1344 | "version": "2.1.0",
1345 | "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
1346 | "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
1347 | "dev": true
1348 | },
1349 | "imurmurhash": {
1350 | "version": "0.1.4",
1351 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1352 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1353 | "dev": true
1354 | },
1355 | "inherits": {
1356 | "version": "2.0.3",
1357 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1358 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
1359 | "dev": true
1360 | },
1361 | "ini": {
1362 | "version": "1.3.5",
1363 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
1364 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
1365 | "dev": true
1366 | },
1367 | "is-accessor-descriptor": {
1368 | "version": "0.1.6",
1369 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
1370 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
1371 | "dev": true,
1372 | "requires": {
1373 | "kind-of": "^3.0.2"
1374 | },
1375 | "dependencies": {
1376 | "kind-of": {
1377 | "version": "3.2.2",
1378 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1379 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1380 | "dev": true,
1381 | "requires": {
1382 | "is-buffer": "^1.1.5"
1383 | }
1384 | }
1385 | }
1386 | },
1387 | "is-binary-path": {
1388 | "version": "1.0.1",
1389 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
1390 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
1391 | "dev": true,
1392 | "requires": {
1393 | "binary-extensions": "^1.0.0"
1394 | }
1395 | },
1396 | "is-buffer": {
1397 | "version": "1.1.6",
1398 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1399 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
1400 | "dev": true
1401 | },
1402 | "is-ci": {
1403 | "version": "1.2.1",
1404 | "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz",
1405 | "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==",
1406 | "dev": true,
1407 | "requires": {
1408 | "ci-info": "^1.5.0"
1409 | }
1410 | },
1411 | "is-data-descriptor": {
1412 | "version": "0.1.4",
1413 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
1414 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
1415 | "dev": true,
1416 | "requires": {
1417 | "kind-of": "^3.0.2"
1418 | },
1419 | "dependencies": {
1420 | "kind-of": {
1421 | "version": "3.2.2",
1422 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1423 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1424 | "dev": true,
1425 | "requires": {
1426 | "is-buffer": "^1.1.5"
1427 | }
1428 | }
1429 | }
1430 | },
1431 | "is-descriptor": {
1432 | "version": "0.1.6",
1433 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
1434 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
1435 | "dev": true,
1436 | "requires": {
1437 | "is-accessor-descriptor": "^0.1.6",
1438 | "is-data-descriptor": "^0.1.4",
1439 | "kind-of": "^5.0.0"
1440 | },
1441 | "dependencies": {
1442 | "kind-of": {
1443 | "version": "5.1.0",
1444 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
1445 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
1446 | "dev": true
1447 | }
1448 | }
1449 | },
1450 | "is-extendable": {
1451 | "version": "0.1.1",
1452 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
1453 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
1454 | "dev": true
1455 | },
1456 | "is-extglob": {
1457 | "version": "2.1.1",
1458 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1459 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
1460 | "dev": true
1461 | },
1462 | "is-fullwidth-code-point": {
1463 | "version": "2.0.0",
1464 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1465 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1466 | "dev": true
1467 | },
1468 | "is-glob": {
1469 | "version": "4.0.1",
1470 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
1471 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
1472 | "dev": true,
1473 | "requires": {
1474 | "is-extglob": "^2.1.1"
1475 | }
1476 | },
1477 | "is-installed-globally": {
1478 | "version": "0.1.0",
1479 | "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz",
1480 | "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=",
1481 | "dev": true,
1482 | "requires": {
1483 | "global-dirs": "^0.1.0",
1484 | "is-path-inside": "^1.0.0"
1485 | }
1486 | },
1487 | "is-npm": {
1488 | "version": "1.0.0",
1489 | "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
1490 | "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
1491 | "dev": true
1492 | },
1493 | "is-number": {
1494 | "version": "3.0.0",
1495 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
1496 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
1497 | "dev": true,
1498 | "requires": {
1499 | "kind-of": "^3.0.2"
1500 | },
1501 | "dependencies": {
1502 | "kind-of": {
1503 | "version": "3.2.2",
1504 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1505 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1506 | "dev": true,
1507 | "requires": {
1508 | "is-buffer": "^1.1.5"
1509 | }
1510 | }
1511 | }
1512 | },
1513 | "is-obj": {
1514 | "version": "1.0.1",
1515 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
1516 | "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
1517 | "dev": true
1518 | },
1519 | "is-path-inside": {
1520 | "version": "1.0.1",
1521 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
1522 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
1523 | "dev": true,
1524 | "requires": {
1525 | "path-is-inside": "^1.0.1"
1526 | }
1527 | },
1528 | "is-plain-object": {
1529 | "version": "2.0.4",
1530 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
1531 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
1532 | "dev": true,
1533 | "requires": {
1534 | "isobject": "^3.0.1"
1535 | }
1536 | },
1537 | "is-redirect": {
1538 | "version": "1.0.0",
1539 | "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
1540 | "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
1541 | "dev": true
1542 | },
1543 | "is-retry-allowed": {
1544 | "version": "1.1.0",
1545 | "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
1546 | "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
1547 | "dev": true
1548 | },
1549 | "is-stream": {
1550 | "version": "1.1.0",
1551 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
1552 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
1553 | "dev": true
1554 | },
1555 | "is-windows": {
1556 | "version": "1.0.2",
1557 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
1558 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
1559 | "dev": true
1560 | },
1561 | "isarray": {
1562 | "version": "1.0.0",
1563 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1564 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1565 | "dev": true
1566 | },
1567 | "isexe": {
1568 | "version": "2.0.0",
1569 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1570 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1571 | "dev": true
1572 | },
1573 | "isobject": {
1574 | "version": "3.0.1",
1575 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
1576 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
1577 | "dev": true
1578 | },
1579 | "kind-of": {
1580 | "version": "6.0.2",
1581 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
1582 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
1583 | "dev": true
1584 | },
1585 | "latest-version": {
1586 | "version": "3.1.0",
1587 | "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
1588 | "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
1589 | "dev": true,
1590 | "requires": {
1591 | "package-json": "^4.0.0"
1592 | }
1593 | },
1594 | "lowercase-keys": {
1595 | "version": "1.0.1",
1596 | "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
1597 | "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
1598 | "dev": true
1599 | },
1600 | "lru-cache": {
1601 | "version": "4.1.5",
1602 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
1603 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
1604 | "dev": true,
1605 | "requires": {
1606 | "pseudomap": "^1.0.2",
1607 | "yallist": "^2.1.2"
1608 | }
1609 | },
1610 | "make-dir": {
1611 | "version": "1.3.0",
1612 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz",
1613 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==",
1614 | "dev": true,
1615 | "requires": {
1616 | "pify": "^3.0.0"
1617 | }
1618 | },
1619 | "map-cache": {
1620 | "version": "0.2.2",
1621 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
1622 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
1623 | "dev": true
1624 | },
1625 | "map-visit": {
1626 | "version": "1.0.0",
1627 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
1628 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
1629 | "dev": true,
1630 | "requires": {
1631 | "object-visit": "^1.0.0"
1632 | }
1633 | },
1634 | "micromatch": {
1635 | "version": "3.1.10",
1636 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
1637 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
1638 | "dev": true,
1639 | "requires": {
1640 | "arr-diff": "^4.0.0",
1641 | "array-unique": "^0.3.2",
1642 | "braces": "^2.3.1",
1643 | "define-property": "^2.0.2",
1644 | "extend-shallow": "^3.0.2",
1645 | "extglob": "^2.0.4",
1646 | "fragment-cache": "^0.2.1",
1647 | "kind-of": "^6.0.2",
1648 | "nanomatch": "^1.2.9",
1649 | "object.pick": "^1.3.0",
1650 | "regex-not": "^1.0.0",
1651 | "snapdragon": "^0.8.1",
1652 | "to-regex": "^3.0.2"
1653 | }
1654 | },
1655 | "minimatch": {
1656 | "version": "3.0.4",
1657 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1658 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1659 | "dev": true,
1660 | "requires": {
1661 | "brace-expansion": "^1.1.7"
1662 | }
1663 | },
1664 | "minimist": {
1665 | "version": "1.2.0",
1666 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
1667 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
1668 | "dev": true
1669 | },
1670 | "mixin-deep": {
1671 | "version": "1.3.1",
1672 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz",
1673 | "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==",
1674 | "dev": true,
1675 | "requires": {
1676 | "for-in": "^1.0.2",
1677 | "is-extendable": "^1.0.1"
1678 | },
1679 | "dependencies": {
1680 | "is-extendable": {
1681 | "version": "1.0.1",
1682 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
1683 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
1684 | "dev": true,
1685 | "requires": {
1686 | "is-plain-object": "^2.0.4"
1687 | }
1688 | }
1689 | }
1690 | },
1691 | "ms": {
1692 | "version": "2.0.0",
1693 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1694 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1695 | "dev": true
1696 | },
1697 | "nan": {
1698 | "version": "2.14.0",
1699 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz",
1700 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==",
1701 | "dev": true,
1702 | "optional": true
1703 | },
1704 | "nanomatch": {
1705 | "version": "1.2.13",
1706 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
1707 | "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
1708 | "dev": true,
1709 | "requires": {
1710 | "arr-diff": "^4.0.0",
1711 | "array-unique": "^0.3.2",
1712 | "define-property": "^2.0.2",
1713 | "extend-shallow": "^3.0.2",
1714 | "fragment-cache": "^0.2.1",
1715 | "is-windows": "^1.0.2",
1716 | "kind-of": "^6.0.2",
1717 | "object.pick": "^1.3.0",
1718 | "regex-not": "^1.0.0",
1719 | "snapdragon": "^0.8.1",
1720 | "to-regex": "^3.0.1"
1721 | }
1722 | },
1723 | "nodemon": {
1724 | "version": "1.19.0",
1725 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.19.0.tgz",
1726 | "integrity": "sha512-NHKpb/Je0Urmwi3QPDHlYuFY9m1vaVfTsRZG5X73rY46xPj0JpNe8WhUGQdkDXQDOxrBNIU3JrcflE9Y44EcuA==",
1727 | "dev": true,
1728 | "requires": {
1729 | "chokidar": "^2.1.5",
1730 | "debug": "^3.1.0",
1731 | "ignore-by-default": "^1.0.1",
1732 | "minimatch": "^3.0.4",
1733 | "pstree.remy": "^1.1.6",
1734 | "semver": "^5.5.0",
1735 | "supports-color": "^5.2.0",
1736 | "touch": "^3.1.0",
1737 | "undefsafe": "^2.0.2",
1738 | "update-notifier": "^2.5.0"
1739 | }
1740 | },
1741 | "nopt": {
1742 | "version": "1.0.10",
1743 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1744 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
1745 | "dev": true,
1746 | "requires": {
1747 | "abbrev": "1"
1748 | }
1749 | },
1750 | "normalize-path": {
1751 | "version": "3.0.0",
1752 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1753 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1754 | "dev": true
1755 | },
1756 | "npm-run-path": {
1757 | "version": "2.0.2",
1758 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
1759 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
1760 | "dev": true,
1761 | "requires": {
1762 | "path-key": "^2.0.0"
1763 | }
1764 | },
1765 | "object-copy": {
1766 | "version": "0.1.0",
1767 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
1768 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
1769 | "dev": true,
1770 | "requires": {
1771 | "copy-descriptor": "^0.1.0",
1772 | "define-property": "^0.2.5",
1773 | "kind-of": "^3.0.3"
1774 | },
1775 | "dependencies": {
1776 | "define-property": {
1777 | "version": "0.2.5",
1778 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
1779 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
1780 | "dev": true,
1781 | "requires": {
1782 | "is-descriptor": "^0.1.0"
1783 | }
1784 | },
1785 | "kind-of": {
1786 | "version": "3.2.2",
1787 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1788 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1789 | "dev": true,
1790 | "requires": {
1791 | "is-buffer": "^1.1.5"
1792 | }
1793 | }
1794 | }
1795 | },
1796 | "object-visit": {
1797 | "version": "1.0.1",
1798 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
1799 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
1800 | "dev": true,
1801 | "requires": {
1802 | "isobject": "^3.0.0"
1803 | }
1804 | },
1805 | "object.pick": {
1806 | "version": "1.3.0",
1807 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
1808 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
1809 | "dev": true,
1810 | "requires": {
1811 | "isobject": "^3.0.1"
1812 | }
1813 | },
1814 | "p-finally": {
1815 | "version": "1.0.0",
1816 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
1817 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
1818 | "dev": true
1819 | },
1820 | "package-json": {
1821 | "version": "4.0.1",
1822 | "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz",
1823 | "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=",
1824 | "dev": true,
1825 | "requires": {
1826 | "got": "^6.7.1",
1827 | "registry-auth-token": "^3.0.1",
1828 | "registry-url": "^3.0.3",
1829 | "semver": "^5.1.0"
1830 | }
1831 | },
1832 | "pascalcase": {
1833 | "version": "0.1.1",
1834 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
1835 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
1836 | "dev": true
1837 | },
1838 | "path-dirname": {
1839 | "version": "1.0.2",
1840 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
1841 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
1842 | "dev": true
1843 | },
1844 | "path-is-absolute": {
1845 | "version": "1.0.1",
1846 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1847 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1848 | "dev": true
1849 | },
1850 | "path-is-inside": {
1851 | "version": "1.0.2",
1852 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
1853 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
1854 | "dev": true
1855 | },
1856 | "path-key": {
1857 | "version": "2.0.1",
1858 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
1859 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
1860 | "dev": true
1861 | },
1862 | "pify": {
1863 | "version": "3.0.0",
1864 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
1865 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
1866 | "dev": true
1867 | },
1868 | "posix-character-classes": {
1869 | "version": "0.1.1",
1870 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
1871 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
1872 | "dev": true
1873 | },
1874 | "prepend-http": {
1875 | "version": "1.0.4",
1876 | "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
1877 | "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
1878 | "dev": true
1879 | },
1880 | "process-nextick-args": {
1881 | "version": "2.0.0",
1882 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
1883 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
1884 | "dev": true
1885 | },
1886 | "pseudomap": {
1887 | "version": "1.0.2",
1888 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
1889 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
1890 | "dev": true
1891 | },
1892 | "pstree.remy": {
1893 | "version": "1.1.6",
1894 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.6.tgz",
1895 | "integrity": "sha512-NdF35+QsqD7EgNEI5mkI/X+UwaxVEbQaz9f4IooEmMUv6ZPmlTQYGjBPJGgrlzNdjSvIy4MWMg6Q6vCgBO2K+w==",
1896 | "dev": true
1897 | },
1898 | "rc": {
1899 | "version": "1.2.8",
1900 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
1901 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
1902 | "dev": true,
1903 | "requires": {
1904 | "deep-extend": "^0.6.0",
1905 | "ini": "~1.3.0",
1906 | "minimist": "^1.2.0",
1907 | "strip-json-comments": "~2.0.1"
1908 | }
1909 | },
1910 | "readable-stream": {
1911 | "version": "2.3.6",
1912 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1913 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1914 | "dev": true,
1915 | "requires": {
1916 | "core-util-is": "~1.0.0",
1917 | "inherits": "~2.0.3",
1918 | "isarray": "~1.0.0",
1919 | "process-nextick-args": "~2.0.0",
1920 | "safe-buffer": "~5.1.1",
1921 | "string_decoder": "~1.1.1",
1922 | "util-deprecate": "~1.0.1"
1923 | }
1924 | },
1925 | "readdirp": {
1926 | "version": "2.2.1",
1927 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
1928 | "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
1929 | "dev": true,
1930 | "requires": {
1931 | "graceful-fs": "^4.1.11",
1932 | "micromatch": "^3.1.10",
1933 | "readable-stream": "^2.0.2"
1934 | }
1935 | },
1936 | "regex-not": {
1937 | "version": "1.0.2",
1938 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
1939 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
1940 | "dev": true,
1941 | "requires": {
1942 | "extend-shallow": "^3.0.2",
1943 | "safe-regex": "^1.1.0"
1944 | }
1945 | },
1946 | "registry-auth-token": {
1947 | "version": "3.4.0",
1948 | "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz",
1949 | "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==",
1950 | "dev": true,
1951 | "requires": {
1952 | "rc": "^1.1.6",
1953 | "safe-buffer": "^5.0.1"
1954 | }
1955 | },
1956 | "registry-url": {
1957 | "version": "3.1.0",
1958 | "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
1959 | "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
1960 | "dev": true,
1961 | "requires": {
1962 | "rc": "^1.0.1"
1963 | }
1964 | },
1965 | "remove-trailing-separator": {
1966 | "version": "1.1.0",
1967 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
1968 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
1969 | "dev": true
1970 | },
1971 | "repeat-element": {
1972 | "version": "1.1.3",
1973 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
1974 | "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
1975 | "dev": true
1976 | },
1977 | "repeat-string": {
1978 | "version": "1.6.1",
1979 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
1980 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
1981 | "dev": true
1982 | },
1983 | "resolve-url": {
1984 | "version": "0.2.1",
1985 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
1986 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
1987 | "dev": true
1988 | },
1989 | "ret": {
1990 | "version": "0.1.15",
1991 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
1992 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
1993 | "dev": true
1994 | },
1995 | "safe-buffer": {
1996 | "version": "5.1.2",
1997 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1998 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1999 | "dev": true
2000 | },
2001 | "safe-regex": {
2002 | "version": "1.1.0",
2003 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
2004 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
2005 | "dev": true,
2006 | "requires": {
2007 | "ret": "~0.1.10"
2008 | }
2009 | },
2010 | "semver": {
2011 | "version": "5.7.0",
2012 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
2013 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
2014 | "dev": true
2015 | },
2016 | "semver-diff": {
2017 | "version": "2.1.0",
2018 | "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
2019 | "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
2020 | "dev": true,
2021 | "requires": {
2022 | "semver": "^5.0.3"
2023 | }
2024 | },
2025 | "set-value": {
2026 | "version": "2.0.0",
2027 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz",
2028 | "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==",
2029 | "dev": true,
2030 | "requires": {
2031 | "extend-shallow": "^2.0.1",
2032 | "is-extendable": "^0.1.1",
2033 | "is-plain-object": "^2.0.3",
2034 | "split-string": "^3.0.1"
2035 | },
2036 | "dependencies": {
2037 | "extend-shallow": {
2038 | "version": "2.0.1",
2039 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
2040 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
2041 | "dev": true,
2042 | "requires": {
2043 | "is-extendable": "^0.1.0"
2044 | }
2045 | }
2046 | }
2047 | },
2048 | "shebang-command": {
2049 | "version": "1.2.0",
2050 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
2051 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
2052 | "dev": true,
2053 | "requires": {
2054 | "shebang-regex": "^1.0.0"
2055 | }
2056 | },
2057 | "shebang-regex": {
2058 | "version": "1.0.0",
2059 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
2060 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
2061 | "dev": true
2062 | },
2063 | "signal-exit": {
2064 | "version": "3.0.2",
2065 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
2066 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
2067 | "dev": true
2068 | },
2069 | "snapdragon": {
2070 | "version": "0.8.2",
2071 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
2072 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
2073 | "dev": true,
2074 | "requires": {
2075 | "base": "^0.11.1",
2076 | "debug": "^2.2.0",
2077 | "define-property": "^0.2.5",
2078 | "extend-shallow": "^2.0.1",
2079 | "map-cache": "^0.2.2",
2080 | "source-map": "^0.5.6",
2081 | "source-map-resolve": "^0.5.0",
2082 | "use": "^3.1.0"
2083 | },
2084 | "dependencies": {
2085 | "debug": {
2086 | "version": "2.6.9",
2087 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
2088 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
2089 | "dev": true,
2090 | "requires": {
2091 | "ms": "2.0.0"
2092 | }
2093 | },
2094 | "define-property": {
2095 | "version": "0.2.5",
2096 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
2097 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
2098 | "dev": true,
2099 | "requires": {
2100 | "is-descriptor": "^0.1.0"
2101 | }
2102 | },
2103 | "extend-shallow": {
2104 | "version": "2.0.1",
2105 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
2106 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
2107 | "dev": true,
2108 | "requires": {
2109 | "is-extendable": "^0.1.0"
2110 | }
2111 | }
2112 | }
2113 | },
2114 | "snapdragon-node": {
2115 | "version": "2.1.1",
2116 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
2117 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
2118 | "dev": true,
2119 | "requires": {
2120 | "define-property": "^1.0.0",
2121 | "isobject": "^3.0.0",
2122 | "snapdragon-util": "^3.0.1"
2123 | },
2124 | "dependencies": {
2125 | "define-property": {
2126 | "version": "1.0.0",
2127 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
2128 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
2129 | "dev": true,
2130 | "requires": {
2131 | "is-descriptor": "^1.0.0"
2132 | }
2133 | },
2134 | "is-accessor-descriptor": {
2135 | "version": "1.0.0",
2136 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
2137 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
2138 | "dev": true,
2139 | "requires": {
2140 | "kind-of": "^6.0.0"
2141 | }
2142 | },
2143 | "is-data-descriptor": {
2144 | "version": "1.0.0",
2145 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
2146 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
2147 | "dev": true,
2148 | "requires": {
2149 | "kind-of": "^6.0.0"
2150 | }
2151 | },
2152 | "is-descriptor": {
2153 | "version": "1.0.2",
2154 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
2155 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
2156 | "dev": true,
2157 | "requires": {
2158 | "is-accessor-descriptor": "^1.0.0",
2159 | "is-data-descriptor": "^1.0.0",
2160 | "kind-of": "^6.0.2"
2161 | }
2162 | }
2163 | }
2164 | },
2165 | "snapdragon-util": {
2166 | "version": "3.0.1",
2167 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
2168 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
2169 | "dev": true,
2170 | "requires": {
2171 | "kind-of": "^3.2.0"
2172 | },
2173 | "dependencies": {
2174 | "kind-of": {
2175 | "version": "3.2.2",
2176 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2177 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2178 | "dev": true,
2179 | "requires": {
2180 | "is-buffer": "^1.1.5"
2181 | }
2182 | }
2183 | }
2184 | },
2185 | "source-map": {
2186 | "version": "0.5.7",
2187 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2188 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
2189 | "dev": true
2190 | },
2191 | "source-map-resolve": {
2192 | "version": "0.5.2",
2193 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
2194 | "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==",
2195 | "dev": true,
2196 | "requires": {
2197 | "atob": "^2.1.1",
2198 | "decode-uri-component": "^0.2.0",
2199 | "resolve-url": "^0.2.1",
2200 | "source-map-url": "^0.4.0",
2201 | "urix": "^0.1.0"
2202 | }
2203 | },
2204 | "source-map-url": {
2205 | "version": "0.4.0",
2206 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
2207 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
2208 | "dev": true
2209 | },
2210 | "split-string": {
2211 | "version": "3.1.0",
2212 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
2213 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
2214 | "dev": true,
2215 | "requires": {
2216 | "extend-shallow": "^3.0.0"
2217 | }
2218 | },
2219 | "static-extend": {
2220 | "version": "0.1.2",
2221 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
2222 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
2223 | "dev": true,
2224 | "requires": {
2225 | "define-property": "^0.2.5",
2226 | "object-copy": "^0.1.0"
2227 | },
2228 | "dependencies": {
2229 | "define-property": {
2230 | "version": "0.2.5",
2231 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
2232 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
2233 | "dev": true,
2234 | "requires": {
2235 | "is-descriptor": "^0.1.0"
2236 | }
2237 | }
2238 | }
2239 | },
2240 | "string-width": {
2241 | "version": "2.1.1",
2242 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
2243 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
2244 | "dev": true,
2245 | "requires": {
2246 | "is-fullwidth-code-point": "^2.0.0",
2247 | "strip-ansi": "^4.0.0"
2248 | }
2249 | },
2250 | "string_decoder": {
2251 | "version": "1.1.1",
2252 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2253 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2254 | "dev": true,
2255 | "requires": {
2256 | "safe-buffer": "~5.1.0"
2257 | }
2258 | },
2259 | "strip-ansi": {
2260 | "version": "4.0.0",
2261 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
2262 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
2263 | "dev": true,
2264 | "requires": {
2265 | "ansi-regex": "^3.0.0"
2266 | }
2267 | },
2268 | "strip-eof": {
2269 | "version": "1.0.0",
2270 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
2271 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
2272 | "dev": true
2273 | },
2274 | "strip-json-comments": {
2275 | "version": "2.0.1",
2276 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
2277 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
2278 | "dev": true
2279 | },
2280 | "supports-color": {
2281 | "version": "5.5.0",
2282 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2283 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2284 | "dev": true,
2285 | "requires": {
2286 | "has-flag": "^3.0.0"
2287 | }
2288 | },
2289 | "term-size": {
2290 | "version": "1.2.0",
2291 | "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz",
2292 | "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=",
2293 | "dev": true,
2294 | "requires": {
2295 | "execa": "^0.7.0"
2296 | }
2297 | },
2298 | "timed-out": {
2299 | "version": "4.0.1",
2300 | "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
2301 | "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
2302 | "dev": true
2303 | },
2304 | "to-object-path": {
2305 | "version": "0.3.0",
2306 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
2307 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
2308 | "dev": true,
2309 | "requires": {
2310 | "kind-of": "^3.0.2"
2311 | },
2312 | "dependencies": {
2313 | "kind-of": {
2314 | "version": "3.2.2",
2315 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2316 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2317 | "dev": true,
2318 | "requires": {
2319 | "is-buffer": "^1.1.5"
2320 | }
2321 | }
2322 | }
2323 | },
2324 | "to-regex": {
2325 | "version": "3.0.2",
2326 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
2327 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
2328 | "dev": true,
2329 | "requires": {
2330 | "define-property": "^2.0.2",
2331 | "extend-shallow": "^3.0.2",
2332 | "regex-not": "^1.0.2",
2333 | "safe-regex": "^1.1.0"
2334 | }
2335 | },
2336 | "to-regex-range": {
2337 | "version": "2.1.1",
2338 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
2339 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
2340 | "dev": true,
2341 | "requires": {
2342 | "is-number": "^3.0.0",
2343 | "repeat-string": "^1.6.1"
2344 | }
2345 | },
2346 | "touch": {
2347 | "version": "3.1.0",
2348 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
2349 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
2350 | "dev": true,
2351 | "requires": {
2352 | "nopt": "~1.0.10"
2353 | }
2354 | },
2355 | "undefsafe": {
2356 | "version": "2.0.2",
2357 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.2.tgz",
2358 | "integrity": "sha1-Il9rngM3Zj4Njnz9aG/Cg2zKznY=",
2359 | "dev": true,
2360 | "requires": {
2361 | "debug": "^2.2.0"
2362 | },
2363 | "dependencies": {
2364 | "debug": {
2365 | "version": "2.6.9",
2366 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
2367 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
2368 | "dev": true,
2369 | "requires": {
2370 | "ms": "2.0.0"
2371 | }
2372 | }
2373 | }
2374 | },
2375 | "union-value": {
2376 | "version": "1.0.0",
2377 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz",
2378 | "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=",
2379 | "dev": true,
2380 | "requires": {
2381 | "arr-union": "^3.1.0",
2382 | "get-value": "^2.0.6",
2383 | "is-extendable": "^0.1.1",
2384 | "set-value": "^0.4.3"
2385 | },
2386 | "dependencies": {
2387 | "extend-shallow": {
2388 | "version": "2.0.1",
2389 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
2390 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
2391 | "dev": true,
2392 | "requires": {
2393 | "is-extendable": "^0.1.0"
2394 | }
2395 | },
2396 | "set-value": {
2397 | "version": "0.4.3",
2398 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz",
2399 | "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=",
2400 | "dev": true,
2401 | "requires": {
2402 | "extend-shallow": "^2.0.1",
2403 | "is-extendable": "^0.1.1",
2404 | "is-plain-object": "^2.0.1",
2405 | "to-object-path": "^0.3.0"
2406 | }
2407 | }
2408 | }
2409 | },
2410 | "unique-string": {
2411 | "version": "1.0.0",
2412 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
2413 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
2414 | "dev": true,
2415 | "requires": {
2416 | "crypto-random-string": "^1.0.0"
2417 | }
2418 | },
2419 | "unset-value": {
2420 | "version": "1.0.0",
2421 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
2422 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
2423 | "dev": true,
2424 | "requires": {
2425 | "has-value": "^0.3.1",
2426 | "isobject": "^3.0.0"
2427 | },
2428 | "dependencies": {
2429 | "has-value": {
2430 | "version": "0.3.1",
2431 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
2432 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
2433 | "dev": true,
2434 | "requires": {
2435 | "get-value": "^2.0.3",
2436 | "has-values": "^0.1.4",
2437 | "isobject": "^2.0.0"
2438 | },
2439 | "dependencies": {
2440 | "isobject": {
2441 | "version": "2.1.0",
2442 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
2443 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
2444 | "dev": true,
2445 | "requires": {
2446 | "isarray": "1.0.0"
2447 | }
2448 | }
2449 | }
2450 | },
2451 | "has-values": {
2452 | "version": "0.1.4",
2453 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
2454 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
2455 | "dev": true
2456 | }
2457 | }
2458 | },
2459 | "unzip-response": {
2460 | "version": "2.0.1",
2461 | "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
2462 | "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
2463 | "dev": true
2464 | },
2465 | "upath": {
2466 | "version": "1.1.2",
2467 | "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz",
2468 | "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==",
2469 | "dev": true
2470 | },
2471 | "update-notifier": {
2472 | "version": "2.5.0",
2473 | "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz",
2474 | "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==",
2475 | "dev": true,
2476 | "requires": {
2477 | "boxen": "^1.2.1",
2478 | "chalk": "^2.0.1",
2479 | "configstore": "^3.0.0",
2480 | "import-lazy": "^2.1.0",
2481 | "is-ci": "^1.0.10",
2482 | "is-installed-globally": "^0.1.0",
2483 | "is-npm": "^1.0.0",
2484 | "latest-version": "^3.0.0",
2485 | "semver-diff": "^2.0.0",
2486 | "xdg-basedir": "^3.0.0"
2487 | }
2488 | },
2489 | "urix": {
2490 | "version": "0.1.0",
2491 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
2492 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
2493 | "dev": true
2494 | },
2495 | "url-parse-lax": {
2496 | "version": "1.0.0",
2497 | "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
2498 | "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
2499 | "dev": true,
2500 | "requires": {
2501 | "prepend-http": "^1.0.1"
2502 | }
2503 | },
2504 | "use": {
2505 | "version": "3.1.1",
2506 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
2507 | "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
2508 | "dev": true
2509 | },
2510 | "util-deprecate": {
2511 | "version": "1.0.2",
2512 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2513 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2514 | "dev": true
2515 | },
2516 | "which": {
2517 | "version": "1.3.1",
2518 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
2519 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
2520 | "dev": true,
2521 | "requires": {
2522 | "isexe": "^2.0.0"
2523 | }
2524 | },
2525 | "widest-line": {
2526 | "version": "2.0.1",
2527 | "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz",
2528 | "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==",
2529 | "dev": true,
2530 | "requires": {
2531 | "string-width": "^2.1.1"
2532 | }
2533 | },
2534 | "write-file-atomic": {
2535 | "version": "2.4.2",
2536 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz",
2537 | "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==",
2538 | "dev": true,
2539 | "requires": {
2540 | "graceful-fs": "^4.1.11",
2541 | "imurmurhash": "^0.1.4",
2542 | "signal-exit": "^3.0.2"
2543 | }
2544 | },
2545 | "ws": {
2546 | "version": "7.0.0",
2547 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.0.0.tgz",
2548 | "integrity": "sha512-cknCal4k0EAOrh1SHHPPWWh4qm93g1IuGGGwBjWkXmCG7LsDtL8w9w+YVfaF+KSVwiHQKDIMsSLBVftKf9d1pg==",
2549 | "requires": {
2550 | "async-limiter": "^1.0.0"
2551 | }
2552 | },
2553 | "xdg-basedir": {
2554 | "version": "3.0.0",
2555 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
2556 | "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
2557 | "dev": true
2558 | },
2559 | "yallist": {
2560 | "version": "2.1.2",
2561 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
2562 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
2563 | "dev": true
2564 | }
2565 | }
2566 | }
2567 |
--------------------------------------------------------------------------------
/websocket/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "lel",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "nodemon ./app/server.js",
8 | "client": "nodemon ./app/client.js",
9 | "test": "echo \"Error: no test specified\" && exit 1"
10 | },
11 | "keywords": [],
12 | "author": "",
13 | "license": "ISC",
14 | "dependencies": {
15 | "ws": "^7.0.0"
16 | },
17 | "devDependencies": {
18 | "nodemon": "^1.19.0"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------