Skip to content

Commit

Permalink
feat: Add Sync (#119)
Browse files Browse the repository at this point in the history
* Add sync modal with states for no wifi, searching for peers, and list of peers
* Hook up API to mapeo-core
  • Loading branch information
gmaclennan authored Apr 30, 2019
2 parents 155bcf0 + 46009bf commit a886b2e
Show file tree
Hide file tree
Showing 39 changed files with 1,215 additions and 49 deletions.
1 change: 1 addition & 0 deletions .flowconfig
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
[ignore]
android/.*
; We fork some components by platform
.*/*[.]android.js

Expand Down
5 changes: 5 additions & 0 deletions __mocks__/netinfo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
module.exports = {
addEventListener: () => ({
remove: () => {}
})
};
6 changes: 6 additions & 0 deletions __mocks__/nodejs-mobile-react-native.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
module.exports = {
channel: {
addListener: () => {},
removeListener: () => {}
}
};
3 changes: 3 additions & 0 deletions __mocks__/react-native-network-info.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
getSSID: () => Promise.resolve()
};
4 changes: 4 additions & 0 deletions android/app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ android {
// build with the default debug keystore
productFlavors.qa.signingConfig signingConfigs.release
productFlavors.app.signingConfig signingConfig
productFlavors.storybook.signingConfig signingConfig
signingConfig null
// Storybook and QA flavors share the same applicationId between
// release and debug builds, but the main app flavor has a suffix
Expand Down Expand Up @@ -205,6 +206,9 @@ android {
}

dependencies {
implementation project(':react-native-android-open-settings')
implementation project(':react-native-network-info')
implementation project(':@react-native-community_netinfo')
implementation project(':@react-native-community_async-storage')
implementation project(':react-native-linear-gradient')
implementation project(':react-native-image-resizer')
Expand Down
1 change: 1 addition & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<application android:name=".MainApplication"
android:label="@string/app_name"
Expand Down
6 changes: 6 additions & 0 deletions android/app/src/main/java/com/mapeo/MainApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import android.app.Application;

import com.facebook.react.ReactApplication;
import com.levelasquez.androidopensettings.AndroidOpenSettingsPackage;
import com.pusherman.networkinfo.RNNetworkInfoPackage;
import com.reactnativecommunity.netinfo.NetInfoPackage;
import com.reactnativecommunity.asyncstorage.AsyncStoragePackage;
import com.BV.LinearGradient.LinearGradientPackage;
import fr.bamlab.rnimageresizer.ImageResizerPackage;
Expand Down Expand Up @@ -52,6 +55,9 @@ public boolean getUseDeveloperSupport() {
protected List<ReactPackage> getPackages() {
return Arrays.<ReactPackage>asList(
new MainReactPackage(),
new AndroidOpenSettingsPackage(),
new RNNetworkInfoPackage(),
new NetInfoPackage(),
new AsyncStoragePackage(),
new LinearGradientPackage(),
new ImageResizerPackage(),
Expand Down
6 changes: 6 additions & 0 deletions android/settings.gradle
Original file line number Diff line number Diff line change
@@ -1,4 +1,10 @@
rootProject.name = 'mapeo'
include ':react-native-android-open-settings'
project(':react-native-android-open-settings').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-android-open-settings/android')
include ':react-native-network-info'
project(':react-native-network-info').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-network-info/android')
include ':@react-native-community_netinfo'
project(':@react-native-community_netinfo').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/netinfo/android')
include ':@react-native-community_async-storage'
project(':@react-native-community_async-storage').projectDir = new File(rootProject.projectDir, '../node_modules/@react-native-community/async-storage/android')
include ':react-native-linear-gradient'
Expand Down
47 changes: 47 additions & 0 deletions ios/mapeo.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@
FF616BD86DE744EEA435AA19 /* libRCTImageResizer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = B3CE0F918BC341A0BE6863AB /* libRCTImageResizer.a */; };
5BAF7F6A282342728B7B8A7B /* libBVLinearGradient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8B63F475347249B6AB4599B2 /* libBVLinearGradient.a */; };
9F73BCC690704E34AE284DC2 /* libRNCAsyncStorage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = D533B5ABC67146A9ADE9D5B4 /* libRNCAsyncStorage.a */; };
B802B70C5B654E47834581C1 /* libRNCNetInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C5F3C01B8A72442E927FA112 /* libRNCNetInfo.a */; };
86DA8BC18AC846DF869F5F69 /* libRNCNetInfo-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C3789A3FC7374D679C45F0D7 /* libRNCNetInfo-tvOS.a */; };
02439F34EC5042359BC2E159 /* libRNNetworkInfo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4DC4C65FA5A94F94B6C48131 /* libRNNetworkInfo.a */; };
/* End PBXBuildFile section */

/* Begin PBXContainerItemProxy section */
Expand Down Expand Up @@ -445,6 +448,11 @@
8B63F475347249B6AB4599B2 /* libBVLinearGradient.a */ = {isa = PBXFileReference; name = "libBVLinearGradient.a"; path = "libBVLinearGradient.a"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
D7CF6963B17C4EF595FB5328 /* RNCAsyncStorage.xcodeproj */ = {isa = PBXFileReference; name = "RNCAsyncStorage.xcodeproj"; path = "../node_modules/@react-native-community/async-storage/ios/RNCAsyncStorage.xcodeproj"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; };
D533B5ABC67146A9ADE9D5B4 /* libRNCAsyncStorage.a */ = {isa = PBXFileReference; name = "libRNCAsyncStorage.a"; path = "libRNCAsyncStorage.a"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
94B93030510240C0BF42749E /* RNCNetInfo.xcodeproj */ = {isa = PBXFileReference; name = "RNCNetInfo.xcodeproj"; path = "../node_modules/@react-native-community/netinfo/ios/RNCNetInfo.xcodeproj"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; };
C5F3C01B8A72442E927FA112 /* libRNCNetInfo.a */ = {isa = PBXFileReference; name = "libRNCNetInfo.a"; path = "libRNCNetInfo.a"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
C3789A3FC7374D679C45F0D7 /* libRNCNetInfo-tvOS.a */ = {isa = PBXFileReference; name = "libRNCNetInfo-tvOS.a"; path = "libRNCNetInfo-tvOS.a"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
F67F7D4E6D944096A8AD35B1 /* RNNetworkInfo.xcodeproj */ = {isa = PBXFileReference; name = "RNNetworkInfo.xcodeproj"; path = "../node_modules/react-native-network-info/ios/RNNetworkInfo.xcodeproj"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = wrapper.pb-project; explicitFileType = undefined; includeInIndex = 0; };
4DC4C65FA5A94F94B6C48131 /* libRNNetworkInfo.a */ = {isa = PBXFileReference; name = "libRNNetworkInfo.a"; path = "libRNNetworkInfo.a"; sourceTree = "<group>"; fileEncoding = undefined; lastKnownFileType = archive.ar; explicitFileType = undefined; includeInIndex = 0; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -483,6 +491,8 @@
FF616BD86DE744EEA435AA19 /* libRCTImageResizer.a in Frameworks */,
5BAF7F6A282342728B7B8A7B /* libBVLinearGradient.a in Frameworks */,
9F73BCC690704E34AE284DC2 /* libRNCAsyncStorage.a in Frameworks */,
B802B70C5B654E47834581C1 /* libRNCNetInfo.a in Frameworks */,
02439F34EC5042359BC2E159 /* libRNNetworkInfo.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand All @@ -500,6 +510,7 @@
2D02E4C71E0B4AEC006451C7 /* libRCTText-tvOS.a in Frameworks */,
2D02E4C81E0B4AEC006451C7 /* libRCTWebSocket-tvOS.a in Frameworks */,
D29FCEED4E3040F8965EDF30 /* libRNGestureHandler-tvOS.a in Frameworks */,
86DA8BC18AC846DF869F5F69 /* libRNCNetInfo-tvOS.a in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
Expand Down Expand Up @@ -683,6 +694,8 @@
DBAB6DC6E271478995725331 /* RCTImageResizer.xcodeproj */,
090503EF05954EB19C73DB11 /* BVLinearGradient.xcodeproj */,
D7CF6963B17C4EF595FB5328 /* RNCAsyncStorage.xcodeproj */,
94B93030510240C0BF42749E /* RNCNetInfo.xcodeproj */,
F67F7D4E6D944096A8AD35B1 /* RNNetworkInfo.xcodeproj */,
);
name = Libraries;
sourceTree = "<group>";
Expand Down Expand Up @@ -1490,6 +1503,8 @@
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/@react-native-community/netinfo/ios",
"$(SRCROOT)/../node_modules/react-native-network-info/ios",
);
INFOPLIST_FILE = mapeoTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
Expand All @@ -1506,6 +1521,9 @@
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
Expand Down Expand Up @@ -1539,6 +1557,8 @@
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/@react-native-community/netinfo/ios",
"$(SRCROOT)/../node_modules/react-native-network-info/ios",
);
INFOPLIST_FILE = mapeoTests/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 9.0;
Expand All @@ -1555,6 +1575,9 @@
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
Expand Down Expand Up @@ -1588,6 +1611,8 @@
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/@react-native-community/netinfo/ios",
"$(SRCROOT)/../node_modules/react-native-network-info/ios",
);
INFOPLIST_FILE = mapeo/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
Expand Down Expand Up @@ -1623,6 +1648,8 @@
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/@react-native-community/netinfo/ios",
"$(SRCROOT)/../node_modules/react-native-network-info/ios",
);
INFOPLIST_FILE = mapeo/Info.plist;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
Expand Down Expand Up @@ -1666,6 +1693,8 @@
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/@react-native-community/netinfo/ios",
"$(SRCROOT)/../node_modules/react-native-network-info/ios",
);
INFOPLIST_FILE = "mapeo-tvOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
Expand All @@ -1681,6 +1710,9 @@
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
Expand Down Expand Up @@ -1723,6 +1755,8 @@
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/@react-native-community/netinfo/ios",
"$(SRCROOT)/../node_modules/react-native-network-info/ios",
);
INFOPLIST_FILE = "mapeo-tvOS/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
Expand All @@ -1738,6 +1772,9 @@
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
Expand Down Expand Up @@ -1779,6 +1816,8 @@
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/@react-native-community/netinfo/ios",
"$(SRCROOT)/../node_modules/react-native-network-info/ios",
);
INFOPLIST_FILE = "mapeo-tvOSTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
Expand All @@ -1794,6 +1833,9 @@
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
Expand Down Expand Up @@ -1835,6 +1877,8 @@
"$(SRCROOT)/../node_modules/react-native-image-resizer/ios/RCTImageResizer",
"$(SRCROOT)/../node_modules/react-native-linear-gradient/BVLinearGradient",
"$(SRCROOT)/../node_modules/@react-native-community/async-storage/ios",
"$(SRCROOT)/../node_modules/@react-native-community/netinfo/ios",
"$(SRCROOT)/../node_modules/react-native-network-info/ios",
);
INFOPLIST_FILE = "mapeo-tvOSTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
Expand All @@ -1850,6 +1894,9 @@
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
"\"$(SRCROOT)/$(TARGET_NAME)\"",
);
OTHER_LDFLAGS = (
"-ObjC",
Expand Down
28 changes: 18 additions & 10 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,25 +5,28 @@
"scripts": {
"start": "node node_modules/react-native/local-cli/cli.js start",
"android": "npm run build:backend && react-native run-android --variant=appDebug --appIdSuffix=debug",
"android-storybook": "react-native run-android --variant=storybookDebug --appIdSuffix=storybook.debug",
"android-storybook": "react-native run-android --variant=storybookDebug --appIdSuffix=storybook",
"build:backend": "./scripts/build-backend.sh",
"build:release": "npm run build:backend && ./scripts/build-release-android.sh",
"build:storybook": "./node_modules/@storybook/react/bin/build.js -c ./storybook-web -s ./public -o ./build --no-dll",
"test": "jest",
"lint": "eslint *.js \"src/**/*.js\"",
"flow": "flow",
"flow-typed": "flow-typed install -i dev",
"log": "adb logcat *:S NODEJS-MOBILE:V ReactNative:V ReactNativeJS:V",
"dev-menu": "adb shell input keyevent 82",
"prettier": "prettier --write \"src/**/*.js\"",
"release": "standard-version",
"release:alpha": "standard-version --prerelease alpha",
"release:beta": "standard-version --prerelease beta",
"release-notes": "conventional-changelog -r 2 -p angular",
"storybook-native": "./node_modules/@storybook/react-native-server/bin/index.js -p 7007 -c ./storybook-native",
"storybook-web": "./node_modules/@storybook/react/bin/index.js -c ./storybook-web -s ./public"
"storybook-web": "./node_modules/@storybook/react/bin/index.js -c ./storybook-web -s ./public -p 5005 --ci"
},
"dependencies": {
"@mapbox/react-native-mapbox-gl": "^6.1.3",
"@react-native-community/async-storage": "^1.3.1",
"@react-native-community/netinfo": "^2.0.5",
"@unimodules/core": "^0.2.0",
"core-js": "^2.6.5",
"debug": "^4.1.1",
Expand All @@ -33,15 +36,20 @@
"ky": "^0.10.0",
"lodash": "^4.17.11",
"mapeo-schema": "^1.0.4",
"material-ui": "^0.20.2",
"memoize-one": "^5.0.0",
"nodejs-mobile-react-native": "^0.3.3",
"prop-types": "^15.7.2",
"querystring": "^0.2.0",
"react": "16.6.3",
"react-native": "0.58.5",
"react-native-android-open-settings": "^1.3.0",
"react-native-fs": "^2.13.3",
"react-native-gesture-handler": "^1.1.0",
"react-native-image-resizer": "^1.0.1",
"react-native-indicators": "^0.13.0",
"react-native-linear-gradient": "^2.5.4",
"react-native-network-info": "github:pusherman/react-native-network-info#301c66e9bb8f4b7d65e8e0d29188d0b0dbbdb6c2",
"react-native-progress": "^3.6.0",
"react-native-reanimated": "^1.0.0-alpha.12",
"react-native-screens": "^1.0.0-alpha.22",
Expand All @@ -54,14 +62,14 @@
"utm": "^1.1.1"
},
"devDependencies": {
"@storybook/addon-actions": "^5.1.0-alpha.33",
"@storybook/addon-info": "^5.1.0-alpha.33",
"@storybook/addon-links": "^5.1.0-alpha.33",
"@storybook/addon-viewport": "^5.1.0-alpha.33",
"@storybook/addons": "^5.1.0-alpha.33",
"@storybook/react": "^5.1.0-alpha.33",
"@storybook/react-native": "^5.1.0-alpha.33",
"@storybook/react-native-server": "^5.1.0-alpha.33",
"@storybook/addon-actions": "^5.1.0-alpha.36",
"@storybook/addon-info": "^5.1.0-alpha.36",
"@storybook/addon-links": "^5.1.0-alpha.36",
"@storybook/addon-viewport": "^5.1.0-alpha.36",
"@storybook/addons": "^5.1.0-alpha.36",
"@storybook/react": "^5.1.0-alpha.36",
"@storybook/react-native": "^5.1.0-alpha.36",
"@storybook/react-native-server": "^5.1.0-alpha.36",
"@turf/random": "^6.0.2",
"babel-core": "^7.0.0-bridge.0",
"babel-eslint": "^10.0.1",
Expand Down
3 changes: 2 additions & 1 deletion src/backend/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

const rnBridge = require("rn-bridge");
const debug = require("debug");
debug.enable("*");
debug.enable("mapeo*");

const ServerStatus = require("./status");
const constants = require("./constants");
Expand All @@ -36,6 +36,7 @@ status.startHeartbeat();

process.on("uncaughtException", function(err) {
log(err.message);
console.trace(err);
status.setState(constants.ERROR);
});

Expand Down
2 changes: 1 addition & 1 deletion src/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
"kappa-osm": "^3.0.1",
"level": "^4.0.0",
"mapeo-default-settings": "^2.0.0",
"mapeo-server": "^13.2.0",
"mapeo-server": "^13.2.1",
"mkdirp": "^0.5.1",
"random-access-file": "^2.1.0",
"safe-fs-blob-store": "^1.0.3"
Expand Down
Loading

0 comments on commit a886b2e

Please sign in to comment.