diff --git a/deploy/build.bat b/deploy/build.bat index c47b1e1009..d775a8582b 100644 --- a/deploy/build.bat +++ b/deploy/build.bat @@ -44,8 +44,8 @@ cd ..\deploy echo Copy static content -xcopy /E /Q ..\webapp\packages\dbeaver\dist cloudbeaver\web >NUL +xcopy /E /Q ..\webapp\packages\cloudbeaver\dist cloudbeaver\web >NUL echo Cloudbeaver is ready. Run run-server.bat in cloudbeaver folder to start the server. -pause \ No newline at end of file +pause diff --git a/deploy/build.sh b/deploy/build.sh index 5c823ced3c..4c7d04a5c8 100755 --- a/deploy/build.sh +++ b/deploy/build.sh @@ -43,6 +43,6 @@ cd ../deploy echo "Copy static content" -cp -rp ../webapp/packages/dbeaver/dist/* cloudbeaver/web +cp -rp ../webapp/packages/cloudbeaver/dist/* cloudbeaver/web echo "Cloudbeaver is ready. Run run-server.bat in cloudbeaver folder to start the server." diff --git a/server/bundles/io.cloudbeaver.connect.provider.sample/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.connect.provider.sample/META-INF/MANIFEST.MF index d1625f484c..e78a17f702 100644 --- a/server/bundles/io.cloudbeaver.connect.provider.sample/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.connect.provider.sample/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: io.cloudbeaver.connect.provider.sample;singleton:=true -Bundle-Version: 1.0.5.qualifier -Bundle-Release-Date: 20200518 +Bundle-Version: 1.0.6.qualifier +Bundle-Release-Date: 20200601 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . diff --git a/server/bundles/io.cloudbeaver.connect.provider.sample/pom.xml b/server/bundles/io.cloudbeaver.connect.provider.sample/pom.xml index 67c58f4b85..f6cfaadde1 100644 --- a/server/bundles/io.cloudbeaver.connect.provider.sample/pom.xml +++ b/server/bundles/io.cloudbeaver.connect.provider.sample/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.connect.provider.sample - 1.0.5-SNAPSHOT + 1.0.6-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF index 5ab20a92a4..1959d74ba2 100644 --- a/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.product.ce/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: io.cloudbeaver.product.ce;singleton:=true -Bundle-Version: 1.0.0.qualifier -Bundle-Release-Date: 20200518 +Bundle-Version: 1.0.1.qualifier +Bundle-Release-Date: 20200601 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . diff --git a/server/bundles/io.cloudbeaver.product.ce/pom.xml b/server/bundles/io.cloudbeaver.product.ce/pom.xml index 61d40947c1..b834eb78ad 100644 --- a/server/bundles/io.cloudbeaver.product.ce/pom.xml +++ b/server/bundles/io.cloudbeaver.product.ce/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.product.ce - 1.0.0-SNAPSHOT + 1.0.1-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF index 3b3316f820..a599a3ba2f 100644 --- a/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.resources.drivers.base/META-INF/MANIFEST.MF @@ -2,8 +2,8 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Base JDBC drivers Bundle-SymbolicName: io.cloudbeaver.resources.drivers.base;singleton:=true -Bundle-Version: 1.0.2.qualifier -Bundle-Release-Date: 20200518 +Bundle-Version: 1.0.3.qualifier +Bundle-Release-Date: 20200601 Bundle-Vendor: DBeaver Corp Bundle-ActivationPolicy: lazy Automatic-Module-Name: io.cloudbeaver.resources.drivers.base diff --git a/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml b/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml index d534aeeeb9..3a78917692 100644 --- a/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml +++ b/server/bundles/io.cloudbeaver.resources.drivers.base/pom.xml @@ -9,6 +9,6 @@ ../ io.cloudbeaver.resources.drivers.base - 1.0.2-SNAPSHOT + 1.0.3-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF index b8a8e50753..de42abd84c 100644 --- a/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.server/META-INF/MANIFEST.MF @@ -4,7 +4,7 @@ Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: io.cloudbeaver.server;singleton:=true Bundle-Version: 1.0.2.qualifier -Bundle-Release-Date: 20200518 +Bundle-Release-Date: 20200601 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-Activator: io.cloudbeaver.server.WebPlatformActivator diff --git a/server/bundles/io.cloudbeaver.server/plugin.xml b/server/bundles/io.cloudbeaver.server/plugin.xml index bd1a05c3f0..2a8cf1ae8e 100644 --- a/server/bundles/io.cloudbeaver.server/plugin.xml +++ b/server/bundles/io.cloudbeaver.server/plugin.xml @@ -20,7 +20,7 @@ - + diff --git a/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls b/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls index 0442ccd4a0..2140aa96eb 100644 --- a/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls +++ b/server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls @@ -62,6 +62,7 @@ input SQLDataFilter { constraints: [ SQLDataFilterConstraint ] where: String + orderBy: String } type SQLResultColumn { diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWSecurityController.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWSecurityController.java index a607caab1f..480e4d945f 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWSecurityController.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWSecurityController.java @@ -42,10 +42,14 @@ public interface DBWSecurityController { void setUserRoles(String userId, String[] roleIds, String grantorId) throws DBCException; + @NotNull WebRole[] getUserRoles(String userId) throws DBCException; WebUser getUserById(String userId) throws DBCException; + @NotNull + WebUser[] findUsers(String userNameMask) throws DBCException; + /////////////////////////////////////////// // Credentials @@ -69,8 +73,11 @@ public interface DBWSecurityController { /////////////////////////////////////////// // Roles + @NotNull WebRole[] readAllRoles() throws DBCException; + WebRole[] findRoles(String roleName) throws DBCException; + void createRole(WebRole role) throws DBCException; void deleteRole(String roleId) throws DBCException; @@ -80,8 +87,10 @@ public interface DBWSecurityController { void setSubjectPermissions(String subjectId, String[] permissionIds, String grantorId) throws DBCException; + @NotNull Set getSubjectPermissions(String subjectId) throws DBCException; + @NotNull Set getUserPermissions(String userId) throws DBCException; /////////////////////////////////////////// @@ -94,7 +103,8 @@ public interface DBWSecurityController { void updateSession(WebSession session) throws DBCException; /////////////////////////////////////////// - // Meta info + // Permissions + /////////////////////////////////////////// // Utils diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebException.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebException.java index 5a8fb394c3..94b1bcd53f 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebException.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebException.java @@ -39,6 +39,9 @@ import java.util.Map; public class DBWebException extends DBException implements GraphQLError { public static final String ERROR_CODE_SESSION_EXPIRED = "sessionExpired"; + public static final String ERROR_CODE_ACCESS_DENIED = "accessDenied"; + public static final String ERROR_CODE_IDENT_REQUIRED = "identRequired"; + public static final String ERROR_CODE_AUTH_REQUIRED = "authRequired"; private List path; private List locations; diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebExceptionAccessDenied.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebExceptionAccessDenied.java index b7d62705c0..a8b735bde8 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebExceptionAccessDenied.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/DBWebExceptionAccessDenied.java @@ -21,8 +21,6 @@ package io.cloudbeaver; */ public class DBWebExceptionAccessDenied extends DBWebException { - public static final String ERROR_CODE_ACCESS_DENIED = "accessDenied"; - public DBWebExceptionAccessDenied(String message) { super(message, ERROR_CODE_ACCESS_DENIED); } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java index 3c47a6efe8..c2cfe83221 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSession.java @@ -30,6 +30,7 @@ import org.eclipse.core.runtime.Status; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBPDataSourceContainer; +import org.jkiss.dbeaver.model.access.DBASession; import org.jkiss.dbeaver.model.app.DBPProject; import org.jkiss.dbeaver.model.exec.DBCException; import org.jkiss.dbeaver.model.meta.Association; @@ -53,7 +54,7 @@ import java.util.function.Function; * Web session. * Is the main source of data in web application */ -public class WebSession { +public class WebSession implements DBASession { private static final Log log = Log.getLog(WebSession.class); @@ -104,10 +105,15 @@ public class WebSession { } @Property - public String getId() { + public String getSessionId() { return id; } + @Override + public boolean isApplicationSession() { + return false; + } + @Property public String getCreateTime() { return CBConstants.ISO_DATE_FORMAT.format(createTime); diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSessionManager.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSessionManager.java index d85e257e3e..05592f2dad 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSessionManager.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/session/WebSessionManager.java @@ -95,7 +95,7 @@ public class WebSessionManager { } } - log.debug("> New web session '" + webSession.getId() + "'"); + log.debug("> New web session '" + webSession.getSessionId() + "'"); } else { if (updateInfo) { // Update only once per request @@ -132,7 +132,7 @@ public class WebSessionManager { } for (WebSession session : expiredList) { - log.debug("> Expire session '" + session.getId() + "'"); + log.debug("> Expire session '" + session.getSessionId() + "'"); session.close(); } } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebRole.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebRole.java index 23444ad139..c42e7915a9 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebRole.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebRole.java @@ -30,7 +30,6 @@ public class WebRole implements WebAuthSubject { private String roleId; private String name; - private String icon; private String description; private Set permissions = new LinkedHashSet<>(); @@ -43,10 +42,6 @@ public class WebRole implements WebAuthSubject { return roleId; } - public void setRoleId(String id) { - this.roleId = id; - } - public String getName() { return name; } @@ -55,14 +50,6 @@ public class WebRole implements WebAuthSubject { this.name = name; } - public String getIcon() { - return icon; - } - - public void setIcon(String icon) { - this.icon = icon; - } - public String getDescription() { return description; } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUser.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUser.java index 8943002f73..d3084a2098 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUser.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/model/user/WebUser.java @@ -35,7 +35,7 @@ public class WebUser implements WebAuthSubject { private Map metaParameters = new LinkedHashMap<>(); private Map configurationParameters = new LinkedHashMap<>(); - private Set roles = new LinkedHashSet<>(); + private WebRole[] roles = null; private String activeAuthModel; private Map> authCredentials = new HashMap<>(); @@ -61,7 +61,7 @@ public class WebUser implements WebAuthSubject { } public String[] getGrantedRoles() { - return roles.stream().map(WebRole::getRoleId).toArray(String[]::new); + return Arrays.stream(roles).map(WebRole::getRoleId).toArray(String[]::new); } public Map getMetaParameters() { @@ -72,8 +72,12 @@ public class WebUser implements WebAuthSubject { return Collections.unmodifiableMap(configurationParameters); } - public Set getRoles() { - return Collections.unmodifiableSet(roles); + public WebRole[] getRoles() { + return roles; + } + + public void setRoles(WebRole[] roles) { + this.roles = roles; } @Override diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java index 415bd76809..b24f6e56a2 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/registry/WebAuthProviderDescriptor.java @@ -110,4 +110,8 @@ public class WebAuthProviderDescriptor extends AbstractDescriptor { return instance; } + @Override + public String toString() { + return getId(); + } } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java index ea4c09a24d..bb11f93704 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBAppConfig.java @@ -18,6 +18,10 @@ package io.cloudbeaver.server; import io.cloudbeaver.auth.provider.local.LocalAuthProvider; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; + /** * Application configuration */ @@ -33,6 +37,7 @@ public class CBAppConfig { private String[] enabledDrivers = new String[0]; private String[] disabledDrivers = new String[0]; private String defaultAuthProvider = LocalAuthProvider.PROVIDER_ID; + private Map plugins = new LinkedHashMap<>(); public boolean isAuthenticationEnabled() { return authenticationEnabled; @@ -77,4 +82,18 @@ public class CBAppConfig { public String getDefaultAuthProvider() { return defaultAuthProvider; } + + public Map getPluginConfig(String pluginId) { + Object config = plugins.get(pluginId); + if (config instanceof Map) { + return (Map) config; + } else { + return Collections.emptyMap(); + } + } + + public T getPluginOption(String pluginId, String option) { + return (T)getPluginConfig(pluginId).get(option); + } + } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java index 4d328b09b1..b74b6cb7ee 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/server/CBSecurityController.java @@ -76,6 +76,7 @@ class CBSecurityController implements DBWSecurityController { @Override public void deleteUser(String userId) throws DBCException { try (Connection dbCon = database.openConnection()) { + deleteAuthSubject(dbCon, userId); JDBCUtils.executeStatement(dbCon, "DELETE FROM CB_USER WHERE USER_ID=?", userId); } catch (SQLException e) { throw new DBCException("Error deleting user from database", e); @@ -102,10 +103,13 @@ class CBSecurityController implements DBWSecurityController { } } + @NotNull @Override public WebRole[] getUserRoles(String userId) throws DBCException { try (Connection dbCon = database.openConnection()) { - try (PreparedStatement dbStat = dbCon.prepareStatement("SELECT * FROM CB_USER WHERE USER_ID=?")) { + try (PreparedStatement dbStat = dbCon.prepareStatement( + "SELECT R.* FROM CB_USER_ROLE UR,CB_ROLE R " + + "WHERE UR.USER_ID=? AND UR.ROLE_ID=R.ROLE_ID")) { dbStat.setString(1, userId); List roles = new ArrayList<>(); try (ResultSet dbResult = dbStat.executeQuery()) { @@ -137,6 +141,28 @@ class CBSecurityController implements DBWSecurityController { } } + @NotNull + @Override + public WebUser[] findUsers(String userNameMask) throws DBCException { + try (Connection dbCon = database.openConnection()) { + try (PreparedStatement dbStat = dbCon.prepareStatement("SELECT * FROM CB_USER" + + (CommonUtils.isEmpty(userNameMask) ? "" : " WHERE USER_ID=?"))) { + if (!CommonUtils.isEmpty(userNameMask)) { + dbStat.setString(1, userNameMask); + } + try (ResultSet dbResult = dbStat.executeQuery()) { + List result = new ArrayList<>(); + while (dbResult.next()) { + result.add(new WebUser(dbResult.getString(1))); + } + return result.toArray(new WebUser[0]); + } + } + } catch (SQLException e) { + throw new DBCException("Error while searching credentials", e); + } + } + /////////////////////////////////////////// // Credentials @@ -273,6 +299,7 @@ class CBSecurityController implements DBWSecurityController { /////////////////////////////////////////// // Roles + @NotNull @Override public WebRole[] readAllRoles() throws DBCException { try (Connection dbCon = database.openConnection()) { @@ -301,6 +328,11 @@ class CBSecurityController implements DBWSecurityController { } } + @Override + public WebRole[] findRoles(String roleName) throws DBCException { + return readAllRoles(); + } + @NotNull private WebRole fetchRole(ResultSet dbResult) throws SQLException { WebRole role = new WebRole(dbResult.getString("ROLE_ID")); @@ -328,6 +360,7 @@ class CBSecurityController implements DBWSecurityController { @Override public void deleteRole(String roleId) throws DBCException { try (Connection dbCon = database.openConnection()) { + deleteAuthSubject(dbCon, roleId); JDBCUtils.executeStatement(dbCon, "DELETE FROM CB_ROLE WHERE ROLE_ID=?", roleId); } catch (SQLException e) { throw new DBCException("Error deleting role from database", e); @@ -357,6 +390,7 @@ class CBSecurityController implements DBWSecurityController { } } + @NotNull @Override public Set getSubjectPermissions(String subjectId) throws DBCException { try (Connection dbCon = database.openConnection()) { @@ -375,6 +409,7 @@ class CBSecurityController implements DBWSecurityController { } } + @NotNull @Override public Set getUserPermissions(String userId) throws DBCException { try (Connection dbCon = database.openConnection()) { @@ -430,7 +465,7 @@ class CBSecurityController implements DBWSecurityController { try (Connection dbCon = database.openConnection()) { try (PreparedStatement dbStat = dbCon.prepareStatement( "INSERT INTO CB_SESSION(SESSION_ID,USER_ID,CREATE_TIME,LAST_ACCESS_TIME,LAST_ACCESS_REMOTE_ADDRESS,LAST_ACCESS_USER_AGENT) VALUES(?,?,?,?,?,?)")) { - dbStat.setString(1, session.getId()); + dbStat.setString(1, session.getSessionId()); WebUser user = session.getUser(); if (user == null) { dbStat.setNull(2, Types.VARCHAR); @@ -480,7 +515,7 @@ class CBSecurityController implements DBWSecurityController { dbStat.setNull(4, Types.VARCHAR); } - dbStat.setString(5, session.getId()); + dbStat.setString(5, session.getSessionId()); if (dbStat.executeUpdate() == 0) { throw new DBCException("Session not exists in database"); } @@ -527,5 +562,11 @@ class CBSecurityController implements DBWSecurityController { } } + private void deleteAuthSubject(Connection dbCon, String subjectId) throws SQLException { + try (PreparedStatement dbStat = dbCon.prepareStatement("DELETE FROM CB_AUTH_SUBJECT WHERE SUBJECT_ID=?")) { + dbStat.setString(1, subjectId); + dbStat.execute(); + } + } } diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java index e64526882e..e97c4ecd4e 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/WebServiceBindingBase.java @@ -99,6 +99,11 @@ public abstract class WebServiceBindingBase impleme getServletRequest(env)); } + protected static WebSession getWebSession(DataFetchingEnvironment env, boolean errorOnNotFound) throws DBWebException { + return CBPlatform.getInstance().getSessionManager().getWebSession( + getServletRequest(env), errorOnNotFound); + } + protected static WebSession findWebSession(DataFetchingEnvironment env) { return CBPlatform.getInstance().getSessionManager().findWebSession( getServletRequest(env)); diff --git a/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF index 4ea15ea33d..479953fc31 100644 --- a/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.admin/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: io.cloudbeaver.service.admin;singleton:=true -Bundle-Version: 1.0.1.qualifier -Bundle-Release-Date: 20200518 +Bundle-Version: 1.0.2.qualifier +Bundle-Release-Date: 20200601 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . diff --git a/server/bundles/io.cloudbeaver.service.admin/plugin.xml b/server/bundles/io.cloudbeaver.service.admin/plugin.xml index a4c358cd70..12d7330c37 100644 --- a/server/bundles/io.cloudbeaver.service.admin/plugin.xml +++ b/server/bundles/io.cloudbeaver.service.admin/plugin.xml @@ -5,7 +5,7 @@ - + diff --git a/server/bundles/io.cloudbeaver.service.admin/pom.xml b/server/bundles/io.cloudbeaver.service.admin/pom.xml index e6a9b12b05..27919295b2 100644 --- a/server/bundles/io.cloudbeaver.service.admin/pom.xml +++ b/server/bundles/io.cloudbeaver.service.admin/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.admin - 1.0.1-SNAPSHOT + 1.0.2-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls b/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls index baa705fcb9..5c53236518 100644 --- a/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls +++ b/server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls @@ -1,6 +1,6 @@ type AdminUserInfo { - userName: ID! + userId: ID! metaParameters: Object! configurationParameters: Object! @@ -8,15 +8,16 @@ type AdminUserInfo { } type AdminRoleInfo { - roleName: ID! + roleId: ID! + roleName: String rolePermissions: [ID]! } type AdminPermissionInfo { id: ID! - label: [String] - description: [String] + label: String + description: String provider: String! category: String @@ -24,20 +25,21 @@ type AdminPermissionInfo { extend type Query { - listUsers(userName: ID): [AdminUserInfo]! - listRoles(roleName: ID): [AdminRoleInfo]! - listPermissions(permissionId: ID): [AdminPermissionInfo] + listUsers(userId: ID): [AdminUserInfo]! + listRoles(roleId: ID): [AdminRoleInfo]! + listPermissions: [AdminPermissionInfo]! - createUser(userName: ID!): AdminUserInfo! - deleteUser(userName: ID!): Boolean + createUser(userId: ID!): AdminUserInfo! + deleteUser(userId: ID!): Boolean - getUserAdminCredentials(userName: ID!): Object + createRole(roleId: ID!): AdminRoleInfo! + deleteRole(roleId: ID!): Boolean - setUserAdminCredentials(userName: ID!, credentials: Object): Boolean + grantUserRole(userId: ID!, roleId: ID!): Boolean + revokeUserRole(userId: ID!, roleId: ID!): Boolean - grantUserRole(user: ID!, role: ID!): Boolean - revokeUserRole(user: ID!, role: ID!): Boolean + setRolePermissions(roleId: ID!, permissions: [ID]!): Boolean - setRolePermissions(roleID: ID!, permissions: [ID]!): Boolean + setUserCredentials(userId: ID!, providerId: ID!, credentials: Object!): Boolean } diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminPermissionInfo.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminPermissionInfo.java new file mode 100644 index 0000000000..1e56ce7263 --- /dev/null +++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminPermissionInfo.java @@ -0,0 +1,48 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.cloudbeaver.service.admin; + +import io.cloudbeaver.registry.WebPermissionDescriptor; + +/** + * Web permission ID + */ +public class AdminPermissionInfo { + + private final WebPermissionDescriptor permission; + + public AdminPermissionInfo(WebPermissionDescriptor permission) { + this.permission = permission; + } + + public String getId() { + return permission.getId(); + } + + public String getLabel() { + return permission.getLabel(); + } + + public String getDescription() { + return permission.getDescription(); + } + + public String getCategory() { + return permission.getCategory(); + } + +} diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/AdminPermissions.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminPermissions.java similarity index 94% rename from server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/AdminPermissions.java rename to server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminPermissions.java index 80e3b6754e..421cf175e9 100644 --- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/AdminPermissions.java +++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminPermissions.java @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.cloudbeaver.service.admin.impl; +package io.cloudbeaver.service.admin; /** * Web service implementation diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminRoleInfo.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminRoleInfo.java new file mode 100644 index 0000000000..19153ccf81 --- /dev/null +++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminRoleInfo.java @@ -0,0 +1,50 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.cloudbeaver.service.admin; + +import io.cloudbeaver.model.user.WebRole; + +import java.util.List; + +/** + * Web role info + */ +public class AdminRoleInfo { + + private final WebRole role; + private List rolePermissions; + + public AdminRoleInfo(WebRole role) { + this.role = role; + } + + public String getRoleId() { + return role.getRoleId(); + } + + public String getRoleName() { + return role.getName(); + } + + public List getRolePermissions() { + return rolePermissions; + } + + public void setRolePermissions(List rolePermissions) { + this.rolePermissions = rolePermissions; + } +} diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminUserInfo.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminUserInfo.java new file mode 100644 index 0000000000..76d99b1645 --- /dev/null +++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/AdminUserInfo.java @@ -0,0 +1,60 @@ +/* + * DBeaver - Universal Database Manager + * Copyright (C) 2010-2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.cloudbeaver.service.admin; + +import io.cloudbeaver.model.user.WebRole; +import io.cloudbeaver.model.user.WebUser; +import io.cloudbeaver.server.CBPlatform; +import org.jkiss.dbeaver.model.exec.DBCException; + +import java.util.Map; + +/** + * Web user info + */ +public class AdminUserInfo { + + private final WebUser user; + + private Map metaParameters; + private Map configurationParameters; + + public AdminUserInfo(WebUser user) { + this.user = user; + } + + public String getUserId() { + return user.getUserId(); + } + + public Map getMetaParameters() { + return metaParameters; + } + + public Map getConfigurationParameters() { + return configurationParameters; + } + + public String[] getGrantedRoles() throws DBCException { + if (user.getRoles() == null) { + WebRole[] userRoles = CBPlatform.getInstance().getApplication().getSecurityController().getUserRoles(getUserId()); + user.setRoles(userRoles); + } + return user.getGrantedRoles(); + } + +} diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java index bef386e598..161379e8e6 100644 --- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java +++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/DBWServiceAdmin.java @@ -17,11 +17,56 @@ package io.cloudbeaver.service.admin; import io.cloudbeaver.DBWService; +import io.cloudbeaver.DBWebException; +import io.cloudbeaver.WebAction; +import io.cloudbeaver.model.session.WebSession; +import org.jkiss.code.NotNull; +import org.jkiss.code.Nullable; + +import java.util.List; +import java.util.Map; /** * Web service API */ public interface DBWServiceAdmin extends DBWService { + @WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN) + @NotNull + List listUsers(@NotNull WebSession webSession, @Nullable String userName) throws DBWebException; + + @WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN) + @NotNull + List listRoles(@NotNull WebSession webSession, @Nullable String roleName) throws DBWebException; + + @WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN) + @NotNull + List listPermissions(@NotNull WebSession webSession) throws DBWebException; + + @WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN) + @NotNull + AdminUserInfo createUser(@NotNull WebSession webSession, String userName) throws DBWebException; + + @WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN) + boolean deleteUser(@NotNull WebSession webSession, String userName) throws DBWebException; + + @WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN) + @NotNull + AdminRoleInfo createRole(@NotNull WebSession webSession, String roleId) throws DBWebException; + + @WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN) + boolean deleteRole(@NotNull WebSession webSession, String roleId) throws DBWebException; + + @WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN) + boolean grantUserRole(@NotNull WebSession webSession, String user, String role) throws DBWebException; + + @WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN) + boolean revokeUserRole(@NotNull WebSession webSession, String user, String role) throws DBWebException; + + @WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN) + boolean setRolePermissions(@NotNull WebSession webSession, String roleID, String[] permissions) throws DBWebException; + + @WebAction(requirePermissions = AdminPermissions.PERMISSION_ADMIN) + boolean setUserCredentials(@NotNull WebSession webSession, @NotNull String userID, @NotNull String providerId, @NotNull Map credentials) throws DBWebException; } diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java index 675e0c2052..b168be562b 100644 --- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java +++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/WebServiceBindingAdmin.java @@ -16,7 +16,6 @@ */ package io.cloudbeaver.service.admin; -import graphql.schema.idl.TypeDefinitionRegistry; import io.cloudbeaver.DBWebException; import io.cloudbeaver.service.DBWBindingContext; import io.cloudbeaver.service.WebServiceBindingBase; @@ -35,10 +34,29 @@ public class WebServiceBindingAdmin extends WebServiceBindingBase { - throw new DBWebException("Not implemented"); - }); + model.getQueryType().dataFetcher("listUsers", + env -> getService(env).listUsers(getWebSession(env), env.getArgument("userId"))); + model.getQueryType().dataFetcher("listRoles", + env -> getService(env).listRoles(getWebSession(env), env.getArgument("roleId"))); + model.getQueryType().dataFetcher("listPermissions", + env -> getService(env).listPermissions(getWebSession(env))); + model.getQueryType().dataFetcher("createUser", + env -> getService(env).createUser(getWebSession(env), env.getArgument("userId"))); + model.getQueryType().dataFetcher("deleteUser", + env -> getService(env).deleteUser(getWebSession(env), env.getArgument("userId"))); + model.getQueryType().dataFetcher("createRole", + env -> getService(env).createRole(getWebSession(env), env.getArgument("roleId"))); + model.getQueryType().dataFetcher("deleteRole", + env -> getService(env).deleteRole(getWebSession(env), env.getArgument("roleId"))); + model.getQueryType().dataFetcher("grantUserRole", + env -> getService(env).grantUserRole(getWebSession(env), env.getArgument("userId"), env.getArgument("roleId"))); + model.getQueryType().dataFetcher("revokeUserRole", + env -> getService(env).revokeUserRole(getWebSession(env), env.getArgument("userId"), env.getArgument("roleId"))); + model.getQueryType().dataFetcher("setRolePermissions", + env -> getService(env).setRolePermissions(getWebSession(env), env.getArgument("roleId"), env.getArgument("permissions"))); + model.getQueryType().dataFetcher("setUserCredentials", + env -> getService(env).setUserCredentials(getWebSession(env), env.getArgument("userId"), env.getArgument("providerId"), env.getArgument("credentials"))); } } diff --git a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java index abad8d9fdf..b8a3990bd1 100644 --- a/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java +++ b/server/bundles/io.cloudbeaver.service.admin/src/io/cloudbeaver/service/admin/impl/WebServiceAdmin.java @@ -16,7 +16,28 @@ */ package io.cloudbeaver.service.admin.impl; +import io.cloudbeaver.DBWebException; +import io.cloudbeaver.auth.provider.local.LocalAuthProvider; +import io.cloudbeaver.model.session.WebSession; +import io.cloudbeaver.model.user.WebRole; +import io.cloudbeaver.model.user.WebUser; +import io.cloudbeaver.registry.WebAuthProviderDescriptor; +import io.cloudbeaver.registry.WebPermissionDescriptor; +import io.cloudbeaver.registry.WebServiceDescriptor; +import io.cloudbeaver.registry.WebServiceRegistry; +import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.service.admin.AdminPermissionInfo; +import io.cloudbeaver.service.admin.AdminRoleInfo; +import io.cloudbeaver.service.admin.AdminUserInfo; import io.cloudbeaver.service.admin.DBWServiceAdmin; +import org.jkiss.code.NotNull; +import org.jkiss.utils.ArrayUtils; +import org.jkiss.utils.CommonUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; /** * Web service implementation @@ -24,4 +45,179 @@ import io.cloudbeaver.service.admin.DBWServiceAdmin; public class WebServiceAdmin implements DBWServiceAdmin { + @NotNull + @Override + public List listUsers(@NotNull WebSession webSession, String userName) throws DBWebException { + try { + List webUsers = new ArrayList<>(); + for (WebUser user : CBPlatform.getInstance().getApplication().getSecurityController().findUsers(userName)) { + webUsers.add(new AdminUserInfo(user)); + } + return webUsers; + } catch (Exception e) { + throw new DBWebException("Error reading users", e); + } + } + + @NotNull + @Override + public List listRoles(@NotNull WebSession webSession, String roleName) throws DBWebException { + try { + List webUsers = new ArrayList<>(); + for (WebRole role : CBPlatform.getInstance().getApplication().getSecurityController().findRoles(roleName)) { + webUsers.add(new AdminRoleInfo(role)); + } + return webUsers; + } catch (Exception e) { + throw new DBWebException("Error reading users", e); + } + } + + @NotNull + @Override + public List listPermissions(@NotNull WebSession webSession) throws DBWebException { + try { + List permissionInfos = new ArrayList<>(); + for (WebServiceDescriptor wsd : WebServiceRegistry.getInstance().getWebServices()) { + for (WebPermissionDescriptor pd : wsd.getPermissions()) { + permissionInfos.add(new AdminPermissionInfo(pd)); + } + } + return permissionInfos; + } catch (Exception e) { + throw new DBWebException("Error reading users", e); + } + } + + @NotNull + @Override + public AdminUserInfo createUser(@NotNull WebSession webSession, String userName) throws DBWebException { + if (userName.isEmpty()) { + throw new DBWebException("Empty user name"); + } + try { + WebUser newUser = new WebUser(userName); + CBPlatform.getInstance().getApplication().getSecurityController().createUser(newUser); + return new AdminUserInfo(newUser); + } catch (Exception e) { + throw new DBWebException("Error creating new user", e); + } + } + + @Override + public boolean deleteUser(@NotNull WebSession webSession, String userName) throws DBWebException { + if (CommonUtils.equalObjects(userName, webSession.getUser().getUserId())) { + throw new DBWebException("You cannot delete yourself"); + } + try { + CBPlatform.getInstance().getApplication().getSecurityController().deleteUser(userName); + return true; + } catch (Exception e) { + throw new DBWebException("Error deleting user", e); + } + } + + @NotNull + @Override + public AdminRoleInfo createRole(@NotNull WebSession webSession, String roleId) throws DBWebException { + if (roleId.isEmpty()) { + throw new DBWebException("Empty role ID"); + } + try { + WebRole newRole = new WebRole(roleId); + CBPlatform.getInstance().getApplication().getSecurityController().createRole(newRole); + return new AdminRoleInfo(newRole); + } catch (Exception e) { + throw new DBWebException("Error creating new role", e); + } + } + + @Override + public boolean deleteRole(@NotNull WebSession webSession, String roleId) throws DBWebException { + try { + WebRole[] userRoles = CBPlatform.getInstance().getApplication().getSecurityController().getUserRoles(webSession.getUser().getUserId()); + if (Arrays.stream(userRoles).anyMatch(webRole -> webRole.getRoleId().equals(roleId))) { + throw new DBWebException("You can not delete your own role"); + } + CBPlatform.getInstance().getApplication().getSecurityController().deleteRole(roleId); + return true; + } catch (Exception e) { + throw new DBWebException("Error deleting role", e); + } + } + + @Override + public boolean grantUserRole(@NotNull WebSession webSession, String user, String role) throws DBWebException { + WebUser grantor = webSession.getUser(); + if (grantor == null) { + throw new DBWebException("Cannot grant role in anonymous mode"); + } + try { + WebRole[] userRoles = CBPlatform.getInstance().getApplication().getSecurityController().getUserRoles(user); + String[] roleIds = Arrays.stream(userRoles).map(WebRole::getRoleId).toArray(String[]::new); + if (!ArrayUtils.contains(roleIds, role)) { + roleIds = ArrayUtils.add(String.class, roleIds, role); + CBPlatform.getInstance().getApplication().getSecurityController().setUserRoles(user, roleIds, grantor.getUserId()); + } else { + throw new DBWebException("User '" + user + "' already has role '" + role + "'"); + } + return true; + } catch (Exception e) { + throw new DBWebException("Error granting role", e); + } + } + + @Override + public boolean revokeUserRole(@NotNull WebSession webSession, String user, String role) throws DBWebException { + WebUser grantor = webSession.getUser(); + if (grantor == null) { + throw new DBWebException("Cannot grant role in anonymous mode"); + } + try { + WebRole[] userRoles = CBPlatform.getInstance().getApplication().getSecurityController().getUserRoles(user); + String[] roleIds = Arrays.stream(userRoles).map(WebRole::getRoleId).toArray(String[]::new); + if (ArrayUtils.contains(roleIds, role)) { + roleIds = ArrayUtils.remove(String.class, roleIds, role); + CBPlatform.getInstance().getApplication().getSecurityController().setUserRoles(user, roleIds, grantor.getUserId()); + } else { + throw new DBWebException("User '" + user + "' doesn't have role '" + role + "'"); + } + return true; + } catch (Exception e) { + throw new DBWebException("Error revoking role", e); + } + } + + @Override + public boolean setRolePermissions(@NotNull WebSession webSession, String roleID, String[] permissions) throws DBWebException { + WebUser grantor = webSession.getUser(); + if (grantor == null) { + throw new DBWebException("Cannot change permissions in anonymous mode"); + } + try { + CBPlatform.getInstance().getApplication().getSecurityController().setSubjectPermissions(roleID, permissions, grantor.getUserId()); + return true; + } catch (Exception e) { + throw new DBWebException("Error setting role permissions", e); + } + } + + @Override + public boolean setUserCredentials(@NotNull WebSession webSession, @NotNull String userID, @NotNull String providerId, @NotNull Map credentials) throws DBWebException { + WebAuthProviderDescriptor authProvider = WebServiceRegistry.getInstance().getAuthProvider(providerId); + if (authProvider == null) { + throw new DBWebException("Invalid auth provider '" + providerId + "'"); + } + // Check userId credential. + // FIXME: It is actually a hack. All crdentials must be passed from client + if (LocalAuthProvider.PROVIDER_ID.equals(providerId)) { + credentials.put(LocalAuthProvider.CRED_USER, userID); + } + try { + CBPlatform.getInstance().getApplication().getSecurityController().setUserCredentials(userID, authProvider, credentials); + return true; + } catch (Exception e) { + throw new DBWebException("Error setting user credentials", e); + } + } } diff --git a/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF index 95bfd184a6..cc8d12467b 100644 --- a/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.auth/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: io.cloudbeaver.service.auth;singleton:=true -Bundle-Version: 1.0.1.qualifier -Bundle-Release-Date: 20200518 +Bundle-Version: 1.0.2.qualifier +Bundle-Release-Date: 20200601 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . diff --git a/server/bundles/io.cloudbeaver.service.auth/pom.xml b/server/bundles/io.cloudbeaver.service.auth/pom.xml index ea685d8ade..d0c83bc843 100644 --- a/server/bundles/io.cloudbeaver.service.auth/pom.xml +++ b/server/bundles/io.cloudbeaver.service.auth/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.auth - 1.0.1-SNAPSHOT + 1.0.2-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebServiceBindingAuth.java b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebServiceBindingAuth.java index df9f3935e5..0274772fed 100644 --- a/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebServiceBindingAuth.java +++ b/server/bundles/io.cloudbeaver.service.auth/src/io/cloudbeaver/service/auth/WebServiceBindingAuth.java @@ -36,14 +36,14 @@ public class WebServiceBindingAuth extends WebServiceBindingBase public void bindWiring(DBWBindingContext model) throws DBWebException { model.getQueryType() .dataFetcher("authLogin", env -> getService(env).authLogin( - getWebSession(env), + getWebSession(env, false), env.getArgument("provider"), env.getArgument("credentials"))) .dataFetcher("authLogout", env -> { getService(env).authLogout(getWebSession(env)); return true; }) - .dataFetcher("sessionUser", env -> getService(env).sessionUser(getWebSession(env))) + .dataFetcher("sessionUser", env -> getService(env).sessionUser(getWebSession(env, false))) .dataFetcher("authProviders", env -> getService(env).getAuthProviders(getWebSession(env))) ; diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF index bab8d01f1e..b74dd45e52 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.data.transfer/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: io.cloudbeaver.service.data.transfer;singleton:=true -Bundle-Version: 1.0.2.qualifier -Bundle-Release-Date: 20200518 +Bundle-Version: 1.0.3.qualifier +Bundle-Release-Date: 20200601 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml b/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml index 8a16f4af0e..97e116aa31 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml +++ b/server/bundles/io.cloudbeaver.service.data.transfer/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.data.transfer - 1.0.2-SNAPSHOT + 1.0.3-SNAPSHOT eclipse-plugin diff --git a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java index ac90b8d9b2..93499f3adb 100644 --- a/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java +++ b/server/bundles/io.cloudbeaver.service.data.transfer/src/io/cloudbeaver/service/data/transfer/impl/WebServiceDataTransfer.java @@ -17,13 +17,12 @@ package io.cloudbeaver.service.data.transfer.impl; import io.cloudbeaver.DBWebException; -import io.cloudbeaver.server.CBPlatform; import io.cloudbeaver.model.WebAsyncTaskInfo; import io.cloudbeaver.model.session.WebSession; +import io.cloudbeaver.server.CBPlatform; +import io.cloudbeaver.service.data.transfer.DBWServiceDataTransfer; import io.cloudbeaver.service.sql.WebSQLContextInfo; import io.cloudbeaver.service.sql.WebSQLProcessor; -import io.cloudbeaver.service.data.transfer.DBWServiceDataTransfer; -import io.cloudbeaver.service.sql.WebSQLQueryDataContainer; import io.cloudbeaver.service.sql.WebSQLResultsInfo; import org.jkiss.code.NotNull; import org.jkiss.dbeaver.DBException; @@ -102,7 +101,7 @@ public class WebServiceDataTransfer implements DBWServiceDataTransfer { @NotNull private String makeUniqueFileName(WebSQLProcessor sqlProcessor, DataTransferProcessorDescriptor processor) { - return sqlProcessor.getWebSession().getId() + "_" + UUID.randomUUID() + "." + WebDataTransferUtils.getProcessorFileExtension(processor); + return sqlProcessor.getWebSession().getSessionId() + "_" + UUID.randomUUID() + "." + WebDataTransferUtils.getProcessorFileExtension(processor); } @Override diff --git a/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF b/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF index a347f9ea96..1947500e81 100644 --- a/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF +++ b/server/bundles/io.cloudbeaver.service.metadata/META-INF/MANIFEST.MF @@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2 Bundle-Vendor: %Bundle-Vendor Bundle-Name: %Bundle-Name Bundle-SymbolicName: io.cloudbeaver.service.metadata;singleton:=true -Bundle-Version: 1.0.5.qualifier -Bundle-Release-Date: 20200518 +Bundle-Version: 1.0.6.qualifier +Bundle-Release-Date: 20200601 Bundle-RequiredExecutionEnvironment: JavaSE-1.8 Bundle-ActivationPolicy: lazy Bundle-ClassPath: . diff --git a/server/bundles/io.cloudbeaver.service.metadata/pom.xml b/server/bundles/io.cloudbeaver.service.metadata/pom.xml index aedd24b2a9..68fd16998d 100644 --- a/server/bundles/io.cloudbeaver.service.metadata/pom.xml +++ b/server/bundles/io.cloudbeaver.service.metadata/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.service.metadata - 1.0.5-SNAPSHOT + 1.0.6-SNAPSHOT eclipse-plugin diff --git a/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml b/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml index 29d075422c..cc05c4ab33 100644 --- a/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml +++ b/server/features/io.cloudbeaver.ce.drivers.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml b/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml index 09d28e17e2..9d4892f8c5 100644 --- a/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml +++ b/server/features/io.cloudbeaver.ce.drivers.feature/pom.xml @@ -9,6 +9,6 @@ ../ io.cloudbeaver.ce.drivers.feature - 1.0.25-SNAPSHOT + 1.0.26-SNAPSHOT eclipse-feature diff --git a/server/features/io.cloudbeaver.product.ce.feature/feature.xml b/server/features/io.cloudbeaver.product.ce.feature/feature.xml index 8b33063068..0fa316710e 100644 --- a/server/features/io.cloudbeaver.product.ce.feature/feature.xml +++ b/server/features/io.cloudbeaver.product.ce.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/server/features/io.cloudbeaver.product.ce.feature/pom.xml b/server/features/io.cloudbeaver.product.ce.feature/pom.xml index 5ff95b3e72..303e7edc02 100644 --- a/server/features/io.cloudbeaver.product.ce.feature/pom.xml +++ b/server/features/io.cloudbeaver.product.ce.feature/pom.xml @@ -10,7 +10,7 @@ ../ io.cloudbeaver.product.ce.feature - 1.0.0-SNAPSHOT + 1.0.1-SNAPSHOT eclipse-feature diff --git a/server/features/io.cloudbeaver.sample.feature/feature.xml b/server/features/io.cloudbeaver.sample.feature/feature.xml index d21b87de0c..f0ee0bac23 100644 --- a/server/features/io.cloudbeaver.sample.feature/feature.xml +++ b/server/features/io.cloudbeaver.sample.feature/feature.xml @@ -2,7 +2,7 @@ diff --git a/server/features/io.cloudbeaver.sample.feature/pom.xml b/server/features/io.cloudbeaver.sample.feature/pom.xml index 9f99ebdd1a..8d691ebc5c 100644 --- a/server/features/io.cloudbeaver.sample.feature/pom.xml +++ b/server/features/io.cloudbeaver.sample.feature/pom.xml @@ -9,6 +9,6 @@ ../ io.cloudbeaver.sample.feature - 1.0.5-SNAPSHOT + 1.0.6-SNAPSHOT eclipse-feature diff --git a/webapp/.eslintrc.js b/webapp/.eslintrc.js index 6ea94b8645..dc2abd4303 100644 --- a/webapp/.eslintrc.js +++ b/webapp/.eslintrc.js @@ -106,7 +106,9 @@ module.exports = { 'import/export': 'off', 'import/extensions': 'off', 'import/no-unresolved': 'off', - 'import/no-extraneous-dependencies': 'warn', + // import/no-extraneous-dependencies off because peer dependencies are moved to builder + // todo probably there is a way to tune this (see packageDir option in documentation) + 'import/no-extraneous-dependencies': 'off', 'import/prefer-default-export': 'off', 'import/no-cycle': 'off', 'import-helpers/order-imports': [ diff --git a/webapp/configs/babel-rollup.config.js b/webapp/configs/babel-rollup.config.js deleted file mode 100644 index 04f99be204..0000000000 --- a/webapp/configs/babel-rollup.config.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - presets: [ - '@babel/preset-react', - ], - plugins: [ - '@babel/plugin-syntax-dynamic-import', - 'react-require', - 'reshadow/babel', - ], -} diff --git a/webapp/configs/babel.config.js b/webapp/configs/babel.config.js deleted file mode 100644 index aa436143dd..0000000000 --- a/webapp/configs/babel.config.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - presets: [ - "@babel/preset-env", - "@babel/preset-react", - ['@babel/preset-typescript', { isTSX: true, allExtensions: true }], - ], - plugins: [ - '@babel/plugin-transform-runtime', - '@babel/plugin-syntax-dynamic-import', - 'babel-plugin-transform-typescript-metadata', - '@babel/plugin-proposal-optional-chaining', - ['@babel/plugin-proposal-decorators', { legacy: true }], - ['@babel/plugin-proposal-class-properties', { loose: true }], - 'react-require', - 'reshadow/babel', - ], -} diff --git a/webapp/configs/rollup.config.js b/webapp/configs/rollup.config.js deleted file mode 100644 index cfbfa955e0..0000000000 --- a/webapp/configs/rollup.config.js +++ /dev/null @@ -1,81 +0,0 @@ -import babelPlugin from 'rollup-plugin-babel'; -const path = require('path'); -import postcssPlugin from 'rollup-plugin-postcss'; -import nodeResolve from 'rollup-plugin-node-resolve'; -import commonjs from 'rollup-plugin-commonjs'; -import peerDepsExternal from 'rollup-plugin-peer-deps-external'; -import includePaths from 'rollup-plugin-includepaths'; -import typescriptPlugin from 'rollup-plugin-typescript2'; - -const includePathOptions = { - include: {}, - paths: ['src'], - external: [ - - ], - extensions: ['.ts', '.tsx', '.js'] -}; - -export const defaultBuilderOptions = { - babelConfig: path.join(__dirname, './babel-rollup.config.js'), - typescriptConfig: '', // tbd -} - -export function configBuilder(options = defaultBuilderOptions) { - - return { - input: 'src/index.ts', - output: [ - { - dir: 'dist', - format: 'esm', - }, - ], - external: [ - // externals beyond peer dependencies - ], - plugins: [ - includePaths(includePathOptions), - nodeResolve(), - commonjs({ - sourceMap: false, - }), - typescriptPlugin({ - tsconfig: 'tsconfig.build.json', - useTsconfigDeclarationDir: true, - }), - babelPlugin({ - exclude: 'node_modules/**', - extensions: ['.js', '.ts', '.tsx'], - configFile: options.babelConfig, - }), - postcssPlugin({ - extract: false, - // enable CSS modules for .module.css .module.scss files - autoModules: true, - // modules: { - // generateScopedName: "[local]___[hash:base64:5]" - // }, - inject: true, - use: { - sass: { - includePaths: ['node_modules', '../../node_modules'], - } - }, - // this option is added in dkrupenya/rollup-plugin-postcss#develop - // todo to be converted to custom loader - firstPlugin: require('reshadow/postcss'), - plugins: [ - require('postcss-preset-env')({ stage: 0 }), - require('postcss-discard-comments'), - // todo move 'reshadow/postcss' to custom loader to run it before postcss-loader - // require('reshadow/postcss'), - ] - }), - peerDepsExternal(), - ], - }; - -} - -export default configBuilder(defaultBuilderOptions); diff --git a/webapp/configs/webpack/build-plugin.js b/webapp/configs/webpack/build-plugin.js deleted file mode 100644 index df115404ab..0000000000 --- a/webapp/configs/webpack/build-plugin.js +++ /dev/null @@ -1,23 +0,0 @@ -const merge = require('webpack-merge'); -const {resolve} = require('path'); -var PeerDepsExternalsPlugin = require('peer-deps-externals-webpack-plugin'); - -const commonConfig = require('./common'); - -module.exports = (env, argv) => merge(commonConfig(env, argv), { - mode: argv.mode || 'development', - entry: resolve(__dirname, '../../src/index.ts'), // todo - output: { - filename: 'index.js', - path: resolve(__dirname, '../../dist'), - library: 'basicConnectionPlugin', // todo pass from package.js - libraryTarget: 'umd', - }, - externals: [ - /^@dbeaver\/.+$/ - ], - devtool: 'source-map', - plugins: [ - new PeerDepsExternalsPlugin(), // allow to treat all peerDependencies as externals - ], -}); diff --git a/webapp/configs/webpack/common.js b/webapp/configs/webpack/common.js deleted file mode 100644 index becb4f9072..0000000000 --- a/webapp/configs/webpack/common.js +++ /dev/null @@ -1,187 +0,0 @@ -// shared config (dev and prod) -const webpack = require('webpack'); -const ModuleDependencyWarning = require("webpack/lib/ModuleDependencyWarning"); -const path = require('path'); -const CircularDependencyPlugin = require('circular-dependency-plugin'); -const MiniCssExtractPlugin = require('mini-css-extract-plugin'); - - -// Temporary solution to remove wrong warning messages (it's was fixed https://github.com/microsoft/TypeScript/pull/35200 in typescript 3.8) -class IgnoreNotFoundExportPlugin { - apply(compiler) { - const messageRegExp = /export '.*'( \(reexported as '.*'\))? was not found in/ - function doneHook(stats) { - stats.compilation.warnings = stats.compilation.warnings.filter(function (warn) { - if (warn instanceof ModuleDependencyWarning && messageRegExp.test(warn.message)) { - return false - } - return true; - }) - } - if (compiler.hooks) { - compiler.hooks.done.tap("IgnoreNotFoundExportPlugin", doneHook) - } else { - compiler.plugin("done", doneHook) - } - } -} - -module.exports = (env, argv) => { - - function generateStyleLoaders(options = { hasModule: false }) { - const moduleScope = options.hasModule ? 'local' : 'global'; - const modules = { - mode: moduleScope, - localIdentName: '[local]___[hash:base64:5]', - }; - - const postCssPlugins = [ - require('postcss-preset-env')({ stage: 0 }), - require('@csstools/postcss-sass')({ - includePaths: ['node_modules', path.resolve('../../node_modules')], - }), - require('postcss-discard-comments'), - require('reshadow/postcss')({ scopeBehaviour: moduleScope }) - ]; - - // 'use' clause in webpack rules - return [ - { - loader: MiniCssExtractPlugin.loader, - options: { - hot: argv.mode !== 'production', - }, - }, - { - loader: 'css-loader', - options: { - importLoaders: 1, - modules: modules, - } - }, - { - loader: 'postcss-loader', - options: { - syntax: 'postcss-scss', - plugins: postCssPlugins, - }, - }, - ]; - } - - return { - resolve: { - extensions: ['.ts', '.tsx', '.js', '.jsx'], - }, - module: { - rules: [ - { - test: /\.js$/, - use: [ - { - loader: 'babel-loader', - options: { - configFile: path.join(__dirname, '../babel.config.js') - }, - }, - 'source-map-loader' - ], - exclude: /node_modules/, - }, - { - test: /\.tsx?$/, - use: [ - { - loader: 'babel-loader', - options: { - configFile: path.join(__dirname, '../babel.config.js') - }, - }, - { - loader: 'eslint-loader', - // uncomment to fix after rule changes - // options: { - // fix: true, - // }, - } - ], - }, - { - test: /\.(css|scss|sass)$/, - oneOf: [ - // css-module files ( should have *.module mask ) - { - test: /\.module\.(css|scss|sass)$/, - use: generateStyleLoaders({ hasModule: true }), - }, - { - include: /node_modules/, - use: [ - { - loader: MiniCssExtractPlugin.loader, - options: { - hot: argv.mode !== 'production', - }, - }, - 'css-loader', - ] - }, - { - use: generateStyleLoaders({ hasModule: false }), - } - ] - }, - { - test: /\.(png|jpe?g|gif|svg|eot|ttf|woff|woff2)$/i, - loader: 'url-loader', - options: { - limit: 8192, - }, - }, - ], - }, - optimization: { - minimize: false, - namedModules: true, - concatenateModules: false, - }, - plugins: [ - new IgnoreNotFoundExportPlugin(), - new webpack.ProgressPlugin({ - entries: true, - modules: true, - modulesCount: 100, - profile: true, - handler: (percentage, message, ...args) => { - // custom logic - } - }), - new CircularDependencyPlugin({ - // exclude detection of files based on a RegExp - exclude: /a\.js|node_modules/, - // include specific files based on a RegExp - // include: /dir/, - // add errors to webpack instead of warnings - failOnError: false, - // allow import cycles that include an asyncronous import, - // e.g. via import(/* webpackMode: "weak" */ './file.js') - allowAsyncCycles: false, - // set the current working directory for displaying module paths - cwd: process.cwd(), - }), - new MiniCssExtractPlugin({ - // Options similar to the same options in webpackOptions.output - // all options are optional - filename: argv.mode !== 'production' ? '[name].css' : '[name].[hash].css', - chunkFilename: argv.mode !== 'production' ? '[name].css' : '[name].[hash].css', - ignoreOrder: false, // Enable to remove warnings about conflicting order - }), - // new webpack.optimize.LimitChunkCountPlugin({ - // maxChunks: 1, - // }), - ], - performance: { - hints: false, - }, - }; -}; diff --git a/webapp/package.json b/webapp/package.json index 96e895b061..1a5d64cce3 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -16,6 +16,7 @@ "build": "lerna run build --stream", "serve": "lerna run serve --stream", "serve-plugin": "lerna run serve-plugin --stream --parallel", + "builder-help": "builder help", "clean-dist": "lerna run clean-dist --stream", "test": "echo \"Error: no test specified\" && exit 1" }, @@ -23,10 +24,13 @@ "@babel/runtime": "7.8.4" }, "devDependencies": { - "@types/jest": "^24.0.23", - "@types/node": "^12.7.8", - "@types/react": "^16.9.34", - "@types/react-dom": "^16.9.6", + "@graphql-codegen/add": "^1.8.1", + "@graphql-codegen/cli": "^1.8.1", + "@graphql-codegen/near-operation-file-preset": "^1.8.0", + "@graphql-codegen/typescript": "^1.8.1", + "@graphql-codegen/typescript-graphql-files-modules": "^1.8.0", + "@graphql-codegen/typescript-graphql-request": "^1.8.1", + "@graphql-codegen/typescript-operations": "^1.8.1", "@typescript-eslint/eslint-plugin": "^2.5.0", "@typescript-eslint/parser": "^2.8.0", "eslint": "^6.6.0", diff --git a/webapp/packages/_plugin-template/package.json b/webapp/packages/_plugin-template/package.json index 9be06fb3cd..1aba88462e 100644 --- a/webapp/packages/_plugin-template/package.json +++ b/webapp/packages/_plugin-template/package.json @@ -6,22 +6,16 @@ "main": "dist/index.js", "module": "dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "clean-dist": "rimraf dist/*", "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { - "@dbeaver/core": "^0.1.0" + "@dbeaver/core": "^0.1.0", + "@dbeaver/builder": "^0.1.0" }, "peerDependencies": { - "@dbeaver/core": "^0.1.0", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.77", - "rxjs": "^6.5.5" + "@dbeaver/core": "^0.1.0" } } diff --git a/webapp/packages/_plugin-template/tsconfig.build.json b/webapp/packages/_plugin-template/tsconfig.build.json deleted file mode 100644 index dd700023ea..0000000000 --- a/webapp/packages/_plugin-template/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules", - "@dbeaver/**" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/_plugin-template/tsconfig.json b/webapp/packages/_plugin-template/tsconfig.json index 6b4c45f333..26d254ccf5 100644 --- a/webapp/packages/_plugin-template/tsconfig.json +++ b/webapp/packages/_plugin-template/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, "include": [ "src" ], diff --git a/webapp/packages/administration/locales/en.json b/webapp/packages/administration/locales/en.json new file mode 100644 index 0000000000..f28d8def9f --- /dev/null +++ b/webapp/packages/administration/locales/en.json @@ -0,0 +1,4 @@ +{ + "administration_menu_enter": "Administration", + "administration_menu_back": "Back to app" +} diff --git a/webapp/packages/administration/locales/ru.json b/webapp/packages/administration/locales/ru.json new file mode 100644 index 0000000000..c941ccbb70 --- /dev/null +++ b/webapp/packages/administration/locales/ru.json @@ -0,0 +1,4 @@ +{ + "administration_menu_enter": "Администрирование", + "administration_menu_back": "Вернуться в приложение" +} \ No newline at end of file diff --git a/webapp/packages/administration/package.json b/webapp/packages/administration/package.json index ed5bf95113..b76e961d9c 100644 --- a/webapp/packages/administration/package.json +++ b/webapp/packages/administration/package.json @@ -3,25 +3,18 @@ "version": "0.1.0", "description": "", "license": "Apache-2.0", - "main": "dist/index.js", - "types": "dist/types", + "main": "./dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "clean-dist": "rimraf dist/*", "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { - "@dbeaver/core": "^0.1.0" + "@dbeaver/core": "^0.1.0", + "@dbeaver/builder": "^0.1.0" }, "peerDependencies": { - "@dbeaver/core": "^0.1.0", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.77", - "rxjs": "^6.5.5" + "@dbeaver/core": "^0.1.0" } } diff --git a/webapp/packages/administration/src/Administration/Administration.tsx b/webapp/packages/administration/src/Administration/Administration.tsx new file mode 100644 index 0000000000..52ee816541 --- /dev/null +++ b/webapp/packages/administration/src/Administration/Administration.tsx @@ -0,0 +1,97 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; +import styled, { css } from 'reshadow'; + +import { TabsState, TabList, verticalTabStyles } from '@dbeaver/core/blocks'; +import { useController } from '@dbeaver/core/di'; +import { composes, useStyles } from '@dbeaver/core/theming'; + +import { AdministrationController } from './AdministrationController'; +import { DrawerItem } from './DrawerItem'; +import { ItemContent } from './ItemContent'; + +const tabsStyles = composes( + css` + TabList { + composes: theme-background-surface theme-text-on-surface theme-border-color-background from global; + } + Tab { + composes: theme-ripple theme-background-background theme-ripple-selectable from global; + } + `, + css` + Tab { + color: inherit; + } + ` +); + +const administrationStyles = composes( + css` + container { + composes: theme-background-surface theme-text-on-surface from global; + } + drawer { + composes: theme-border-color-background from global; + } + `, + css` + container { + display: flex; + flex-direction: row; + flex: 1; + overflow: hidden; + } + drawer { + width: 250px; + padding-top: 16px; + border-right: 2px solid; + } + content { + flex: 1; + display: flex; + flex-direction: column; + } + ` +); + +type Props = { + activeItem: string | null; + activeItemSub: string | null; + activeItemSubParam: string | null; + onItemSelect(name: string): void; +} + +export const Administration = observer(function Administration({ + activeItem, activeItemSub, activeItemSubParam, onItemSelect, +}: Props) { + const controller = useController(AdministrationController); + + return styled(useStyles(verticalTabStyles, administrationStyles, tabsStyles))( + + + + + {controller.items.map(item => ( + + ))} + + + + + + + + ); +}); diff --git a/webapp/packages/administration/src/Administration/AdministrationController.ts b/webapp/packages/administration/src/Administration/AdministrationController.ts new file mode 100644 index 0000000000..18fb3bc366 --- /dev/null +++ b/webapp/packages/administration/src/Administration/AdministrationController.ts @@ -0,0 +1,27 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { computed } from 'mobx'; + +import { injectable } from '@dbeaver/core/di'; + +import { AdministrationItemService } from '../AdministrationItem/AdministrationItemService'; + +@injectable() +export class AdministrationController { + @computed get items() { + return this.administrationItemService + .items + .concat() + .sort((a, b) => a.order - b.order); + } + + constructor( + private administrationItemService: AdministrationItemService + ) {} +} diff --git a/webapp/packages/administration/src/Administration/AdministrationTools/AdministrationTools.tsx b/webapp/packages/administration/src/Administration/AdministrationTools/AdministrationTools.tsx new file mode 100644 index 0000000000..ace1b8d424 --- /dev/null +++ b/webapp/packages/administration/src/Administration/AdministrationTools/AdministrationTools.tsx @@ -0,0 +1,28 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import styled, { css } from 'reshadow'; + +const styles = css` + administration-tools { + height: 48px; + } +`; + +type Props = React.PropsWithChildren<{ + className?: string; +}> + +export function AdministrationTools({ children, className }: Props) { + + return styled(styles)( + + {children} + + ); +} diff --git a/webapp/packages/administration/src/Administration/DrawerItem.tsx b/webapp/packages/administration/src/Administration/DrawerItem.tsx new file mode 100644 index 0000000000..5da79d3fc9 --- /dev/null +++ b/webapp/packages/administration/src/Administration/DrawerItem.tsx @@ -0,0 +1,17 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; + +import { AdministrationItemDrawerProps } from '../AdministrationItem/IAdministrationItem'; + +export const DrawerItem = observer(function DrawerItem({ item, onSelect, style }: AdministrationItemDrawerProps) { + const Component = item.getDrawerComponent(); + + return ; +}); diff --git a/webapp/packages/administration/src/Administration/ItemContent.tsx b/webapp/packages/administration/src/Administration/ItemContent.tsx new file mode 100644 index 0000000000..94b699b61b --- /dev/null +++ b/webapp/packages/administration/src/Administration/ItemContent.tsx @@ -0,0 +1,46 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; + +import { useService } from '@dbeaver/core/di'; + +import { AdministrationItemService } from '../AdministrationItem/AdministrationItemService'; + +type Props = { + activeItemName: string | null; + activeItemSub: string | null; + activeItemSubParam: string | null; +} + +export const ItemContent = observer(function ItemContent({ activeItemName, activeItemSub, activeItemSubParam }: Props) { + const administrationItemService = useService(AdministrationItemService); + + if (!activeItemName) { + return null; + } + + const item = administrationItemService.getItem(activeItemName); + + if (!item) { + return null; + } + + if (activeItemSub) { + const sub = administrationItemService.getItemSub(item, activeItemSub); + if (sub) { + const Component = sub.getComponent(); + + return ; + } + } + + const Component = item.getContentComponent(); + + return ; +}); diff --git a/webapp/packages/administration/src/AdministrationItem/AdministrationItemService.ts b/webapp/packages/administration/src/AdministrationItem/AdministrationItemService.ts new file mode 100644 index 0000000000..0a4e295f3f --- /dev/null +++ b/webapp/packages/administration/src/AdministrationItem/AdministrationItemService.ts @@ -0,0 +1,75 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observable } from 'mobx'; + +import { injectable } from '@dbeaver/core/di'; + +import { IAdministrationItem, IAdministrationItemOptions, IAdministrationItemSubItem } from './IAdministrationItem'; + +@injectable() +export class AdministrationItemService { + @observable items: IAdministrationItem[] = [] + + getDefaultItem() { + if (this.items.length === 0) { + return null; + } + + return this.items[0].name; + } + + getItem(name: string): IAdministrationItem | null { + const item = this.items.find(item => item.name === name); + if (!item) { + return null; + } + + return item; + } + + getItemSub(item: IAdministrationItem, subItem: string): IAdministrationItemSubItem | null { + const sub = item.sub.find(sub => sub.name === subItem); + if (!sub) { + return null; + } + + return sub; + } + + create(options: IAdministrationItemOptions) { + if (this.items.some(item => item.name === options.name)) { + throw new Error(`Administration item "${options.name}" already exists`); + } + + const item: IAdministrationItem = { + ...options, + sub: options.sub || [], + order: options.order || Number.MAX_SAFE_INTEGER, + }; + this.items.push(item); + } + + async activate(name: string, itemSub: string | null, param: string | null) { + const item = this.getItem(name); + if (!item) { + return; + } + + if (item.onActivate) { + await item.onActivate(); + } + + if (itemSub) { + const sub = this.getItemSub(item, itemSub); + if (sub && sub.onActivate) { + await sub.onActivate(param); + } + } + } +} diff --git a/webapp/packages/administration/src/AdministrationItem/IAdministrationItem.ts b/webapp/packages/administration/src/AdministrationItem/IAdministrationItem.ts new file mode 100644 index 0000000000..707ee5a71c --- /dev/null +++ b/webapp/packages/administration/src/AdministrationItem/IAdministrationItem.ts @@ -0,0 +1,51 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { Style } from '@dbeaver/core/theming'; + +export type AdministrationItemDrawerProps = { + item: IAdministrationItem; + onSelect(id: string): void; + style: Style[]; +} +export type AdministrationItemDrawerComponent = React.FunctionComponent + +export type AdministrationItemContentProps = { + item: IAdministrationItem; +} +export type AdministrationItemContentComponent = React.FunctionComponent + +export type AdministrationItemSubContentProps = { + item: IAdministrationItem; + sub: IAdministrationItemSubItem; + param: string | null; +} +export type AdministrationItemSubContentComponent = React.FunctionComponent + +export type AdministrationItemEvent = () => Promise | void +export type AdministrationItemSubEvent = (param: string | null) => Promise | void + +export interface IAdministrationItemSubItem { + name: string; + getComponent(): AdministrationItemSubContentComponent; + onActivate?: AdministrationItemSubEvent; +} + +export interface IAdministrationItemOptions { + name: string; + order?: number; + sub?: IAdministrationItemSubItem[]; + getDrawerComponent(): AdministrationItemDrawerComponent; + getContentComponent(): AdministrationItemContentComponent; + onActivate?: AdministrationItemEvent; +} + +export interface IAdministrationItem extends IAdministrationItemOptions { + order: number; + sub: IAdministrationItemSubItem[]; +} diff --git a/webapp/packages/administration/src/AdministrationMenuService.ts b/webapp/packages/administration/src/AdministrationMenuService.ts index 0412c5cc0b..629be48fb4 100644 --- a/webapp/packages/administration/src/AdministrationMenuService.ts +++ b/webapp/packages/administration/src/AdministrationMenuService.ts @@ -6,28 +6,45 @@ * you may not use this file except in compliance with the License. */ -import { SettingsMenuService } from '@dbeaver/core/app'; -import { injectable } from '@dbeaver/core/di'; +import { SettingsMenuService, ScreenService, AppScreenService } from '@dbeaver/core/app'; +import { injectable, Bootstrap } from '@dbeaver/core/di'; import { PermissionsService } from '@dbeaver/core/root'; -export const ADMINISTRATION_PERMISSION = 'admin'; +import { AdministrationScreenService } from './AdministrationScreen/AdministrationScreenService'; +import { EAdminPermission } from './EAdminPermission'; @injectable() -export class AdministrationMenuService { - static administrationMenuToken = 'administrationMenu'; +export class AdministrationMenuService extends Bootstrap { constructor( private settingsMenuService: SettingsMenuService, private permissionsService: PermissionsService, - ) { } + private screenService: ScreenService, + private administrationScreenService: AdministrationScreenService, + private appScreenService: AppScreenService + ) { + super(); + } - register() { + bootstrap() { this.settingsMenuService.addMenuItem( SettingsMenuService.settingsMenuToken, { - id: AdministrationMenuService.administrationMenuToken, + id: 'administrationMenuEnter', order: 0, - isHidden: () => !this.permissionsService.has(ADMINISTRATION_PERMISSION), + isHidden: () => !this.permissionsService.has(EAdminPermission.admin) + || this.screenService.isActive(AdministrationScreenService.screenName), title: 'administration_menu_enter', + onClick: () => this.administrationScreenService.navigateToRoot(), + } + ); + this.settingsMenuService.addMenuItem( + SettingsMenuService.settingsMenuToken, + { + id: 'administrationMenuBack', + order: 0, + isHidden: () => !this.screenService.isActive(AdministrationScreenService.screenName), + title: 'administration_menu_back', + onClick: () => this.appScreenService.navigateToRoot(), } ); } diff --git a/webapp/packages/administration/src/AdministrationScreen/AdministrationScreen.tsx b/webapp/packages/administration/src/AdministrationScreen/AdministrationScreen.tsx new file mode 100644 index 0000000000..6bc5dd8c4e --- /dev/null +++ b/webapp/packages/administration/src/AdministrationScreen/AdministrationScreen.tsx @@ -0,0 +1,43 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; +import { useCallback } from 'react'; + +import { useService } from '@dbeaver/core/di'; +import { Translate } from '@dbeaver/core/localization'; +import { usePermission } from '@dbeaver/core/root'; + +import { Administration } from '../Administration/Administration'; +import { EAdminPermission } from '../EAdminPermission'; +import { AdministrationScreenService } from './AdministrationScreenService'; +import { AdministrationTopAppBar } from './AdministrationTopAppBar/AdministrationTopAppBar'; + +export const AdministrationScreen = observer(function AdministrationScreen() { + const administrationScreenService = useService(AdministrationScreenService); + if (!usePermission(EAdminPermission.admin)) { + return ; + } + + const handleSelect = useCallback( + (item: string) => administrationScreenService.navigateToItem(item), + [administrationScreenService] + ); + + return ( + <> + + + + ); +}); diff --git a/webapp/packages/administration/src/AdministrationScreen/AdministrationScreenService.ts b/webapp/packages/administration/src/AdministrationScreen/AdministrationScreenService.ts new file mode 100644 index 0000000000..ad2bf813f6 --- /dev/null +++ b/webapp/packages/administration/src/AdministrationScreen/AdministrationScreenService.ts @@ -0,0 +1,111 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { computed } from 'mobx'; + +import { ScreenService, RouterService, AppScreenService } from '@dbeaver/core/app'; +import { injectable, Bootstrap } from '@dbeaver/core/di'; +import { PermissionsService } from '@dbeaver/core/root'; + +import { AdministrationItemService } from '../AdministrationItem/AdministrationItemService'; +import { EAdminPermission } from '../EAdminPermission'; +import { AdministrationScreen } from './AdministrationScreen'; + +@injectable() +export class AdministrationScreenService extends Bootstrap { + + static screenName = 'administration' + static itemRouteName = 'administration.item' + static itemSubRouteName = 'administration.item.sub' + static itemSubParamRouteName = 'administration.item.sub.param' + + @computed get activeItem(): string | null { + if (!this.screenService.isActive(AdministrationScreenService.screenName)) { + return null; + } + return this.routerService.params.item || this.administrationItemService.getDefaultItem(); + } + + @computed get activeItemSub(): string | null { + if (!this.screenService.isActive(AdministrationScreenService.screenName)) { + return null; + } + return this.routerService.params.sub || null; + } + + @computed get activeItemSubParam(): string | null { + if (!this.screenService.isActive(AdministrationScreenService.screenName)) { + return null; + } + return this.routerService.params.param || null; + } + + constructor( + private screenService: ScreenService, + private routerService: RouterService, + private permissionsService: PermissionsService, + private appScreenService: AppScreenService, + private administrationItemService: AdministrationItemService + ) { + super(); + this.permissionsService.onUpdate.subscribe(this.handleActivate.bind(this)); + } + + navigateToRoot() { + this.routerService.router.navigate(AdministrationScreenService.screenName); + } + + navigateToItem(item: string) { + this.routerService.router.navigate(AdministrationScreenService.itemRouteName, { item }); + } + + navigateToItemSub(item: string, sub: string, param?: string) { + if (!param) { + this.routerService.router.navigate(AdministrationScreenService.itemSubRouteName, { item, sub }); + return; + } + this.routerService.router.navigate(AdministrationScreenService.itemSubParamRouteName, { item, sub, param }); + } + + bootstrap() { + this.screenService.create({ + name: AdministrationScreenService.screenName, + routes: [ + { + name: AdministrationScreenService.screenName, + path: '/admin', + }, + { + name: AdministrationScreenService.itemRouteName, + path: '/:item', + }, + { + name: AdministrationScreenService.itemSubRouteName, + path: '/:sub', + }, + { + name: AdministrationScreenService.itemSubParamRouteName, + path: '/:param', + }, + ], + component: AdministrationScreen, + onActivate: this.handleActivate.bind(this), + }); + } + + private async handleActivate() { + if (!this.permissionsService.has(EAdminPermission.admin)) { + this.appScreenService.navigateToRoot(); + return; + } + + if (this.activeItem) { + await this.administrationItemService.activate(this.activeItem, this.activeItemSub, this.activeItemSubParam); + } + } +} diff --git a/webapp/packages/administration/src/AdministrationScreen/AdministrationTopAppBar/AdministrationTopAppBar.tsx b/webapp/packages/administration/src/AdministrationScreen/AdministrationTopAppBar/AdministrationTopAppBar.tsx new file mode 100644 index 0000000000..67f8db9820 --- /dev/null +++ b/webapp/packages/administration/src/AdministrationScreen/AdministrationTopAppBar/AdministrationTopAppBar.tsx @@ -0,0 +1,22 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { Placeholder, TopAppBar } from '@dbeaver/core/blocks'; +import { useService } from '@dbeaver/core/di'; + +import { AdministrationTopAppBarService } from './AdministrationTopAppBarService'; + +export function AdministrationTopAppBar() { + const administrationTopAppBarService = useService(AdministrationTopAppBarService); + + return ( + + + + ); +} diff --git a/webapp/packages/administration/src/AdministrationScreen/AdministrationTopAppBar/AdministrationTopAppBarService.ts b/webapp/packages/administration/src/AdministrationScreen/AdministrationTopAppBar/AdministrationTopAppBarService.ts new file mode 100644 index 0000000000..bcd0ae00a8 --- /dev/null +++ b/webapp/packages/administration/src/AdministrationScreen/AdministrationTopAppBar/AdministrationTopAppBarService.ts @@ -0,0 +1,24 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { SettingsMenu, Logo } from '@dbeaver/core/app'; +import { PlaceholderContainer } from '@dbeaver/core/blocks'; +import { injectable } from '@dbeaver/core/di'; + +import { Fill } from './Fill'; + +@injectable() +export class AdministrationTopAppBarService { + readonly placeholder = new PlaceholderContainer(); + + constructor() { + this.placeholder.add(Logo, 0); + this.placeholder.add(Fill, 3); + this.placeholder.add(SettingsMenu, 4); + } +} diff --git a/webapp/packages/administration/src/AdministrationScreen/AdministrationTopAppBar/Fill.tsx b/webapp/packages/administration/src/AdministrationScreen/AdministrationTopAppBar/Fill.tsx new file mode 100644 index 0000000000..54bdf739be --- /dev/null +++ b/webapp/packages/administration/src/AdministrationScreen/AdministrationTopAppBar/Fill.tsx @@ -0,0 +1,19 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import styled, { css } from 'reshadow'; + +const styles = css` + fill { + flex: 1; + } +`; + +export function Fill() { + return styled(styles)(); +} diff --git a/webapp/packages/administration/src/Bootstrap.ts b/webapp/packages/administration/src/Bootstrap.ts deleted file mode 100644 index d8e34ad86e..0000000000 --- a/webapp/packages/administration/src/Bootstrap.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* - * cloudbeaver - Cloud Database Manager - * Copyright (C) 2020 DBeaver Corp and others - * - * Licensed under the Apache License, Version 2.0. - * you may not use this file except in compliance with the License. - */ - -import { injectable } from '@dbeaver/core/di'; - -import { AdministrationMenuService } from './AdministrationMenuService'; - -@injectable() -export class Bootstrap { - constructor(private administrationMenuService: AdministrationMenuService) { } - - bootstrap() { - this.administrationMenuService.register(); - } -} diff --git a/webapp/packages/administration/src/EAdminPermission.ts b/webapp/packages/administration/src/EAdminPermission.ts new file mode 100644 index 0000000000..c1c7cddd49 --- /dev/null +++ b/webapp/packages/administration/src/EAdminPermission.ts @@ -0,0 +1,11 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +export enum EAdminPermission { + admin = 'admin' +} diff --git a/webapp/packages/administration/src/index.ts b/webapp/packages/administration/src/index.ts index 72c5cfecc9..5dbc811fe5 100644 --- a/webapp/packages/administration/src/index.ts +++ b/webapp/packages/administration/src/index.ts @@ -2,4 +2,9 @@ import { manifest } from './manifest'; export default manifest; +export * from './Administration/AdministrationTools/AdministrationTools'; +export * from './AdministrationItem/AdministrationItemService'; +export * from './AdministrationItem/IAdministrationItem'; +export * from './AdministrationScreen/AdministrationScreenService'; +export * from './AdministrationScreen/AdministrationTopAppBar/AdministrationTopAppBarService'; export * from './AdministrationMenuService'; diff --git a/webapp/packages/administration/src/manifest.ts b/webapp/packages/administration/src/manifest.ts index 6b3e409811..89f2afd85d 100644 --- a/webapp/packages/administration/src/manifest.ts +++ b/webapp/packages/administration/src/manifest.ts @@ -8,8 +8,10 @@ import { IServiceInjector, PluginManifest } from '@dbeaver/core/di'; +import { AdministrationItemService } from './AdministrationItem/AdministrationItemService'; import { AdministrationMenuService } from './AdministrationMenuService'; -import { Bootstrap } from './Bootstrap'; +import { AdministrationScreenService } from './AdministrationScreen/AdministrationScreenService'; +import { AdministrationTopAppBarService } from './AdministrationScreen/AdministrationTopAppBar/AdministrationTopAppBarService'; export const manifest: PluginManifest = { info: { @@ -18,11 +20,11 @@ export const manifest: PluginManifest = { providers: [ AdministrationMenuService, + AdministrationScreenService, + AdministrationTopAppBarService, + AdministrationItemService, ], async initialize(services: IServiceInjector) { - services - .resolveServiceByClass(Bootstrap) - .bootstrap(); }, }; diff --git a/webapp/packages/administration/tsconfig.build.json b/webapp/packages/administration/tsconfig.build.json deleted file mode 100644 index dd700023ea..0000000000 --- a/webapp/packages/administration/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules", - "@dbeaver/**" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/administration/tsconfig.json b/webapp/packages/administration/tsconfig.json index cf0afdc7c0..3ab6d3aadc 100644 --- a/webapp/packages/administration/tsconfig.json +++ b/webapp/packages/administration/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, "include": [ "src/**/*" ], diff --git a/webapp/packages/ag-grid-plugin/package.json b/webapp/packages/ag-grid-plugin/package.json index 419a2b1d94..597fafc248 100644 --- a/webapp/packages/ag-grid-plugin/package.json +++ b/webapp/packages/ag-grid-plugin/package.json @@ -3,31 +3,26 @@ "version": "0.1.0", "description": "", "license": "Apache-2.0", - "main": "dist/index.js", - "types": "dist/types", + "main": "./dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "clean-dist": "rimraf dist/*", "test": "echo \"Error: no test specified\" && exit 1" }, "dependencies": { - "@ag-grid-community/all-modules": "^23.0.2", - "@ag-grid-community/core": "^23.0.2", - "ag-grid-community": "^23.0.2", - "ag-grid-react": "^23.0.3" + "@ag-grid-community/all-modules": "^23.1.1", + "@ag-grid-community/core": "^23.1.1", + "ag-grid-community": "^23.1.1", + "ag-grid-react": "^23.1.1" }, "devDependencies": { - "@dbeaver/core": "^0.1.0" + "@dbeaver/core": "^0.1.0", + "@dbeaver/builder": "^0.1.0" }, "peerDependencies": { "@dbeaver/core": "^0.1.0", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.77", - "rxjs": "^6.5.5" + "react": "^16.3.0", + "react-dom": "^16.3.0" } } diff --git a/webapp/packages/ag-grid-plugin/src/AgGridTable/AgGridTableController.ts b/webapp/packages/ag-grid-plugin/src/AgGridTable/AgGridTableController.ts index f02282d2ef..2de4ebdab3 100644 --- a/webapp/packages/ag-grid-plugin/src/AgGridTable/AgGridTableController.ts +++ b/webapp/packages/ag-grid-plugin/src/AgGridTable/AgGridTableController.ts @@ -17,6 +17,7 @@ import { GridOptions, CellEditingStoppedEvent, } from 'ag-grid-community'; +import { SortChangedEvent } from 'ag-grid-community/dist/lib/events'; import { RowDataTransaction } from 'ag-grid-community/dist/lib/interfaces/rowDataTransaction'; import { computed, observable } from 'mobx'; @@ -24,11 +25,12 @@ import { injectable, IInitializableController, IDestructibleController } from '@ import { AgGridContext } from './AgGridContext'; import { - AgGridRow, IAgGridActions, IAgGridCol, IAgGridModel, + AgGridRow, IAgGridActions, IAgGridCol, IAgGridModel, SortMode, SortModel, } from './IAgGridModel'; import { RowSelection } from './TableSelection/RowSelection'; import { TableSelection } from './TableSelection/TableSelection'; + @injectable() export class AgGridTableController implements IInitializableController, IDestructibleController { @observable refreshId = 0; @@ -68,6 +70,7 @@ export class AgGridTableController implements IInitializableController, IDestruc onBodyScroll: this.handleBodyScroll.bind(this), onCellEditingStopped: this.handleCellEditingStopped.bind(this), + onSortChanged: this.handleSortChanged.bind(this), }; @observable columns: ColDef[] = []; @@ -75,7 +78,7 @@ export class AgGridTableController implements IInitializableController, IDestruc /** * use this object to dynamically change ag-grid properties */ - @computed get dynamicOptions() { + @computed get dynamicOptions(): GridOptions { return { enableRangeSelection: !!this.selection, }; @@ -128,15 +131,22 @@ export class AgGridTableController implements IInitializableController, IDestruc startRow, endRow, successCallback, + sortModel, failCallback, } = params; try { const length = endRow - startRow; - const requestedData = await this.gridModel.onRequestData(startRow, length); + const requestedData = await this.gridModel.onRequestData( + startRow, + length, + { + sorting: sortModel as SortModel, + } + ); // update columns only once after first data fetching - if (!this.columns.length) { - this.columns = mapDataToColumns(requestedData.columns || []); + if (isColumnsChanged(this.columns, requestedData.columns)) { + this.columns = mapDataToColumns(requestedData.columns); } successCallback( this.cloneRows(requestedData.rows), @@ -190,16 +200,22 @@ export class AgGridTableController implements IInitializableController, IDestruc this.setInitialRow(this.gridModel.initialRows); } + private handleSortChanged(event: SortChangedEvent) { + if (this.gridModel.onSortChanged) { + const sortModel = event.api.getSortModel() as SortModel; + this.gridModel.onSortChanged(sortModel); + } + } + /* Actions */ private resetData(columns?: IAgGridCol[], rows?: AgGridRow[]): void { this.selection.clear(); if (this.api) { - // only purgeInfiniteCache() doesn't work when cache is empty. - // probably it thinks that nothing to delete - nothing to refresh - this.api.refreshInfiniteCache(); // it will mark internal state for reload this.api.purgeInfiniteCache(); // it will reset internal state - this.columns = columns ? mapDataToColumns(columns) : []; + if (columns) { + this.columns = mapDataToColumns(columns); + } this.setInitialRow(rows); } } @@ -212,7 +228,7 @@ export class AgGridTableController implements IInitializableController, IDestruc addIndex: 0, add: initialRows || [], }; - this.api!.updateRowData(transaction); + this.api!.applyTransaction(transaction); } private updateCellValue(rowNumber: number, colNumber: number, value: any): void { @@ -257,16 +273,18 @@ export const INDEX_COLUMN_DEF: ColDef = { suppressNavigable: true, suppressMenu: true, editable: false, + sortable: false, cellRenderer: row => row.rowIndex + 1, }; -function mapDataToColumns(columns: IAgGridCol[]): ColDef[] { - if (!columns.length) { +function mapDataToColumns(columns?: IAgGridCol[]): ColDef[] { + if (!columns || !columns.length) { return []; } return [ INDEX_COLUMN_DEF, ...columns.map(v => ({ + colId: v.name, headerName: v.label, field: `${v.position}`, valueGetter: v.dataKind === 'OBJECT' ? getObjectValue : undefined, @@ -280,3 +298,11 @@ function mapDataToColumns(columns: IAgGridCol[]): ColDef[] { function getObjectValue({ data, colDef }: ValueGetterParams) { return data[colDef.field || 'node.id'].value; } + +function isColumnsChanged(oldColumns: ColDef[], newColumns: IAgGridCol[] = []): boolean { + const [indexColumn, ...withoutIndexColumn] = oldColumns; + if (withoutIndexColumn.length !== newColumns.length) { + return true; + } + return withoutIndexColumn.some((col, ind) => col.colId !== newColumns[ind].name); +} diff --git a/webapp/packages/ag-grid-plugin/src/AgGridTable/IAgGridModel.ts b/webapp/packages/ag-grid-plugin/src/AgGridTable/IAgGridModel.ts index 9e01b48a0e..acc8524da0 100644 --- a/webapp/packages/ag-grid-plugin/src/AgGridTable/IAgGridModel.ts +++ b/webapp/packages/ag-grid-plugin/src/AgGridTable/IAgGridModel.ts @@ -10,6 +10,18 @@ import { RowSelection } from './TableSelection/RowSelection'; export type AgGridRow = any[]; +export type SortMode = 'asc' | 'desc' | null; + +export type SortModel = { + colId: string; + sort: SortMode; +}[]; + + +export interface IRequestDataOptions { + sorting?: SortModel; +} + export interface IAgGridModel { initialRows: AgGridRow[]; @@ -19,8 +31,9 @@ export interface IAgGridModel { actions: IAgGridActions | null; // hooks - onRequestData(rowOffset: number, count: number): Promise; + onRequestData(rowOffset: number, count: number, options?: IRequestDataOptions): Promise; onCellEditingStopped?(rowNumber: number, colNumber: number, value: any): void; + onSortChanged?(sorting: SortModel): void; onEditSave(): void; onEditCancel(): void; } @@ -36,6 +49,7 @@ export interface IAgGridActions { export interface IAgGridCol { icon?: string; label?: string; + name?: string; position?: number; dataKind?: string; } diff --git a/webapp/packages/ag-grid-plugin/src/AgGridTable/TableColumnHeader/TableColumnHeader.tsx b/webapp/packages/ag-grid-plugin/src/AgGridTable/TableColumnHeader/TableColumnHeader.tsx index 3c0d9f7456..6c89efe9dc 100644 --- a/webapp/packages/ag-grid-plugin/src/AgGridTable/TableColumnHeader/TableColumnHeader.tsx +++ b/webapp/packages/ag-grid-plugin/src/AgGridTable/TableColumnHeader/TableColumnHeader.tsx @@ -6,11 +6,13 @@ * you may not use this file except in compliance with the License. */ -import { useCallback } from 'react'; -import styled, { css } from 'reshadow'; +import { useCallback, useEffect, useState } from 'react'; +import styled, { css, use } from 'reshadow'; import { AgEvent, GridApi, Column } from '@ag-grid-community/core'; -import { StaticImage } from '@dbeaver/core/blocks'; +import { StaticImage, Icon } from '@dbeaver/core/blocks'; + +import { SortMode } from '../IAgGridModel'; type HeaderProps = { api: GridApi; @@ -21,7 +23,7 @@ type HeaderProps = { menuIcon: string; displayName: string; showColumnMenu: (button?: HTMLDivElement) => void; - setSort: (order: string, shiftKey: boolean) => void; + setSort: (order: SortMode, shiftKey: boolean) => void; icon?: string; } @@ -42,6 +44,28 @@ const headerStyles = css` margin-left: 8px; text-transform: uppercase; font-weight: 400; + flex-grow: 1; + } + + sort-icon { + margin-left: 4px; + display: flex; + padding: 2px 4px; + flex-direction: column; + align-content: center; + } + sort-icon > Icon { + width: 8px; + fill: #cbcbcb; + } + sort-icon > Icon:last-child { + transform: scaleY(-1); + } + sort-icon > Icon[|active] { + fill: #338ECC; + } + sort-icon:hover > Icon { + width: 9px; } `; @@ -63,12 +87,47 @@ export function TableColumnHeader(props: HeaderProps) { props.api.dispatchEvent(event); }, []); + const [sortMode, setSortMode] = useState(() => props.column.getSort() as SortMode); + useEffect(() => { + function onSortChanged() { + setSortMode(props.column.getSort() as SortMode); + } + + props.column.addEventListener('sortChanged', onSortChanged); + return function cleanup() { + props.column.removeEventListener('sortChanged', onSortChanged); + }; + }); + + const handleSort = useCallback( + (e: React.MouseEvent) => { + const sort = props.column.getSort() as SortMode; + let nextSort: SortMode; + switch (sort) { + case 'asc': + nextSort = 'desc'; + break; + case 'desc': + nextSort = null; + break; + default: + nextSort = 'asc'; + } + props.setSort(nextSort, e.ctrlKey); + }, + [] + ); + return styled(headerStyles)( {props.displayName} + {props.enableSorting && + + + } ); } diff --git a/webapp/packages/ag-grid-plugin/tsconfig.build.json b/webapp/packages/ag-grid-plugin/tsconfig.build.json deleted file mode 100644 index fbd011158d..0000000000 --- a/webapp/packages/ag-grid-plugin/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules", - "@dbeaver/core/**" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/ag-grid-plugin/tsconfig.json b/webapp/packages/ag-grid-plugin/tsconfig.json index 6b4c45f333..26d254ccf5 100644 --- a/webapp/packages/ag-grid-plugin/tsconfig.json +++ b/webapp/packages/ag-grid-plugin/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, "include": [ "src" ], diff --git a/webapp/packages/authentication/locales/en.json b/webapp/packages/authentication/locales/en.json new file mode 100644 index 0000000000..86f6bebfb4 --- /dev/null +++ b/webapp/packages/authentication/locales/en.json @@ -0,0 +1,12 @@ +{ + "authentication_administration_item": "Users", + "authentication_administration_confirm_user_deletion": "Confirm user deletion", + "authentication_create_user_dialog_title": "Create new user", + "authentication_create_user_dialog_create": "Create", + "authentication_user_name": "User name", + "authentication_user_password": "User password", + "authentication_user_password_repeat": "Repeat password", + "authentication_user_role": "User role", + "authentication_user_passwords_not_match": "Passwords don't match", + "authentication_user_user_created": "User was created successfully" +} \ No newline at end of file diff --git a/webapp/packages/authentication/locales/ru.json b/webapp/packages/authentication/locales/ru.json new file mode 100644 index 0000000000..60468d55eb --- /dev/null +++ b/webapp/packages/authentication/locales/ru.json @@ -0,0 +1,11 @@ +{ + "authentication_administration_item": "Пользователи", + "authentication_create_user_dialog_title": "Создание нового пользователя", + "authentication_create_user_dialog_create": "Создать", + "authentication_user_name": "Имя", + "authentication_user_password": "Пароль", + "authentication_user_password_repeat": "Повторите пароль", + "authentication_user_role": "Роль", + "authentication_user_passwords_not_match": "Пароли не совпадают", + "authentication_user_user_created": "Пользователь создан успешно" +} \ No newline at end of file diff --git a/webapp/packages/authentication/package.json b/webapp/packages/authentication/package.json index 702239de26..59d0cf7148 100644 --- a/webapp/packages/authentication/package.json +++ b/webapp/packages/authentication/package.json @@ -3,25 +3,20 @@ "version": "0.1.0", "description": "", "license": "Apache-2.0", - "main": "dist/index.js", - "types": "dist/types", + "main": "./dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "clean-dist": "rimraf dist/*", "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { + "@dbeaver/administration": "^0.1.0", + "@dbeaver/builder": "^0.1.0", "@dbeaver/core": "^0.1.0" }, "peerDependencies": { - "@dbeaver/core": "^0.1.0", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.76", - "rxjs": "^6.5.5" + "@dbeaver/administration": "^0.1.0", + "@dbeaver/core": "^0.1.0" } } diff --git a/webapp/packages/authentication/public/icons/account.svg b/webapp/packages/authentication/public/icons/account.svg new file mode 100644 index 0000000000..6767905111 --- /dev/null +++ b/webapp/packages/authentication/public/icons/account.svg @@ -0,0 +1,3 @@ + + + diff --git a/webapp/packages/authentication/src/Administration/AuthAdministrationService.ts b/webapp/packages/authentication/src/Administration/AuthAdministrationService.ts new file mode 100644 index 0000000000..232c9d4ebc --- /dev/null +++ b/webapp/packages/authentication/src/Administration/AuthAdministrationService.ts @@ -0,0 +1,22 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { AdministrationItemService } from '@dbeaver/administration'; +import { injectable, Bootstrap } from '@dbeaver/core/di'; + +@injectable() +export class AuthAdministrationService extends Bootstrap { + constructor( + private administrationItemService: AdministrationItemService + ) { + super(); + } + + bootstrap() { + } +} diff --git a/webapp/packages/authentication/src/Administration/RolesManagerService.ts b/webapp/packages/authentication/src/Administration/RolesManagerService.ts new file mode 100644 index 0000000000..8aa749f970 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/RolesManagerService.ts @@ -0,0 +1,47 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { injectable } from '@dbeaver/core/di'; +import { + CachedResource, GraphQLService, AdminRoleInfo +} from '@dbeaver/core/sdk'; + +@injectable() +export class RolesManagerService { + readonly roles = new CachedResource( + [], + this.refreshAsync.bind(this), + data => !!data.length + ) + constructor( + private graphQLService: GraphQLService, + ) { + } + + private async refreshAsync( + data: AdminRoleInfo[], + _: any, + update: boolean, + roleId?: string + ): Promise { + const { roles } = await this.graphQLService.gql.getRolesList({ roleId }); + + if (!roleId) { + return roles as AdminRoleInfo[]; + } + + const index = data.findIndex(role => role.roleId === roleId); + if (index !== -1) { + data.splice(index, 1, ...roles as AdminRoleInfo[]); + } else { + data.push(...roles as AdminRoleInfo[]); + } + + return data; + } +} diff --git a/webapp/packages/authentication/src/Administration/Users/CreateUser/CreateUser.tsx b/webapp/packages/authentication/src/Administration/Users/CreateUser/CreateUser.tsx new file mode 100644 index 0000000000..708caf9bcd --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/CreateUser/CreateUser.tsx @@ -0,0 +1,103 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; +import { useCallback } from 'react'; +import styled, { css } from 'reshadow'; + +import { + InputField, SubmittingForm, ErrorMessage, Button +} from '@dbeaver/core/blocks'; +import { useController } from '@dbeaver/core/di'; +import { useTranslate } from '@dbeaver/core/localization'; +import { useStyles, composes } from '@dbeaver/core/theming'; + +import { CreateUserController } from './CreateUserController'; + +const styles = composes( + css` + `, + css` + SubmittingForm { + display: flex; + flex: 1; + } + create-form { + flex: 1; + box-sizing: border-box; + display: flex; + align-items: center; + justify-content: center; + } + group { + box-sizing: border-box; + display: flex; + margin: 0 12px; + } + controls { + display: flex; + align-items: center; + justify-content: flex-end; + } + item-title { + composes: theme-typography--headline5 from global; + padding: 16px; + } + ` +); + +export const CreateUser = observer(function CreateUser() { + const controller = useController(CreateUserController); + const translate = useTranslate(); + const handleChange = useCallback( + (value: string) => controller.login = value, + [] + ); + + return styled(useStyles(styles))( + <> + + User creation + + + + + + {translate('User name')} + + + + + + + + + {controller.error.responseMessage && ( + + )} + + ); +}); diff --git a/webapp/packages/authentication/src/Administration/Users/CreateUser/CreateUserController.ts b/webapp/packages/authentication/src/Administration/Users/CreateUser/CreateUserController.ts new file mode 100644 index 0000000000..450848c16e --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/CreateUser/CreateUserController.ts @@ -0,0 +1,58 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observable } from 'mobx'; + +import { AdministrationScreenService } from '@dbeaver/administration'; +import { ErrorDetailsDialog } from '@dbeaver/core/app'; +import { injectable } from '@dbeaver/core/di'; +import { CommonDialogService } from '@dbeaver/core/dialogs'; +import { NotificationService } from '@dbeaver/core/eventsLog'; +import { GQLErrorCatcher } from '@dbeaver/core/sdk'; + +import { UsersManagerService } from '../../UsersManagerService'; + + +@injectable() +export class CreateUserController { + @observable isCreating = false; + @observable login = ''; + + readonly error = new GQLErrorCatcher(); + + constructor( + private notificationService: NotificationService, + private administrationScreenService: AdministrationScreenService, + private usersManagerService: UsersManagerService, + private commonDialogService: CommonDialogService, + ) { } + + create = async () => { + if (this.isCreating) { + return; + } + + this.isCreating = true; + try { + await this.usersManagerService.create(this.login); + this.administrationScreenService.navigateToItem('users'); + } catch (exception) { + if (!this.error.catch(exception)) { + this.notificationService.logException(exception, 'User create failed'); + } + } finally { + this.isCreating = false; + } + } + + showDetails = () => { + if (this.error.exception) { + this.commonDialogService.open(ErrorDetailsDialog, this.error.exception); + } + } +} diff --git a/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialog.tsx b/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialog.tsx new file mode 100644 index 0000000000..d8913f7996 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialog.tsx @@ -0,0 +1,159 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; +import { useCallback } from 'react'; +import styled, { css } from 'reshadow'; + +import { + SubmittingForm, ErrorMessage, InputField, Checkbox +} from '@dbeaver/core/blocks'; +import { useController } from '@dbeaver/core/di'; +import { DialogComponent, CommonDialogWrapper } from '@dbeaver/core/dialogs'; +import { useTranslate } from '@dbeaver/core/localization'; +import { composes, useStyles } from '@dbeaver/core/theming'; + +import { CreateUserDialogController } from './CreateUserDialogController'; +import { CreateUserDialogFooter } from './CreateUserDialogFooter'; + +const styles = composes( + css` + Tab { + composes: theme-ripple theme-background-secondary theme-text-on-secondary from global; + } + ErrorMessage { + composes: theme-background-secondary from global; + } + `, + css` + CommonDialogWrapper { + min-height: 400px; + min-width: 600px; + } + SubmittingForm { + overflow: auto; + margin-top: 20px; + margin-bottom: 20px; + } + SubmittingForm, create-form { + flex: 1; + display: flex; + flex-direction: column; + } + create-form { + flex-direction: column; + padding: 18px 24px; + } + ErrorMessage { + position: sticky; + bottom: 0; + padding: 8px 24px; + } + ` +); + +export const CreateUserDialog: DialogComponent = observer( + function CreateUserDialog(props) { + const controller = useController(CreateUserDialogController, props.rejectDialog); + const translate = useTranslate(); + const handleLoginChange = useCallback( + (value: string) => controller.credentials.login = value, + [] + ); + const handlePasswordChange = useCallback( + (value: string) => controller.credentials.password = value, + [] + ); + const handlePasswordRepeatChange = useCallback( + (value: string) => controller.credentials.passwordRepeat = value, + [] + ); + const handleRoleChange = useCallback( + (roleId: string, value: boolean) => controller.credentials.roles.set(roleId, value), + [] + ); + + return styled(useStyles(styles))( + + )} + onReject={props.rejectDialog} + > + + + + + {translate('authentication_user_name')} + + + + + {translate('authentication_user_password')} + + + + + {translate('authentication_user_password_repeat')} + + + {controller.roles.map((role, i) => ( + + handleRoleChange(role.roleId, checked)} + checked={controller.credentials.roles.get(role.roleId)} + disabled={controller.isCreating} + mod='surface' + > + {i === 0 && translate('authentication_user_role')} + + + ))} + + + {controller.error.responseMessage && ( + + )} + + ); + } +); diff --git a/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialogController.ts b/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialogController.ts new file mode 100644 index 0000000000..02bf0b1186 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialogController.ts @@ -0,0 +1,112 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observable, computed } from 'mobx'; + +import { ErrorDetailsDialog } from '@dbeaver/core/app'; +import { injectable, IInitializableController, IDestructibleController } from '@dbeaver/core/di'; +import { CommonDialogService } from '@dbeaver/core/dialogs'; +import { NotificationService } from '@dbeaver/core/eventsLog'; +import { GQLErrorCatcher } from '@dbeaver/core/sdk'; + +import { RolesManagerService } from '../../RolesManagerService'; +import { UsersManagerService } from '../../UsersManagerService'; + + +@injectable() +export class CreateUserDialogController implements IInitializableController, IDestructibleController { + @observable isCreating = false; + @observable credentials = { + login: '', + password: '', + passwordRepeat: '', + roles: new Map(), + }; + + @computed get roles() { + return this.rolesManagerService.roles.data; + } + readonly error = new GQLErrorCatcher(); + private isDistructed = false; + private close!: () => void; + + constructor( + private notificationService: NotificationService, + private usersManagerService: UsersManagerService, + private commonDialogService: CommonDialogService, + private rolesManagerService: RolesManagerService, + ) { } + + init(onClose: () => void) { + this.close = onClose; + this.loadRoles(); + } + + destruct(): void { + this.isDistructed = true; + } + + create = async () => { + if (this.isCreating) { + return; + } + if (this.credentials.password !== this.credentials.passwordRepeat) { + this.notificationService.logError({ title: 'authentication_user_passwords_not_match' }); + return; + } + + this.isCreating = true; + let isUserCreated = false; + try { + const user = await this.usersManagerService.create(this.credentials.login, false); + isUserCreated = !!user; + await this.usersManagerService.updateCredentials(user.userId, { password: this.credentials.password }); + for (const [roleId, checked] of this.credentials.roles) { + if (checked) { + await this.usersManagerService.grantRole(user.userId, roleId); + } + } + await this.usersManagerService.users.refresh(user.userId); + this.notificationService.logInfo({ title: 'authentication_user_user_created' }); + this.close(); + } catch (exception) { + if (isUserCreated) { + await this.deleteUser(this.credentials.login); + } + if (!this.error.catch(exception) || this.isDistructed) { + this.notificationService.logException(exception, 'Error creating new user'); + } + } finally { + this.isCreating = false; + } + } + + showDetails = () => { + if (this.error.exception) { + this.commonDialogService.open(ErrorDetailsDialog, this.error.exception); + } + } + + private async deleteUser(userId: string) { + try { + await this.usersManagerService.delete(userId); + } catch (exception) { + if (!this.error.catch(exception) || this.isDistructed) { + this.notificationService.logException(exception, 'Error deleting partially created user'); + } + } + } + + private async loadRoles() { + try { + await this.rolesManagerService.roles.load(); + } catch (exception) { + this.notificationService.logException(exception, 'Can\'t load roles'); + } + } +} diff --git a/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialogFooter.tsx b/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialogFooter.tsx new file mode 100644 index 0000000000..f43f745195 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/CreateUserDialog/CreateUserDialogFooter.tsx @@ -0,0 +1,66 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; +import styled, { css } from 'reshadow'; + +import { Button } from '@dbeaver/core/blocks'; +import { useTranslate } from '@dbeaver/core/localization'; + +const styles = css` + controls { + display: flex; + height: 100%; + flex: 1; + align-items: center; + margin: auto; + justify-content: flex-end; + } + + fill { + flex: 1; + } +`; + +export type Props = { + isCreating: boolean; + onCancel(): void; + onCreate(): void; +} + +export const CreateUserDialogFooter = observer( + function CreateUserDialogFooter({ + isCreating, + onCancel, + onCreate, + }: Props) { + const translate = useTranslate(); + + return styled(styles)( + + + + + + ); + } +); diff --git a/webapp/packages/authentication/src/Administration/Users/UsersAdministration.tsx b/webapp/packages/authentication/src/Administration/Users/UsersAdministration.tsx new file mode 100644 index 0000000000..03ee6f9997 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/UsersAdministration.tsx @@ -0,0 +1,65 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; +import styled, { css } from 'reshadow'; + +import { AdministrationTools } from '@dbeaver/administration'; +import { Loader, IconButton } from '@dbeaver/core/blocks'; +import { useController } from '@dbeaver/core/di'; +import { useStyles, composes } from '@dbeaver/core/theming'; + +import { UsersAdministrationController } from './UsersAdministrationController'; +import { UsersTable } from './UsersTable/UsersTable'; + +const styles = composes( + css` + AdministrationTools { + composes: theme-background-secondary theme-text-on-secondary from global; + } + `, + css` + content { + position: relative; + padding-top: 16px; + flex: 1; + overflow: auto; + } + TableColumnHeader { + border-top: solid 1px; + } + AdministrationTools { + display: flex; + padding: 0 16px; + align-items: center; + } + IconButton { + height: 32px; + width: 32px; + margin-right: 16px; + } + ` +); + +export const UsersAdministration = observer(function UsersAdministration() { + const controller = useController(UsersAdministrationController); + + return styled(useStyles(styles))( + <> + + + + + + + + {controller.isLoading && } + + + ); +}); diff --git a/webapp/packages/authentication/src/Administration/Users/UsersAdministrationController.ts b/webapp/packages/authentication/src/Administration/Users/UsersAdministrationController.ts new file mode 100644 index 0000000000..f005245279 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/UsersAdministrationController.ts @@ -0,0 +1,97 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observable } from 'mobx'; + +import { ErrorDetailsDialog } from '@dbeaver/core/app'; +import { injectable } from '@dbeaver/core/di'; +import { CommonDialogService, ConfirmationDialog } from '@dbeaver/core/dialogs'; +import { NotificationService } from '@dbeaver/core/eventsLog'; +import { GQLErrorCatcher } from '@dbeaver/core/sdk'; + +import { UsersManagerService } from '../UsersManagerService'; +import { CreateUserDialog } from './CreateUserDialog/CreateUserDialog'; + + +@injectable() +export class UsersAdministrationController { + @observable isDeleting = false; + readonly selectedItems = observable(new Map()) + readonly error = new GQLErrorCatcher(); + get users() { + return this.usersManagerService.users.data; + } + get isLoading() { + return this.usersManagerService.users.isLoading(); + } + + constructor( + private notificationService: NotificationService, + private usersManagerService: UsersManagerService, + private commonDialogService: CommonDialogService, + ) { } + + create = () => { + this.commonDialogService.open(CreateUserDialog, null); + } + + update = async () => { + try { + await this.usersManagerService.users.refresh(undefined); + } catch (exception) { + if (!this.error.catch(exception)) { + this.notificationService.logException(exception, 'Users update failed'); + } + } + } + + delete = async () => { + if (this.isDeleting) { + return; + } + + this.isDeleting = true; + + try { + const deletionList = Array + .from(this.selectedItems) + .filter(([_, value]) => value) + .map(([userId]) => userId); + if (deletionList.length === 0) { + return; + } + + const confirmed = await this.commonDialogService.open(ConfirmationDialog, { + title: 'authentication_administration_confirm_user_deletion', + message: `Would you like to delete users: ${deletionList.join(', ')}`, + }); + + if (!confirmed) { + return; + } + + for (const userId of deletionList) { + await this.usersManagerService.delete(userId); + } + this.selectedItems.clear(); + await this.usersManagerService.users.refresh(undefined); + } catch (exception) { + if (!this.error.catch(exception)) { + this.notificationService.logException(exception, 'User delete failed'); + } + } finally { + this.isDeleting = false; + } + } + + showDetails = () => { + if (this.error.exception) { + this.commonDialogService.open(ErrorDetailsDialog, this.error.exception); + } + } +} diff --git a/webapp/packages/authentication/src/Administration/Users/UsersAdministrationService.ts b/webapp/packages/authentication/src/Administration/Users/UsersAdministrationService.ts new file mode 100644 index 0000000000..2c337e6124 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/UsersAdministrationService.ts @@ -0,0 +1,67 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { AdministrationItemService, AdministrationScreenService } from '@dbeaver/administration'; +import { injectable, Bootstrap } from '@dbeaver/core/di'; +import { NotificationService } from '@dbeaver/core/eventsLog'; + +import { UsersManagerService } from '../UsersManagerService'; +import { CreateUser } from './CreateUser/CreateUser'; +import { UsersAdministration } from './UsersAdministration'; +import { UsersDrawerItem } from './UsersDrawerItem'; + +@injectable() +export class UsersAdministrationService extends Bootstrap { + constructor( + private administrationItemService: AdministrationItemService, + private administrationScreenService: AdministrationScreenService, + private notificationService: NotificationService, + private usersManagerService: UsersManagerService, + ) { + super(); + } + + bootstrap() { + this.administrationItemService.create({ + name: 'users', + sub: [ + { + name: 'create', + getComponent: () => CreateUser, + }, + { + name: 'edit', + getComponent: () => UsersAdministration, + }, + ], + getContentComponent: () => UsersAdministration, + getDrawerComponent: () => UsersDrawerItem, + onActivate: this.loadUsers.bind(this), + }); + } + + navToRoot() { + this.administrationScreenService.navigateToItem('users'); + } + + navToCreate() { + this.administrationScreenService.navigateToItemSub('users', 'create'); + } + + navToEdit(userId: string) { + this.administrationScreenService.navigateToItemSub('users', 'edit', userId); + } + + private async loadUsers() { + try { + await this.usersManagerService.users.load(undefined); + } catch (exception) { + this.notificationService.logException(exception, 'Error occurred while loading users'); + } + } +} diff --git a/webapp/packages/authentication/src/Administration/Users/UsersDrawerItem.tsx b/webapp/packages/authentication/src/Administration/Users/UsersDrawerItem.tsx new file mode 100644 index 0000000000..42a72257e6 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/UsersDrawerItem.tsx @@ -0,0 +1,23 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import styled from 'reshadow'; + +import { AdministrationItemDrawerProps } from '@dbeaver/administration'; +import { Tab, TabTitle, TabIcon } from '@dbeaver/core/blocks'; +import { Translate } from '@dbeaver/core/localization'; +import { useStyles } from '@dbeaver/core/theming'; + +export function UsersDrawerItem({ item, onSelect, style }: AdministrationItemDrawerProps) { + return styled(useStyles(...style))( + onSelect(item.name)}> + + + + ); +} diff --git a/webapp/packages/authentication/src/Administration/Users/UsersTable/User.tsx b/webapp/packages/authentication/src/Administration/Users/UsersTable/User.tsx new file mode 100644 index 0000000000..cf4759cf22 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/UsersTable/User.tsx @@ -0,0 +1,31 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; +import styled from 'reshadow'; + +import { + TableItem, TableColumnValue, TableItemSelect +} from '@dbeaver/core/blocks'; +import { AdminUserInfo } from '@dbeaver/core/sdk'; +import { useStyles } from '@dbeaver/core/theming'; + +type Props = { + user: AdminUserInfo; +} + +export const User = observer(function User({ user }: Props) { + return styled(useStyles())( + + + {user.userId} + {user.grantedRoles.join(', ')} + + + ); +}); diff --git a/webapp/packages/authentication/src/Administration/Users/UsersTable/UsersTable.tsx b/webapp/packages/authentication/src/Administration/Users/UsersTable/UsersTable.tsx new file mode 100644 index 0000000000..3340f7aa23 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/Users/UsersTable/UsersTable.tsx @@ -0,0 +1,50 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; +import styled, { css } from 'reshadow'; + +import { + Table, TableHeader, TableColumnHeader, TableBody +} from '@dbeaver/core/blocks'; +import { useTranslate } from '@dbeaver/core/localization'; +import { AdminUserInfo } from '@dbeaver/core/sdk'; +import { useStyles, composes } from '@dbeaver/core/theming'; + +import { User } from './User'; + +const styles = composes( + css``, + css` + TableColumnHeader { + border-top: solid 1px; + } + ` +); + +type Props = { + users: AdminUserInfo[]; + selectedItems: Map; +} + +export const UsersTable = observer(function UsersTable({ users, selectedItems }: Props) { + const translate = useTranslate(); + return styled(useStyles(styles))( + + + + {translate('authentication_user_name')} + {translate('authentication_user_role')} + + + + {users.map(user => )} + +
+ ); +}); diff --git a/webapp/packages/authentication/src/Administration/UsersManagerService.ts b/webapp/packages/authentication/src/Administration/UsersManagerService.ts new file mode 100644 index 0000000000..4ff6569245 --- /dev/null +++ b/webapp/packages/authentication/src/Administration/UsersManagerService.ts @@ -0,0 +1,89 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { injectable } from '@dbeaver/core/di'; +import { CachedResource, GraphQLService, AdminUserInfo } from '@dbeaver/core/sdk'; + +import { AuthInfoService } from '../AuthInfoService'; +import { AuthProviderService } from '../AuthProviderService'; + +@injectable() +export class UsersManagerService { + readonly users = new CachedResource( + [], + this.refreshAsync.bind(this), + (data, _, userId) => (userId ? data.some(user => user.userId === userId) : !!data.length) + ) + constructor( + private graphQLService: GraphQLService, + private authProviderService: AuthProviderService, + private authInfoService: AuthInfoService, + ) { + } + + async create(userId: string, update?: boolean): Promise { + const { user } = await this.graphQLService.gql.createUser({ userId }); + + if (update) { + // TODO: maybe better to do refresh + this.users.data.push(user as AdminUserInfo); + } + return user as AdminUserInfo; + } + + async grantRole(userId: string, roleId: string, update?: boolean) { + await this.graphQLService.gql.grantUserRole({ userId, roleId }); + if (update) { + await this.users.refresh(userId); + } + } + + async delete(userId: string, update?: boolean) { + if (this.authInfoService.userInfo?.userId === userId) { + throw new Error('You can\'t delete current logged user'); + } + await this.graphQLService.gql.deleteUser({ userId }); + + if (update) { + await this.users.refresh(userId); + } + } + + async updateCredentials(userId: string, credentials: Record) { + const provider = 'local'; + const processedCredentials = await this.authProviderService.processCredentials(provider, credentials); + + await this.graphQLService.gql.setUserCredentials({ + providerId: provider, + userId, + credentials: processedCredentials, + }); + } + + private async refreshAsync( + data: AdminUserInfo[], + _: any, + update: boolean, + userId?: string + ): Promise { + const { users } = await this.graphQLService.gql.getUsersList({ userId }); + + if (!userId) { + return users as AdminUserInfo[]; + } + + const index = data.findIndex(user => user.userId === userId); + if (index !== -1) { + data.splice(index, 1, ...users as AdminUserInfo[]); + } else { + data.push(...users as AdminUserInfo[]); + } + + return data; + } +} diff --git a/webapp/packages/authentication/src/AuthInfoService.ts b/webapp/packages/authentication/src/AuthInfoService.ts index 40fe4d55ff..a0ac2233b6 100644 --- a/webapp/packages/authentication/src/AuthInfoService.ts +++ b/webapp/packages/authentication/src/AuthInfoService.ts @@ -35,7 +35,7 @@ export class AuthInfoService { throw new Error('User already logged in'); } - const processedCredentials = this.authProviderService.processCredentials(provider, credentials); + const processedCredentials = await this.authProviderService.processCredentials(provider, credentials); const { user } = await this.graphQLService.gql.authLogin({ provider, diff --git a/webapp/packages/authentication/src/AuthMenuService.ts b/webapp/packages/authentication/src/AuthMenuService.ts index 0ed1ee92a4..9329d67b44 100644 --- a/webapp/packages/authentication/src/AuthMenuService.ts +++ b/webapp/packages/authentication/src/AuthMenuService.ts @@ -6,8 +6,10 @@ * you may not use this file except in compliance with the License. */ +import { AdministrationTopAppBarService } from '@dbeaver/administration'; import { SettingsMenuService, TopNavService } from '@dbeaver/core/app'; import { injectable } from '@dbeaver/core/di'; +import { NotificationService } from '@dbeaver/core/eventsLog'; import { ServerService } from '@dbeaver/core/root'; import { AuthenticationService } from './AuthenticationService'; @@ -23,7 +25,9 @@ export class AuthMenuService { private authInfoService: AuthInfoService, private settingsMenuService: SettingsMenuService, private authenticationService: AuthenticationService, + private notificationService: NotificationService, private topNavService: TopNavService, + private administrationTopAppBarService: AdministrationTopAppBarService, ) { } register() { @@ -50,10 +54,15 @@ export class AuthMenuService { ); this.topNavService.placeholder.add(UserInfo, 4); + this.administrationTopAppBarService.placeholder.add(UserInfo, 4); } private async logout() { - await this.authInfoService.logout(); - await this.authenticationService.auth(); + try { + await this.authInfoService.logout(); + await this.authenticationService.auth(); + } catch (exception) { + this.notificationService.logException(exception, 'Can\'t logout'); + } } } diff --git a/webapp/packages/authentication/src/AuthProviderService.ts b/webapp/packages/authentication/src/AuthProviderService.ts index 9d9bd18ff7..0ad9032e0a 100644 --- a/webapp/packages/authentication/src/AuthProviderService.ts +++ b/webapp/packages/authentication/src/AuthProviderService.ts @@ -23,8 +23,9 @@ export class AuthProviderService { private graphQLService: GraphQLService, ) { } - processCredentials(providerId: string, credentials: any) { - const provider = this.providers.data.find(provider => provider.id === providerId); + async processCredentials(providerId: string, credentials: Record) { + const providers = await this.providers.load(); + const provider = providers.find(provider => provider.id === providerId); if (!provider) { return credentials; diff --git a/webapp/packages/authentication/src/Dialog/AuthDialog.tsx b/webapp/packages/authentication/src/Dialog/AuthDialog.tsx index 202f3c5c85..4de3edd2eb 100644 --- a/webapp/packages/authentication/src/Dialog/AuthDialog.tsx +++ b/webapp/packages/authentication/src/Dialog/AuthDialog.tsx @@ -90,14 +90,14 @@ export const AuthDialog: DialogComponent = observer( title={translate('authentication_login_dialog_title')} noBodyPadding header={( - + {controller.providers.map(provider => ( controller.selectProvider(provider.id)} > - + {provider.label} ))} diff --git a/webapp/packages/authentication/src/Dialog/AuthDialogController.ts b/webapp/packages/authentication/src/Dialog/AuthDialogController.ts index a74771168a..c99acac017 100644 --- a/webapp/packages/authentication/src/Dialog/AuthDialogController.ts +++ b/webapp/packages/authentication/src/Dialog/AuthDialogController.ts @@ -8,11 +8,11 @@ import { observable, computed } from 'mobx'; +import { ErrorDetailsDialog } from '@dbeaver/core/app'; import { injectable, IInitializableController, IDestructibleController } from '@dbeaver/core/di'; import { CommonDialogService } from '@dbeaver/core/dialogs'; import { NotificationService } from '@dbeaver/core/eventsLog'; import { GQLErrorCatcher } from '@dbeaver/core/sdk'; -import { ErrorDetailsDialog } from '@dbeaver/core/app'; import { AuthInfoService } from '../AuthInfoService'; import { AuthProviderService, AuthProvider } from '../AuthProviderService'; diff --git a/webapp/packages/authentication/src/Dialog/AuthProviderForm/AuthProviderForm.tsx b/webapp/packages/authentication/src/Dialog/AuthProviderForm/AuthProviderForm.tsx index c67d609472..e9ecc83e03 100644 --- a/webapp/packages/authentication/src/Dialog/AuthProviderForm/AuthProviderForm.tsx +++ b/webapp/packages/authentication/src/Dialog/AuthProviderForm/AuthProviderForm.tsx @@ -10,7 +10,7 @@ import { observer } from 'mobx-react'; import { useCallback } from 'react'; import styled from 'reshadow'; -import { InputField } from '@dbeaver/core/blocks'; +import { InputField, InFocus } from '@dbeaver/core/blocks'; import { useStyles } from '@dbeaver/core/theming'; import { AuthProvider } from '../../AuthProviderService'; @@ -32,21 +32,23 @@ export const AuthProviderForm = observer(function AuthProviderForm({ }, [credentials]); return styled(useStyles(formStyles))( - - {provider.credentialParameters.map(parameter => parameter.user && ( - - handleChange(parameter.id, value)} - disabled={authenticate} - mod='surface' - > - {parameter.displayName} - - - ))} - + + + {provider.credentialParameters.map(parameter => parameter.user && ( + + handleChange(parameter.id, value)} + disabled={authenticate} + mod='surface' + > + {parameter.displayName} + + + ))} + + ); }); diff --git a/webapp/packages/authentication/src/manifest.ts b/webapp/packages/authentication/src/manifest.ts index b70a6a4e50..8534e69f51 100644 --- a/webapp/packages/authentication/src/manifest.ts +++ b/webapp/packages/authentication/src/manifest.ts @@ -8,6 +8,9 @@ import { IServiceInjector, PluginManifest } from '@dbeaver/core/di'; +import { RolesManagerService } from './Administration/RolesManagerService'; +import { UsersAdministrationService } from './Administration/Users/UsersAdministrationService'; +import { UsersManagerService } from './Administration/UsersManagerService'; import { AuthenticationService } from './AuthenticationService'; import { AuthInfoService } from './AuthInfoService'; import { AuthMenuService } from './AuthMenuService'; @@ -26,6 +29,9 @@ export const manifest: PluginManifest = { AuthProviderService, AuthDialogService, AuthMenuService, + UsersAdministrationService, + UsersManagerService, + RolesManagerService, ], async initialize(services: IServiceInjector) { diff --git a/webapp/packages/authentication/tsconfig.build.json b/webapp/packages/authentication/tsconfig.build.json deleted file mode 100644 index dd700023ea..0000000000 --- a/webapp/packages/authentication/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules", - "@dbeaver/**" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/authentication/tsconfig.json b/webapp/packages/authentication/tsconfig.json index cf0afdc7c0..3ab6d3aadc 100644 --- a/webapp/packages/authentication/tsconfig.json +++ b/webapp/packages/authentication/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, "include": [ "src/**/*" ], diff --git a/webapp/packages/basic-connection-plugin/locales/en.json b/webapp/packages/basic-connection-plugin/locales/en.json new file mode 100644 index 0000000000..aeeb85a4d6 --- /dev/null +++ b/webapp/packages/basic-connection-plugin/locales/en.json @@ -0,0 +1,13 @@ +{ + "basicConnection_connectionDialog_newConnection" : "New connection", + "basicConnection_connectionDialog_title" : "Connect to Database", + "basicConnection_connectionDialog_listTitle" : "Database:", + "basicConnection_connectionDialog_username" : "Database Username:", + "basicConnection_connectionDialog_usernamePlaceholder" : "user", + "basicConnection_connectionDialog_password" : "Database User Password:", + "basicConnection_connectionDialog_passwordPlaceholder" : "password", + "basicConnection_connectionDialog_connecting" : "Connecting...", + "basicConnection_connectionDialog_connect" : "Connect", + "basicConnection_connectionDialog_connecting_message" : "Connecting to database...", + "basicConnection_main_menu_item" : "Preconfigured" +} diff --git a/webapp/packages/basic-connection-plugin/locales/ru.json b/webapp/packages/basic-connection-plugin/locales/ru.json new file mode 100644 index 0000000000..19254e4cf3 --- /dev/null +++ b/webapp/packages/basic-connection-plugin/locales/ru.json @@ -0,0 +1,13 @@ +{ + "basicConnection_connectionDialog_newConnection" : "Новое подключение", + "basicConnection_connectionDialog_title" : "Подключение к базе данных", + "basicConnection_connectionDialog_listTitle" : "Базы данных:", + "basicConnection_connectionDialog_username" : "Имя пользователя:", + "basicConnection_connectionDialog_usernamePlaceholder" : "user", + "basicConnection_connectionDialog_password" : "Пароль пользователя:", + "basicConnection_connectionDialog_passwordPlaceholder" : "password", + "basicConnection_connectionDialog_connecting" : "Подключение...", + "basicConnection_connectionDialog_connect" : "Подключиться", + "basicConnection_connectionDialog_connecting_message" : "Подключение к базе...", + "basicConnection_main_menu_item" : "Подключиться" +} diff --git a/webapp/packages/basic-connection-plugin/package.json b/webapp/packages/basic-connection-plugin/package.json index 0d3b334c20..8e62f74284 100644 --- a/webapp/packages/basic-connection-plugin/package.json +++ b/webapp/packages/basic-connection-plugin/package.json @@ -4,25 +4,18 @@ "description": "", "license": "Apache-2.0", "main": "dist/index.js", - "module": "dist/index.js", - "types": "dist/types", + "module": "./dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "clean-dist": "rimraf dist/*", "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { - "@dbeaver/core": "^0.1.0" + "@dbeaver/core": "^0.1.0", + "@dbeaver/builder": "^0.1.0" }, "peerDependencies": { - "@dbeaver/core": "^0.1.0", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.77", - "rxjs": "^6.5.5" + "@dbeaver/core": "^0.1.0" } } diff --git a/webapp/packages/basic-connection-plugin/tsconfig.build.json b/webapp/packages/basic-connection-plugin/tsconfig.build.json deleted file mode 100644 index dd700023ea..0000000000 --- a/webapp/packages/basic-connection-plugin/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules", - "@dbeaver/**" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/basic-connection-plugin/tsconfig.json b/webapp/packages/basic-connection-plugin/tsconfig.json index cf0afdc7c0..3ab6d3aadc 100644 --- a/webapp/packages/basic-connection-plugin/tsconfig.json +++ b/webapp/packages/basic-connection-plugin/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, "include": [ "src/**/*" ], diff --git a/webapp/packages/builder/bin/index.js b/webapp/packages/builder/bin/index.js index 6106aab3b4..f00275f592 100644 --- a/webapp/packages/builder/bin/index.js +++ b/webapp/packages/builder/bin/index.js @@ -98,7 +98,9 @@ require('yargs') async function build() { const config = createRollupConfig() for (const moduleConfig of config) { - console.log(`Building ${packageName} ${moduleConfig.output.dir}`); + const module = moduleConfig.output.dir.replace('dist' , '') + const start = Date.now() + console.log(`Building ${packageName}${module}`); try { const bundle = await rollup.rollup(moduleConfig); await bundle.write(moduleConfig.output); @@ -106,7 +108,8 @@ require('yargs') console.error(e) process.exitCode = 1; } finally { - console.log(`Build finished ${packageName} ${moduleConfig.output.dir}`); + const buildTime = Math.floor((Date.now() - start) / 1000); + console.log(`Build finished ${packageName}${module}, ${buildTime} s`); } } } @@ -127,7 +130,11 @@ require('yargs') const watcher = rollup.watch(watchOptions); watcher.on('event', event => { - console.log(event.code, event.input) + if (event.code === 'ERROR') { + console.error(event.error); + } else { + console.log(event.code, event.input) + } }); } @@ -143,6 +150,7 @@ require('yargs') }, }, function (argv) { + const start = Date.now() const webpackArgv = createWebpackArgv(argv); // console.log(webpackArgv) const configObject = buildConfig({}, webpackArgv) @@ -150,6 +158,8 @@ require('yargs') compiler.run((err, stats) => { console.log(stats.compilation.errors) + const buildTime = Math.floor((Date.now() - start) / 1000); + console.log(`Build app finished in ${buildTime} s`); }); } ) @@ -172,7 +182,7 @@ require('yargs') }, function (argv) { const webpackArgv = createWebpackArgv(argv); - webpackArgv.mode = 'development' + console.log(webpackArgv.mode) webpackArgv.server = argv.server const configObject = devConfig({}, webpackArgv) const WebpackDevServer = require('webpack-dev-server'); diff --git a/webapp/packages/builder/configs/babel-app.config.js b/webapp/packages/builder/configs/babel-app.config.js deleted file mode 100644 index cdc6a0db47..0000000000 --- a/webapp/packages/builder/configs/babel-app.config.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - presets: [ - "@babel/preset-env", - "@babel/preset-react", - // ['@babel/preset-typescript', { isTSX: true, allExtensions: true }], - ], - plugins: [ - '@babel/plugin-transform-runtime', - '@babel/plugin-syntax-dynamic-import', - // 'babel-plugin-transform-typescript-metadata', - '@babel/plugin-proposal-optional-chaining', - // ['@babel/plugin-proposal-decorators', { legacy: true }], - ['@babel/plugin-proposal-class-properties', { loose: true }], - // 'react-require', - // 'reshadow/babel', - ], -} diff --git a/webapp/packages/builder/configs/rollup.config.js b/webapp/packages/builder/configs/rollup.config.js index 88642c47c3..df2bc21670 100644 --- a/webapp/packages/builder/configs/rollup.config.js +++ b/webapp/packages/builder/configs/rollup.config.js @@ -1,8 +1,8 @@ -const babelPlugin = require('rollup-plugin-babel'); const path = require('path'); +const { nodeResolve } = require('@rollup/plugin-node-resolve'); +const { babel } = require('@rollup/plugin-babel'); +const commonjs = require('@rollup/plugin-commonjs'); const postcssPlugin = require('rollup-plugin-postcss'); -const nodeResolve = require('rollup-plugin-node-resolve'); -const commonjs = require('rollup-plugin-commonjs'); const peerDepsExternal = require('rollup-plugin-peer-deps-external'); const includePaths = require('rollup-plugin-includepaths'); const typescriptPlugin = require('rollup-plugin-typescript2'); @@ -11,28 +11,37 @@ const reshadowLoader = require('./reshadow-loader'); const includePathOptions = { include: {}, paths: ['src'], - external: [ - - ], + external: [], extensions: ['.ts', '.tsx', '.js'] }; -const defaultBuilderOptions = { - babelConfig: path.join(__dirname, 'babel-plugin.config.js'), - typescriptConfig: '', // tbd -} +function configBuilder() { -function configBuilder(options = defaultBuilderOptions) { - - return { + return { input: 'src/index.ts', output: { - dir: 'dist', - format: 'esm', - sourcemap: true, - }, + dir: 'dist', + format: 'esm', + sourcemap: true, + }, external: [ - // externals beyond peer dependencies + // externals beyond peer dependencies - common dependencies of the whole application + 'mobx', + // todo check that @dbeaver/core/blocks provide wrapper for go-split + // todo add go-split to @dbeaver/core dependencies and remove it from here + 'go-split', + 'mobx-react', + 'react', + 'react-dom', + // todo add reakit to @dbeaver/core dependencies and remove it from here + // todo be sure that @dbeaver/core provides all necessary wrappers around reakit + 'reakit', + // todo magic. It nested dependency of reakit and should not be mentioned here + // todo but by unknown reasons without this build fails + // todo should be removed when reakit will be incorporated into @dbeaver/core + 'body-scroll-lock', + 'reshadow', + 'rxjs', ], onwarn(warning, warn) { // hides some warning drom ag-grid-plugin todo to investigate later @@ -42,19 +51,32 @@ function configBuilder(options = defaultBuilderOptions) { plugins: [ includePaths(includePathOptions), nodeResolve({ - preferBuiltins: true, // fix crypto import in core/utils/uuid library. todo replace uuid library with simple uuid generation + preferBuiltins: false, // fix crypto import in core/utils/uuid library. todo replace uuid library with simple uuid generation + }), + typescriptPlugin({ + tsconfig: 'tsconfig.json', + useTsconfigDeclarationDir: true, + }), + babel({ + exclude: ['../../node_modules/**', 'node_modules/**'], // exclude package node_modules and lerna node_modules + extensions: ['.js', '.ts', '.tsx'], + babelHelpers: 'bundled', + configFile: path.join(__dirname, 'babel-plugin.config.js'), }), commonjs({ sourceMap: false, - }), - typescriptPlugin({ - tsconfig: 'tsconfig.build.json', - useTsconfigDeclarationDir: true, - }), - babelPlugin({ - exclude: 'node_modules/**', - extensions: ['.js', '.ts', '.tsx'], - configFile: options.babelConfig, + exclude: [ + /** + * todo Now all plugins after build contain reshadow source code + * todo Expected next line should remove reshadow code from build artifact but it doesnt work. + * todo It was found that reshadow code disappear if to comment 'reshadow/babel' in babel-plugin.config.js + * todo So it is reshadow/babel plugin inject code into the artifact. Further investigations required. + */ + 'node_modules/@reshadow/**', + 'node_modules/react-dom', + 'node_modules/react-dom/server', + 'node_modules/react', + ], }), postcssPlugin({ extract: false, @@ -76,9 +98,9 @@ function configBuilder(options = defaultBuilderOptions) { } ], ], - loaders: [ reshadowLoader ], + loaders: [reshadowLoader], plugins: [ - require('postcss-preset-env')({ stage: 0 }), + require('postcss-preset-env')({stage: 0}), require('postcss-discard-comments'), ] }), @@ -88,4 +110,4 @@ function configBuilder(options = defaultBuilderOptions) { } -module.exports = configBuilder(defaultBuilderOptions); +module.exports = configBuilder(); diff --git a/webapp/packages/builder/configs/webpack-build-config.js b/webapp/packages/builder/configs/webpack-build-config.js index b67f7463e1..e49d3c4a56 100644 --- a/webapp/packages/builder/configs/webpack-build-config.js +++ b/webapp/packages/builder/configs/webpack-build-config.js @@ -8,15 +8,15 @@ module.exports = (env, argv) => merge(commonConfig(env, argv), { mode: argv.mode, entry: './index.js', output: { - filename: 'js/bundle.[hash].js', + filename: 'bundle.[hash].js', path: path.resolve(argv.currentDir, './dist'), publicPath: '', }, - devtool: 'source-map', + devtool: argv.mode === 'production' ? false : 'source-map', plugins: [], optimization: { - minimize: false, - namedModules: true, - concatenateModules: false, + minimize: argv.mode === 'production', + namedModules: argv.mode !== 'production', + concatenateModules: argv.mode === 'production', }, }); diff --git a/webapp/packages/builder/configs/webpack-common-config.js b/webapp/packages/builder/configs/webpack-common-config.js index e3774964e2..1fcfa48ab9 100644 --- a/webapp/packages/builder/configs/webpack-common-config.js +++ b/webapp/packages/builder/configs/webpack-common-config.js @@ -11,6 +11,7 @@ const CircularDependencyPlugin = require('circular-dependency-plugin'); const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const HtmlWebpackPlugin = require('html-webpack-plugin'); const CopyWebpackPlugin = require('copy-webpack-plugin'); +const MergeJsonWebpackPlugin = require("merge-jsons-webpack-plugin"); const StringReplacePlugin = require("string-replace-webpack-plugin"); const resolve = require('resolve'); const path = require('path'); @@ -71,9 +72,57 @@ function copyPublic(currentDir, pluginsList) { return pathsToCopy; } +/** + * Search for locales in plugins and combine them together + */ +function combineLocales(contextPath, pluginsList) { + const locales = new Map(); // { locale: array of paths} + pluginsList.forEach(plugin => { + try { + const pathToPlugin = resolve.sync(plugin); + const dir = path.parse(pathToPlugin).dir; + const pathToLocales = path.resolve(dir, '../locales'); + if (dirExists(pathToLocales)) { + fs.readdirSync(pathToLocales).forEach(file => { + const fileParse = path.parse(file) + if (fileParse.ext !== '.json') { + return; + } + const fullFileName = path.join(pathToLocales, file); + let relativeName = path.relative(contextPath, fullFileName); + + if (locales.has(fileParse.base)) { + const pathList = locales.get(fileParse.base); + pathList.push(relativeName) + } else { + locales.set(fileParse.base, [relativeName]) + } + }); + } + } catch (e) { + console.error(e); + } + }); + const mergeJsonWebpackPluginGroupBy = []; + locales.forEach((pathsList, name) => { + const pattern = pathsList.length > 1 + ? `{${pathsList.join(',')}}` + : pathsList[0]; + mergeJsonWebpackPluginGroupBy.push({ + pattern, + fileName: `locales/${name}`, + }) + }) + console.log('Locales'); + console.log(mergeJsonWebpackPluginGroupBy); + return mergeJsonWebpackPluginGroupBy; +} + +const contextPath = path.resolve(__dirname, '../src'); + module.exports = (env, argv) => { return { - context: path.resolve(__dirname, '../src'), + context: contextPath, resolve: { extensions: ['.js'], alias: { @@ -88,14 +137,9 @@ module.exports = (env, argv) => { { test: /\.js$/, use: [ - { - loader: 'babel-loader', - options: { - configFile: path.join(__dirname, 'babel-app.config.js') - }, - }, { loader: StringReplacePlugin.replace({ + exclude: /node_modules/, /** * This replacement allows to put into the build the plugins that were mentioned in package.json */ @@ -111,7 +155,6 @@ module.exports = (env, argv) => { }, 'source-map-loader' ], - exclude: /node_modules/, }, ], }, @@ -120,14 +163,24 @@ module.exports = (env, argv) => { new HtmlWebpackPlugin({ template: path.resolve(argv.currentDir, './index.html.ejs'), }), + new MergeJsonWebpackPlugin({ + debug: true, + output: { + groupBy: combineLocales(contextPath, argv.pluginsList), + }, + globOptions: { + debug: false, + cwd: contextPath, + } + }), new webpack.DefinePlugin({ version: JSON.stringify(require(path.resolve(argv.currentDir, './package.json')).buildVersion), }), new CircularDependencyPlugin({ // exclude detection of files based on a RegExp - // exclude: /\.js|node_modules/, + exclude: /node_modules/, // include specific files based on a RegExp - // include: /dir/, + include: /@dbeaver/, // add errors to webpack instead of warnings failOnError: false, // allow import cycles that include an asyncronous import, diff --git a/webapp/packages/builder/configs/webpack-serve-config.js b/webapp/packages/builder/configs/webpack-serve-config.js index a068f77c0b..97e9cb3e9a 100644 --- a/webapp/packages/builder/configs/webpack-serve-config.js +++ b/webapp/packages/builder/configs/webpack-serve-config.js @@ -15,7 +15,7 @@ module.exports = (env, argv) => merge(commonConfig(env, argv), { hot: false, // enable HMR on the server proxy: { '/dbeaver': { - target: argv.server || 'localhost:3100' + target: argv.server || 'localhost:8978' } } }, @@ -33,4 +33,9 @@ module.exports = (env, argv) => merge(commonConfig(env, argv), { // new webpack.HotModuleReplacementPlugin(), // enable HMR globally new webpack.NamedModulesPlugin(), // prints more readable module names in the browser console on HMR updates ], + optimization: { + minimize: argv.mode === 'production', + namedModules: argv.mode !== 'production', + concatenateModules: argv.mode === 'production', + }, }); diff --git a/webapp/packages/builder/package.json b/webapp/packages/builder/package.json index 8a3a58503f..339e9d5799 100644 --- a/webapp/packages/builder/package.json +++ b/webapp/packages/builder/package.json @@ -7,58 +7,44 @@ "scripts": { "lint": "eslint ./src/ --ext .ts,.tsx" }, - "peerDependencies": { - "@dbeaver/core": "^0.1.0" - }, "dependencies": { "@babel/cli": "^7.7.4", "@babel/core": "^7.7.4", - "@babel/plugin-proposal-class-properties": "^7.8.3", - "@babel/plugin-proposal-decorators": "^7.7.4", - "@babel/plugin-proposal-optional-chaining": "^7.8.3", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-transform-runtime": "^7.8.3", "@babel/preset-env": "^7.7.4", "@babel/preset-react": "^7.7.4", - "@babel/preset-typescript": "^7.7.4", "@csstools/postcss-sass": "^4.0.0", + "@dbeaver/core": "^0.1.0", "@material/button": "^4.0.0", "@material/elevation": "^4.0.0", "@material/ripple": "^4.0.0", "@material/theme": "^4.0.0", "@material/typography": "^4.0.0", + "@rollup/plugin-babel": "^5.0.2", + "@rollup/plugin-commonjs": "^12.0.0", + "@rollup/plugin-node-resolve": "^8.0.0", "@types/graphql": "^14.5.0", - "@types/jest": "^24.0.23", "@types/node": "^12.7.8", "@types/react": "^16.9.34", "@types/react-dom": "^16.9.6", - "@typescript-eslint/eslint-plugin": "^2.5.0", - "@typescript-eslint/parser": "^2.8.0", "babel-loader": "^8.0.6", "babel-plugin-react-require": "^3.1.1", - "babel-plugin-transform-typescript-metadata": "^0.2.2", "circular-dependency-plugin": "^5.2.0", "copy-webpack-plugin": "^5.1.0", - "css-loader": "^3.2.1", "extract-css-chunks-webpack-plugin": "^4.7.1", - "file-loader": "^5.0.2", "go-split": "^1.3.2", "graphql": "^14.5.8", "html-webpack-plugin": "^3.2.0", + "merge-jsons-webpack-plugin": "^1.0.21", "mini-css-extract-plugin": "^0.9.0", "mobx": "^5.15.4", "mobx-react": "^6.2.2", "node-sass": "^4.13.0", "postcss-discard-comments": "^4.0.2", - "postcss-extend-rule": "^3.0.0", "postcss-import": "^12.0.1", - "postcss-loader": "^3.0.0", - "postcss-scss": "^2.0.0", "preact": "^10.4.1", "preact-render-to-string": "^5.1.6", - "preact-ssr-prepass": "^1.0.1", - "prettier-eslint": "^9.0.0", - "raw-loader": "^3.1.0", "react-dom": "^16.13.1", "react-hot-loader": "^4.12.18", "reakit": "1.0.0-beta.11", @@ -67,23 +53,16 @@ "resolve": "^1.17.0", "rimraf": "^3.0.0", "rollup": "^2.0.6", - "rollup-plugin-babel": "^4.4.0", - "rollup-plugin-commonjs": "^10.1.0", "rollup-plugin-includepaths": "^0.2.3", - "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-peer-deps-external": "^2.2.2", "rollup-plugin-postcss": "^3.1.1", "rollup-plugin-typescript2": "^0.26.0", "rxjs": "^6.5.5", - "sass-loader": "^8.0.0", "source-map-loader": "^0.2.4", "string-replace-webpack-plugin": "^0.1.3", - "style-loader": "^1.0.1", - "typescript": "^3.8.3", - "url-loader": "^3.0.0", + "typescript": "^3.9.3", "webpack": "^4.41.2", "webpack-cli": "^3.3.10", - "webpack-dev-middleware": "^3.7.2", "webpack-dev-server": "^3.9.0", "webpack-merge": "^4.2.2", "yargs": "^15.3.1" diff --git a/webapp/packages/builder/tsconfig.json b/webapp/packages/builder/tsconfig.json deleted file mode 100644 index ed0c3a5736..0000000000 --- a/webapp/packages/builder/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "exclude": ["node_modules"], - "include": [ - "src/**/*", - "../**/*.d.ts" - ] -} diff --git a/webapp/packages/dbeaver/.gitignore b/webapp/packages/cloudbeaver/.gitignore similarity index 100% rename from webapp/packages/dbeaver/.gitignore rename to webapp/packages/cloudbeaver/.gitignore diff --git a/webapp/packages/dbeaver/index.html.ejs b/webapp/packages/cloudbeaver/index.html.ejs similarity index 100% rename from webapp/packages/dbeaver/index.html.ejs rename to webapp/packages/cloudbeaver/index.html.ejs diff --git a/webapp/packages/dbeaver/package.json b/webapp/packages/cloudbeaver/package.json similarity index 71% rename from webapp/packages/dbeaver/package.json rename to webapp/packages/cloudbeaver/package.json index b960659eba..95e4f9515d 100644 --- a/webapp/packages/dbeaver/package.json +++ b/webapp/packages/cloudbeaver/package.json @@ -1,17 +1,13 @@ { - "name": "@dbeaver/dbeaver", + "name": "@dbeaver/cloudbeaver", "version": "0.1.0", "description": "", "license": "Apache-2.0", "scripts": { - "build": "npm run clean-dist && builder build-app", + "build": "yarn run clean-dist && builder build-app", "serve": "builder serve-app", "build:analyze": "echo \"no analyze specified\" && exit 0", - "clean-dist": "rimraf dist/*", - "gql:gen": "graphql-codegen", - "gql:gen:dev": "graphql-codegen --watch", - "lint": "eslint ./src/ --ext .ts,.tsx", - "lint-fix": "eslint ./src/ --ext .ts,.tsx --fix" + "clean-dist": "rimraf dist/*" }, "dependencies": { "@dbeaver/administration": "^0.1.0", diff --git a/webapp/packages/dbeaver/plugins-list.js b/webapp/packages/cloudbeaver/plugins-list.js similarity index 83% rename from webapp/packages/dbeaver/plugins-list.js rename to webapp/packages/cloudbeaver/plugins-list.js index 19d2e27b30..e346c2df70 100644 --- a/webapp/packages/dbeaver/plugins-list.js +++ b/webapp/packages/cloudbeaver/plugins-list.js @@ -1,5 +1,5 @@ /** - * Don't mention "@dbeaver/core" here. It will be included by default + * You may omit "@dbeaver/core" here. It will be included by default */ module.exports = [ diff --git a/webapp/packages/core/app/package.json b/webapp/packages/core/app/package.json index f3a04286c0..9b05f71c06 100644 --- a/webapp/packages/core/app/package.json +++ b/webapp/packages/core/app/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/app", "private": true, "sideEffects": false, - "main": "../dist/app", - "module": "../dist/app", - "types": "../dist/types/app" + "main": "../dist/app/index.js", + "module": "../dist/app/index.js" } diff --git a/webapp/packages/core/assets/locales/en.d.ts b/webapp/packages/core/assets/locales/en.d.ts deleted file mode 100644 index d7ab607d8f..0000000000 --- a/webapp/packages/core/assets/locales/en.d.ts +++ /dev/null @@ -1,3 +0,0 @@ - -declare const en: { [key: string]: string }; -export default en; diff --git a/webapp/packages/core/assets/locales/en.js b/webapp/packages/core/assets/locales/en.js deleted file mode 100644 index 740bb9c556..0000000000 --- a/webapp/packages/core/assets/locales/en.js +++ /dev/null @@ -1,90 +0,0 @@ -/** DEFAULT */ - -module.exports = { - name: 'en', - basicConnection_connectionDialog_newConnection: 'New connection', - basicConnection_connectionDialog_title: 'Connect to Database', - basicConnection_connectionDialog_listTitle: 'Database:', - basicConnection_connectionDialog_username: 'Database Username:', - basicConnection_connectionDialog_usernamePlaceholder: 'user', - basicConnection_connectionDialog_password: 'Database User Password:', - basicConnection_connectionDialog_passwordPlaceholder: 'password', - basicConnection_connectionDialog_connecting: 'Connecting...', - basicConnection_connectionDialog_connect: 'Connect', - basicConnection_connectionDialog_connecting_message: 'Connecting to database...', - basicConnection_main_menu_item: 'Preconfigured', - - customConnection_connectionType_custom: 'Parameters', - customConnection_connectionType_url: 'URL', - customConnection_options: 'Options', - customConnection_properties: 'Driver Properties', - customConnection_custom_host: 'Host', - customConnection_custom_obligatory: '(obligatory)', - customConnection_custom_port: 'Port', - customConnection_custom_database: 'Database', - customConnection_custom_server: 'Server', - customConnection_url_JDBC: 'JDBC URL', - customConnection_userName: 'User name', - customConnection_Password: 'Password', - customConnection_test: 'Test Connection', - customConnection_create: 'Create', - - data_transfer_dialog_title: 'Export data', - data_transfer_dialog_export: 'Export', - data_transfer_dialog_configuration_title: 'Export configuration', - data_transfer_dialog_preparation: 'We prepare your file for export. Please wait...', - data_transfer_notification_preparation: 'We prepare your file for download. Please wait...', - data_transfer_notification_ready: 'File ready to download', - data_transfer_notification_error: 'Preparation failed or canceled', - data_transfer_notification_download: 'Download', - data_transfer_notification_delete: 'Delete', - data_transfer_exporting_table: 'Table:', - data_transfer_exporting_sql: 'SQL:', - - administration_menu_enter: 'Administration', - - authentication_login_dialog_title: 'Authentication', - authentication_login: 'Login', - authentication_logout: 'Logout', - - ui_stepper_back: 'Back', - ui_processing_loading: 'Loading...', - ui_processing_cancel: 'Cancel', - ui_processing_canceling: 'Canceling...', - ui_processing_retry: 'Retry', - ui_error_message: 'Error:', - ui_errors_details: 'Details', - ui_search: 'Search...', - ui_data_saving_error: 'Error when saving changes', - block_properties_table_name: 'Name', - block_properties_table_value: 'Value', - block_properties_table_add: 'Add', - - app_root_session_expired_title: 'Session expired', - app_root_session_expired_message: 'Session has been expired. Do you want to reload?', - app_root_session_expired_reload: 'Reload', - - app_shared_connectionMenu_newConnection: 'New connection', - app_shared_connectionMenu_connection: 'Connection', - app_shared_connectionMenu_custom: 'Custom', - app_shared_connectionMenu_disconnect: 'Disconnect', - - app_shared_toolsMenu_tools: 'Tools', - app_shared_toolsMenu_logViewer: 'Log viewer', - - app_shared_settingsMenu_config: 'Configuration', - app_shared_settingsMenu_theme: 'Theme', - app_shared_settingsMenu_lang: 'Language', - - core_eventsLog_dbeaverErrorDetails: 'Error details', - - app_shared_inlineEditor_dialog_title: 'Edit mode', - app_shared_inlineEditor_dialog_apply: 'Apply', - app_shared_inlineEditor_dialog_cancel: 'Cancel', - - app_log_view_clear_log: 'Clear logs', - app_log_view_entry_type: 'Type', - app_log_view_entry_timestamp: 'Timestamp', - app_log_view_entry_message: 'Message', - app_log_view_entry_details: 'Details', -}; diff --git a/webapp/packages/core/assets/locales/ru.js b/webapp/packages/core/assets/locales/ru.js deleted file mode 100644 index 4f5a6ed5db..0000000000 --- a/webapp/packages/core/assets/locales/ru.js +++ /dev/null @@ -1,89 +0,0 @@ - -module.exports = { - name: 'ru', - basicConnection_connectionDialog_newConnection: 'Новое подключение', - basicConnection_connectionDialog_title: 'Подключение к базе данных', - basicConnection_connectionDialog_listTitle: 'Базы данных:', - basicConnection_connectionDialog_username: 'Имя пользователя:', - basicConnection_connectionDialog_usernamePlaceholder: 'user', - basicConnection_connectionDialog_password: 'Пароль пользователя:', - basicConnection_connectionDialog_passwordPlaceholder: 'password', - basicConnection_connectionDialog_connecting: 'Подключение...', - basicConnection_connectionDialog_connect: 'Подключиться', - basicConnection_connectionDialog_connecting_message: 'Подключение к базе...', - basicConnection_main_menu_item: 'Подключиться', - - customConnection_connectionType_custom: 'Параметры', - customConnection_connectionType_url: 'URL', - customConnection_options: 'Подключение', - customConnection_properties: 'Параметры драйвера', - customConnection_custom_host: 'Хост', - customConnection_custom_obligatory: '(обязательное)', - customConnection_custom_port: 'Порт', - customConnection_custom_database: 'База', - customConnection_custom_server: 'Сервер', - customConnection_url_JDBC: 'JDBC URL', - customConnection_userName: 'Пользователь', - customConnection_Password: 'Пароль', - customConnection_test: 'Проверить', - customConnection_create: 'Создать', - - data_transfer_dialog_title: 'Экспорт данных', - data_transfer_dialog_export: 'Экспортировать', - data_transfer_dialog_configuration_title: 'Настройка экспорта', - data_transfer_dialog_preparation: 'Подготавливаем файл к экспорту. Пожалуйста подождите...', - data_transfer_notification_preparation: 'Подготавливаем файл к загрузке. Пожалуйста подождите...', - data_transfer_notification_ready: 'Файл готов к загрузке', - data_transfer_notification_error: 'Подготовка файла к загрузке не удалась или была отменена', - data_transfer_notification_download: 'Загрузить', - data_transfer_notification_delete: 'Удалить', - data_transfer_exporting_table: 'Таблица:', - data_transfer_exporting_sql: 'SQL:', - - administration_menu_enter: 'Администрирование', - - authentication_login_dialog_title: 'Авторизация', - authentication_login: 'Войти', - authentication_logout: 'Выйти', - - ui_stepper_back: 'Назад', - ui_processing_loading: 'Загрузка...', - ui_processing_cancel: 'Отменить', - ui_processing_canceling: 'Отмена...', - ui_processing_retry: 'Повторить', - ui_error_message: 'Ошибка:', - ui_errors_details: 'Информация', - ui_search: 'Поиск...', - ui_data_saving_error: 'Ошибка при сохранении изменений', - block_properties_name: 'Название', - block_properties_value: 'Значение', - block_properties_add: 'Добавить', - - app_root_session_expired_title: 'Сесстия истекла', - app_root_session_expired_message: 'Сессия истекла. Хотите перезагрузить страницу?', - app_root_session_expired_reload: 'Перезагрузить', - - app_shared_connectionMenu_newConnection: 'Новое подключение', - app_shared_connectionMenu_connection: 'Подключение', - app_shared_connectionMenu_custom: 'Custom', - app_shared_connectionMenu_disconnect: 'Отключить', - - app_shared_toolsMenu_tools: 'Инструменты', - app_shared_toolsMenu_logViewer: 'Просмотр лога', - - app_shared_settingsMenu_config: 'Настройки', - app_shared_settingsMenu_theme: 'Тема', - app_shared_settingsMenu_lang: 'Язык', - - core_eventsLog_dbeaverErrorDetails: 'Детали ошибки', - - app_shared_inlineEditor_dialog_title: 'Редактирование', - app_shared_inlineEditor_dialog_apply: 'Применить', - app_shared_inlineEditor_dialog_cancel: 'Отменить', - - app_log_view_clear_log: 'Очистить лог', - app_log_view_entry_type: 'Тип', - app_log_view_entry_timestamp: 'Время', - app_log_view_entry_message: 'Сообщение', - app_log_view_entry_details: 'Детали', -}; diff --git a/webapp/packages/core/assets/styles/_table.scss b/webapp/packages/core/assets/styles/_table.scss index 241be4020a..07f926135f 100644 --- a/webapp/packages/core/assets/styles/_table.scss +++ b/webapp/packages/core/assets/styles/_table.scss @@ -8,6 +8,7 @@ @mixin table($query: mdc-feature-all()) { table { + composes: theme-typography--body2 from global; min-width: 100%; text-align: left; border-collapse: collapse; @@ -29,7 +30,7 @@ tbody tr[use|isSelected] { @include stripes-background($mdc-theme-secondary); - @include mdc-theme-prop(border-color, $color-positive, false); + // @include mdc-theme-prop(border-color, $color-positive, false); } th { @@ -49,8 +50,23 @@ border-right: none; } + th[use|min] { + width: 1%; + } + td { height: 24px; padding: 0 16px; } + + td[use|centerContent] { + align-items: center; + vertical-align: middle; + } + + td > input[type="checkbox"] { + display: block; + height: 16px; + width: 16px; + } } diff --git a/webapp/packages/core/blocks/package.json b/webapp/packages/core/blocks/package.json index e7db6716f4..712075b0f6 100644 --- a/webapp/packages/core/blocks/package.json +++ b/webapp/packages/core/blocks/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/blocks", "private": true, "sideEffects": false, - "main": "../dist/blocks", - "module": "../dist/blocks", - "types": "../dist/types/blocks" + "main": "../dist/blocks/index.js", + "module": "../dist/blocks/index.js" } diff --git a/webapp/packages/core/codegen.yml b/webapp/packages/core/codegen.yml index 857ed8b067..c08a189ba9 100644 --- a/webapp/packages/core/codegen.yml +++ b/webapp/packages/core/codegen.yml @@ -5,6 +5,7 @@ schema: - ../../../server/bundles/io.cloudbeaver.server/schema/service.sql.graphqls - ../../../server/bundles/io.cloudbeaver.service.metadata/schema/service.metadata.graphqls - ../../../server/bundles/io.cloudbeaver.service.data.transfer/schema/service.data.transfer.graphqls + - ../../../server/bundles/io.cloudbeaver.service.admin/schema/service.admin.graphqls - ../../../server/bundles/io.cloudbeaver.service.auth/schema/service.auth.graphqls documents: - ./src/**/*.gql diff --git a/webapp/packages/core/di/package.json b/webapp/packages/core/di/package.json index 2a18d283c7..329cbe7ad9 100644 --- a/webapp/packages/core/di/package.json +++ b/webapp/packages/core/di/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/di", "private": true, "sideEffects": false, - "main": "../dist/di", - "module": "../dist/di", - "types": "../dist/types/di" + "main": "../dist/di/index.js", + "module": "../dist/di/index.js" } diff --git a/webapp/packages/core/dialogs/package.json b/webapp/packages/core/dialogs/package.json index 0bf658bdde..f419333f64 100644 --- a/webapp/packages/core/dialogs/package.json +++ b/webapp/packages/core/dialogs/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/dialogs", "private": true, "sideEffects": false, - "main": "../dist/dialogs", - "module": "../dist/dialogs", - "types": "../dist/types/dialogs" + "main": "../dist/dialogs/index.js", + "module": "../dist/dialogs/index.js" } diff --git a/webapp/packages/core/eventsLog/package.json b/webapp/packages/core/eventsLog/package.json index 88834ce30c..87d8921447 100644 --- a/webapp/packages/core/eventsLog/package.json +++ b/webapp/packages/core/eventsLog/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/eventsLog", "private": true, "sideEffects": false, - "main": "../dist/eventsLog", - "module": "../dist/eventsLog", - "types": "../dist/types/eventsLog" + "main": "../dist/eventsLog/index.js", + "module": "../dist/eventsLog/index.js" } diff --git a/webapp/packages/core/extensions/package.json b/webapp/packages/core/extensions/package.json index 3b62caed89..127065b303 100644 --- a/webapp/packages/core/extensions/package.json +++ b/webapp/packages/core/extensions/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/extensions", "private": true, "sideEffects": false, - "main": "../dist/extensions", - "module": "../dist/extensions", - "types": "../dist/types/extensions" + "main": "../dist/extensions/index.js", + "module": "../dist/extensions/index.js" } diff --git a/webapp/packages/core/locales/en.json b/webapp/packages/core/locales/en.json new file mode 100644 index 0000000000..bfd114143f --- /dev/null +++ b/webapp/packages/core/locales/en.json @@ -0,0 +1,68 @@ +{ + "name": "en", + "customConnection_connectionType_custom": "Parameters", + "customConnection_connectionType_url": "URL", + "customConnection_options": "Options", + "customConnection_properties": "Driver Properties", + "customConnection_custom_host": "Host", + "customConnection_custom_obligatory": "(obligatory)", + "customConnection_custom_port": "Port", + "customConnection_custom_database": "Database", + "customConnection_custom_server": "Server", + "customConnection_url_JDBC": "JDBC URL", + "customConnection_userName": "User name", + "customConnection_Password": "Password", + "customConnection_test": "Test Connection", + "customConnection_create": "Create", + "data_transfer_dialog_title": "Export data", + "data_transfer_dialog_export": "Export", + "data_transfer_dialog_configuration_title": "Export configuration", + "data_transfer_dialog_preparation": "We prepare your file for export. Please wait...", + "data_transfer_notification_preparation": "We prepare your file for download. Please wait...", + "data_transfer_notification_ready": "File ready to download", + "data_transfer_notification_error": "Preparation failed or canceled", + "data_transfer_notification_download": "Download", + "data_transfer_notification_delete": "Delete", + "data_transfer_exporting_table": "Table:", + "data_transfer_exporting_sql": "SQL:", + "authentication_login_dialog_title": "Authentication", + "authentication_login": "Login", + "authentication_logout": "Logout", + "ui_stepper_back": "Back", + "ui_processing_loading": "Loading...", + "ui_processing_cancel": "Cancel", + "ui_processing_canceling": "Canceling...", + "ui_processing_retry": "Retry", + "ui_processing_ok": "Ok", + "ui_error_message": "Error:", + "ui_errors_details": "Details", + "ui_search": "Search...", + "ui_data_saving_error": "Error when saving changes", + "block_properties_table_name": "Name", + "block_properties_table_value": "Value", + "block_properties_table_add": "Add", + "root_permission_denied": "You has no permission", + "app_root_session_expired_title": "Session expired", + "app_root_session_expired_message": "Session has been expired. Do you want to reload?", + "app_root_session_expired_reload": "Reload", + "app_shared_connectionMenu_newConnection": "New connection", + "app_shared_connectionMenu_connection": "Connection", + "app_shared_connectionMenu_custom": "Custom", + "app_shared_connectionMenu_disconnect": "Disconnect", + "app_shared_toolsMenu_tools": "Tools", + "app_shared_toolsMenu_logViewer": "Log viewer", + "app_shared_settingsMenu_config": "Configuration", + "app_shared_settingsMenu_theme": "Theme", + "app_shared_settingsMenu_lang": "Language", + "app_navigationTree_openNodeTab": "Open", + "app_navigationTree_refreshNode": "Refresh", + "core_eventsLog_dbeaverErrorDetails": "Error details", + "app_shared_inlineEditor_dialog_title": "Edit mode", + "app_shared_inlineEditor_dialog_apply": "Apply", + "app_shared_inlineEditor_dialog_cancel": "Cancel", + "app_log_view_clear_log": "Clear logs", + "app_log_view_entry_type": "Type", + "app_log_view_entry_timestamp": "Timestamp", + "app_log_view_entry_message": "Message", + "app_log_view_entry_details": "Details" +} diff --git a/webapp/packages/core/locales/ru.json b/webapp/packages/core/locales/ru.json new file mode 100644 index 0000000000..6176418637 --- /dev/null +++ b/webapp/packages/core/locales/ru.json @@ -0,0 +1,68 @@ +{ + "name": "ru", + "customConnection_connectionType_custom": "Параметры", + "customConnection_connectionType_url": "URL", + "customConnection_options": "Подключение", + "customConnection_properties": "Параметры драйвера", + "customConnection_custom_host": "Хост", + "customConnection_custom_obligatory": "(обязательное)", + "customConnection_custom_port": "Порт", + "customConnection_custom_database": "База", + "customConnection_custom_server": "Сервер", + "customConnection_url_JDBC": "JDBC URL", + "customConnection_userName": "Пользователь", + "customConnection_Password": "Пароль", + "customConnection_test": "Проверить", + "customConnection_create": "Создать", + "data_transfer_dialog_title": "Экспорт данных", + "data_transfer_dialog_export": "Экспортировать", + "data_transfer_dialog_configuration_title": "Настройка экспорта", + "data_transfer_dialog_preparation": "Подготавливаем файл к экспорту. Пожалуйста подождите...", + "data_transfer_notification_preparation": "Подготавливаем файл к загрузке. Пожалуйста подождите...", + "data_transfer_notification_ready": "Файл готов к загрузке", + "data_transfer_notification_error": "Подготовка файла к загрузке не удалась или была отменена", + "data_transfer_notification_download": "Загрузить", + "data_transfer_notification_delete": "Удалить", + "data_transfer_exporting_table": "Таблица:", + "data_transfer_exporting_sql": "SQL:", + "authentication_login_dialog_title": "Авторизация", + "authentication_login": "Войти", + "authentication_logout": "Выйти", + "ui_stepper_back": "Назад", + "ui_processing_loading": "Загрузка...", + "ui_processing_cancel": "Отменить", + "ui_processing_canceling": "Отмена...", + "ui_processing_retry": "Повторить", + "ui_processing_ok": "Принять", + "ui_error_message": "Ошибка:", + "ui_errors_details": "Информация", + "ui_search": "Поиск...", + "ui_data_saving_error": "Ошибка при сохранении изменений", + "block_properties_name": "Название", + "block_properties_value": "Значение", + "block_properties_add": "Добавить", + "root_permission_denied": "Отказано в доступе", + "app_root_session_expired_title": "Сесстия истекла", + "app_root_session_expired_message": "Сессия истекла. Хотите перезагрузить страницу?", + "app_root_session_expired_reload": "Перезагрузить", + "app_shared_connectionMenu_newConnection": "Новое подключение", + "app_shared_connectionMenu_connection": "Подключение", + "app_shared_connectionMenu_custom": "Custom", + "app_shared_connectionMenu_disconnect": "Отключить", + "app_shared_toolsMenu_tools": "Инструменты", + "app_shared_toolsMenu_logViewer": "Просмотр лога", + "app_shared_settingsMenu_config": "Настройки", + "app_shared_settingsMenu_theme": "Тема", + "app_shared_settingsMenu_lang": "Язык", + "app_navigationTree_openNodeTab": "Открыть", + "app_navigationTree_refreshNode": "Обновить", + "core_eventsLog_dbeaverErrorDetails": "Детали ошибки", + "app_shared_inlineEditor_dialog_title": "Редактирование", + "app_shared_inlineEditor_dialog_apply": "Применить", + "app_shared_inlineEditor_dialog_cancel": "Отменить", + "app_log_view_clear_log": "Очистить лог", + "app_log_view_entry_type": "Тип", + "app_log_view_entry_timestamp": "Время", + "app_log_view_entry_message": "Сообщение", + "app_log_view_entry_details": "Детали" +} diff --git a/webapp/packages/core/localization/package.json b/webapp/packages/core/localization/package.json index e728c544cf..ad7136d3a7 100644 --- a/webapp/packages/core/localization/package.json +++ b/webapp/packages/core/localization/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/localization", "private": true, "sideEffects": false, - "main": "../dist/localization", - "module": "../dist/localization", - "types": "../dist/types/localization" + "main": "../dist/localization/index.js", + "module": "../dist/localization/index.js" } diff --git a/webapp/packages/core/modules.js b/webapp/packages/core/modules.js index 2f5e275164..2182a036ac 100644 --- a/webapp/packages/core/modules.js +++ b/webapp/packages/core/modules.js @@ -7,8 +7,8 @@ module.exports = [ // The order of modules is important. // The module must be built before it is used in another module 'extensions', - 'di', 'utils', + 'di', 'eventsLog', 'settings', diff --git a/webapp/packages/core/package.json b/webapp/packages/core/package.json index 4deb03d8a8..e83a25f723 100644 --- a/webapp/packages/core/package.json +++ b/webapp/packages/core/package.json @@ -3,11 +3,10 @@ "version": "0.1.0", "description": "", "license": "Apache-2.0", - "main": "dist/index.js", - "module": "dist/index.js", - "types": "dist/types", + "main": "./dist/index.js", + "module": "./dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "build:analyze": "echo \"no analyze specified\" && exit 0", "clean-dist": "rimraf dist/*", @@ -17,33 +16,23 @@ "lint-fix": "eslint ./src/ --ext .ts,.tsx --fix" }, "dependencies": { - "graphql-request": "^1.8.2", - "inversify": "^5.0.1", - "react-sanitized-html": "^2.0.0", - "reflect-metadata": "^0.1.13", - "sanitize-html": "^1.23.0", - "uuid": "^7.0.3" - }, - "devDependencies": { "@material/button": "^4.0.0", "@material/elevation": "^4.0.0", "@material/radio": "^4.0.0", "@material/ripple": "^4.0.0", "@material/theme": "^4.0.0", "@material/typography": "^4.0.0", - "@types/uuid": "^7.0.2", - "graphql-request": "^1.8.2" - }, - "peerDependencies": { "go-split": "^1.3.2", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.77", - "rxjs": "^6.5.5" + "graphql-request": "^1.8.2", + "inversify": "^5.0.1", + "react-sanitized-html": "^2.0.0", + "router5": "^8.0.1", + "router5-plugin-browser": "^8.0.1", + "sanitize-html": "^1.23.0", + "uuid": "^7.0.3" }, - "buildVersion": "0.13.0", - "dbeaverPlugins": [] + "devDependencies": { + "@types/uuid": "^7.0.2" + }, + "buildVersion": "0.13.0" } diff --git a/webapp/packages/core/plugin/package.json b/webapp/packages/core/plugin/package.json index 238a43f949..5f98f0b0d3 100644 --- a/webapp/packages/core/plugin/package.json +++ b/webapp/packages/core/plugin/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/plugin", "private": true, "sideEffects": false, - "main": "../dist/plugin", - "module": "../dist/plugin", - "types": "../dist/types/plugin" + "main": "../dist/plugin/index.js", + "module": "../dist/plugin/index.js" } diff --git a/webapp/packages/core/product/package.json b/webapp/packages/core/product/package.json index 333f59dd0a..e295ad03f4 100644 --- a/webapp/packages/core/product/package.json +++ b/webapp/packages/core/product/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/product", "private": true, "sideEffects": false, - "main": "../dist/product", - "module": "../dist/product", - "types": "../dist/types/product" + "main": "../dist/product/index.js", + "module": "../dist/product/index.js" } diff --git a/webapp/packages/core/public/icons/icons.svg b/webapp/packages/core/public/icons/icons.svg index 14c8e85c23..c74818691f 100644 --- a/webapp/packages/core/public/icons/icons.svg +++ b/webapp/packages/core/public/icons/icons.svg @@ -57,6 +57,22 @@ + + + + + + + + + + + + + + + + @@ -137,4 +153,10 @@ + + + + + + diff --git a/webapp/packages/core/root/package.json b/webapp/packages/core/root/package.json index 293bca0321..2fcbe6c392 100644 --- a/webapp/packages/core/root/package.json +++ b/webapp/packages/core/root/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/root", "private": true, "sideEffects": false, - "main": "../dist/root", - "module": "../dist/root", - "types": "../dist/types/root" + "main": "../dist/root/index.js", + "module": "../dist/root/index.js" } diff --git a/webapp/packages/core/sdk/package.json b/webapp/packages/core/sdk/package.json index 3d923a23c6..311d9bde41 100644 --- a/webapp/packages/core/sdk/package.json +++ b/webapp/packages/core/sdk/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/sdk", "private": true, "sideEffects": false, - "main": "../dist/sdk", - "module": "../dist/sdk", - "types": "../dist/types/sdk" + "main": "../dist/sdk/index.js", + "module": "../dist/sdk/index.js" } diff --git a/webapp/packages/core/settings/package.json b/webapp/packages/core/settings/package.json index 1fa3906d6a..fd8201afef 100644 --- a/webapp/packages/core/settings/package.json +++ b/webapp/packages/core/settings/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/settings", "private": true, "sideEffects": false, - "main": "../dist/settings", - "module": "../dist/settings", - "types": "../dist/types/settings" + "main": "../dist/settings/index.js", + "module": "../dist/settings/index.js" } diff --git a/webapp/packages/core/src/AppBootstrap.ts b/webapp/packages/core/src/AppBootstrap.ts index 264f871308..c650eec82a 100644 --- a/webapp/packages/core/src/AppBootstrap.ts +++ b/webapp/packages/core/src/AppBootstrap.ts @@ -8,7 +8,12 @@ import { ConnectionDialogsService, - NavigationTabsService, NavigationTreeContextMenuService, LogViewerMenuService, ConnectionSchemaManagerService, + NavigationTabsService, + NavigationTreeContextMenuService, + LogViewerMenuService, + ConnectionSchemaManagerService, + RouterService, + AppScreenService, } from '@dbeaver/core/app'; import { injectable } from '@dbeaver/core/di'; import { SessionExpireService } from '@dbeaver/core/dialogs'; @@ -30,6 +35,8 @@ export class AppBootstrap { private exceptionsCatcherService: ExceptionsCatcherService, private localizationService: LocalizationService, private themeService: ThemeService, + private routerService: RouterService, + private appScreenService: AppScreenService, private connectionDialogService: ConnectionDialogsService, private logViewerMenuService: LogViewerMenuService, private sessionExpireService: SessionExpireService, @@ -42,6 +49,7 @@ export class AppBootstrap { this.exceptionsCatcherService.subscribe(); this.sessionExpireService.subscribe(); + this.appScreenService.register(); await this.localizationService.init(); await this.themeService.init(); @@ -54,5 +62,6 @@ export class AppBootstrap { async doAfterPluginsInit() { // todo this should be moved to the NavigationTabs component creation phase but now it leads to bugs await this.navigationTabsService.restoreTabs(); + this.routerService.start(); } } diff --git a/webapp/packages/core/src/app/AppScreen/AppScreen.tsx b/webapp/packages/core/src/app/AppScreen/AppScreen.tsx new file mode 100644 index 0000000000..c8c2aac465 --- /dev/null +++ b/webapp/packages/core/src/app/AppScreen/AppScreen.tsx @@ -0,0 +1,20 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { TopNavBar } from '../TopNavBar/TopNavBar'; +import { Main } from './Main'; + +export function AppScreen() { + + return ( + <> + +
+ + ); +} diff --git a/webapp/packages/core/src/app/AppScreen/AppScreenService.ts b/webapp/packages/core/src/app/AppScreen/AppScreenService.ts new file mode 100644 index 0000000000..b1a10a8550 --- /dev/null +++ b/webapp/packages/core/src/app/AppScreen/AppScreenService.ts @@ -0,0 +1,36 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { injectable } from '@dbeaver/core/di'; + +import { RouterService } from '../RouterService'; +import { ScreenService } from '../Screen/ScreenService'; +import { AppScreen } from './AppScreen'; + +@injectable() +export class AppScreenService { + + static screenName = 'app' + + constructor( + private screenService: ScreenService, + private routerService: RouterService, + ) {} + + navigateToRoot() { + this.routerService.router.navigate(AppScreenService.screenName); + } + + register() { + this.screenService.create({ + name: AppScreenService.screenName, + routes: [{ name: AppScreenService.screenName, path: '/' }], + component: AppScreen, + }); + } +} diff --git a/webapp/packages/core/src/app/Main.tsx b/webapp/packages/core/src/app/AppScreen/Main.tsx similarity index 95% rename from webapp/packages/core/src/app/Main.tsx rename to webapp/packages/core/src/app/AppScreen/Main.tsx index 347649fc49..421a470a10 100644 --- a/webapp/packages/core/src/app/Main.tsx +++ b/webapp/packages/core/src/app/AppScreen/Main.tsx @@ -13,7 +13,7 @@ import { } from '@dbeaver/core/blocks'; import { composes, useStyles } from '@dbeaver/core/theming'; -import { NavigationTree } from './NavigationTree'; +import { NavigationTree } from '../NavigationTree'; import { RightArea } from './RightArea'; const mainStyles = composes( diff --git a/webapp/packages/core/src/app/RightArea.tsx b/webapp/packages/core/src/app/AppScreen/RightArea.tsx similarity index 83% rename from webapp/packages/core/src/app/RightArea.tsx rename to webapp/packages/core/src/app/AppScreen/RightArea.tsx index 145b780700..0e6189bdc6 100644 --- a/webapp/packages/core/src/app/RightArea.tsx +++ b/webapp/packages/core/src/app/AppScreen/RightArea.tsx @@ -15,9 +15,9 @@ import { import { useController } from '@dbeaver/core/di'; import { composes, useStyles } from '@dbeaver/core/theming'; -import { NavigationTabsBar } from './shared/NavigationTabs/NavigationTabsBar'; -import { LogViewTab } from './shared/ToolsPanel/LogViewTab/LogViewTab'; -import { LogViewTabController } from './shared/ToolsPanel/LogViewTab/LogViewTabController'; +import { NavigationTabsBar } from '../shared/NavigationTabs/NavigationTabsBar'; +import { LogViewTab } from '../shared/ToolsPanel/LogViewTab/LogViewTab'; +import { LogViewTabController } from '../shared/ToolsPanel/LogViewTab/LogViewTabController'; const styles = composes( css` diff --git a/webapp/packages/core/src/app/Body.tsx b/webapp/packages/core/src/app/Body.tsx index 9ce1a0f1ae..e016f6b8e5 100644 --- a/webapp/packages/core/src/app/Body.tsx +++ b/webapp/packages/core/src/app/Body.tsx @@ -6,14 +6,15 @@ * you may not use this file except in compliance with the License. */ +import { observer } from 'mobx-react'; import styled, { css } from 'reshadow'; +import { useService } from '@dbeaver/core/di'; import { DialogsPortal } from '@dbeaver/core/dialogs'; import { useStyles, useTheme } from '@dbeaver/core/theming'; -import { Main } from './Main'; import { Notifications } from './Notifications/Notifications'; -import { TopNavBar } from './TopNavBar/TopNavBar'; +import { ScreenService } from './Screen/ScreenService'; const bodyStyles = css` container { @@ -23,15 +24,17 @@ const bodyStyles = css` } `; -export function Body() { +export const Body = observer(function Body() { useTheme(); + const screenService = useService(ScreenService); + const Screen = screenService.screen?.component; + return styled(useStyles(bodyStyles))( - -
+ {Screen && } ); -} +}); diff --git a/webapp/packages/core/src/app/NavigationTree/NavigationTreeContextMenuService.ts b/webapp/packages/core/src/app/NavigationTree/NavigationTreeContextMenuService.ts index dc9acbc04d..34624f99b6 100644 --- a/webapp/packages/core/src/app/NavigationTree/NavigationTreeContextMenuService.ts +++ b/webapp/packages/core/src/app/NavigationTree/NavigationTreeContextMenuService.ts @@ -44,12 +44,26 @@ export class NavigationTreeContextMenuService { return context.contextType === NavigationTreeContextMenuService.nodeContextType; }, order: 1, - title: 'Open', + title: 'app_navigationTree_openNodeTab', onClick: (context: IMenuContext) => { const node = context.data; this.nodesManagerService.navToNode(node.id); }, }; this.contextMenuService.addMenuItem(this.contextMenuService.getRootMenuToken(), openNodeTab); + + const refreshNode: IContextMenuItem = { + id: 'refreshNode', + isPresent(context) { + return context.contextType === NavigationTreeContextMenuService.nodeContextType; + }, + order: Number.MAX_SAFE_INTEGER, + title: 'app_navigationTree_refreshNode', + onClick: (context: IMenuContext) => { + const node = context.data; + this.nodesManagerService.refreshNode(node.id); + }, + }; + this.contextMenuService.addMenuItem(this.contextMenuService.getRootMenuToken(), refreshNode); } } diff --git a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/TreeNodeMenu/treeNodeMenuStyles.ts b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/TreeNodeMenu/treeNodeMenuStyles.ts index 4b2718cd83..18e4bdd272 100644 --- a/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/TreeNodeMenu/treeNodeMenuStyles.ts +++ b/webapp/packages/core/src/app/NavigationTree/NavigationTreeNode/TreeNodeMenu/treeNodeMenuStyles.ts @@ -12,19 +12,18 @@ export const treeNodeMenuStyles = css` MenuTrigger { margin-left: 16px; padding: 0; - height: 16px; - display: flex; + height: 20px; - & > Icon { + & Icon { cursor: pointer; width: 16px; height: 10px; fill: #dedede; } - &[use|isSelected] > Icon, - &:hover > Icon, - &:focus > Icon { + &[use|isSelected] Icon, + &:hover Icon, + &:focus Icon { fill: #338fcc; } } diff --git a/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/Snackbar.tsx b/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/Snackbar.tsx index 4419f5b8ed..9eabfba939 100644 --- a/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/Snackbar.tsx +++ b/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/Snackbar.tsx @@ -63,7 +63,7 @@ export function Snackbar({ {type && } - {text} + {translate(text)} {!closeAfter && onClose && ( )} diff --git a/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/styles.ts b/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/styles.ts index fe5b4ecabd..7ff93d5e5b 100644 --- a/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/styles.ts +++ b/webapp/packages/core/src/app/Notifications/NotificationsItem/Snackbar/styles.ts @@ -96,5 +96,8 @@ export const SNACKBAR_STYLES = composes( } } } + IconButton { + color: rgba(0, 0, 0, 0.45); + } ` ); diff --git a/webapp/packages/core/src/app/RouterService.ts b/webapp/packages/core/src/app/RouterService.ts new file mode 100644 index 0000000000..db569e7a9f --- /dev/null +++ b/webapp/packages/core/src/app/RouterService.ts @@ -0,0 +1,59 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observable } from 'mobx'; +import createRouter, { + Router, SubscribeFn, SubscribeState, State +} from 'router5'; +import browserPlugin from 'router5-plugin-browser'; + +import { injectable } from '@dbeaver/core/di'; + +@injectable() +export class RouterService { + + get route() { + return this.currentRoute; + } + + get params() { + return this.currentParams; + } + + readonly router: Router; + + @observable private currentRoute = ''; + @observable private currentParams: Record = {}; + + constructor() { + this.router = createRouter(); + + this.configure(); + } + + start() { + this.router.start(); + } + + subscribe(subscriber: SubscribeFn) { + return this.router.subscribe(subscriber); + } + + private configure() { + this.router.usePlugin(browserPlugin({ + useHash: true, + })); + + this.router.subscribe(this.onRouteChange.bind(this)); + } + + private onRouteChange(state: SubscribeState) { + this.currentRoute = state.route.name; + this.currentParams = state.route.params; + } +} diff --git a/webapp/packages/core/src/app/Screen/IScreen.ts b/webapp/packages/core/src/app/Screen/IScreen.ts new file mode 100644 index 0000000000..b75866d468 --- /dev/null +++ b/webapp/packages/core/src/app/Screen/IScreen.ts @@ -0,0 +1,21 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { Route } from 'router5'; + +export type ScreenRoute = Omit + +export interface IScreen { + name: string; + routes: ScreenRoute[]; + component: ScreenComponent; + onActivate?: () => void | Promise; + onDeactivate?: () => void | Promise; +} + +export type ScreenComponent = React.FunctionComponent diff --git a/webapp/packages/core/src/app/Screen/ScreenService.ts b/webapp/packages/core/src/app/Screen/ScreenService.ts new file mode 100644 index 0000000000..9488745ccf --- /dev/null +++ b/webapp/packages/core/src/app/Screen/ScreenService.ts @@ -0,0 +1,79 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { SubscribeState } from 'router5'; + +import { injectable } from '@dbeaver/core/di'; + +import { RouterService } from '../RouterService'; +import { IScreen, ScreenRoute } from './IScreen'; + +@injectable() +export class ScreenService { + + get screen() { + return this.getScreenByRoute(this.routerService.route); + } + + private screens = new Map(); + private routeScreenMap = new Map(); + + constructor( + private routerService: RouterService + ) { + this.routerService.subscribe(this.onRouteChange.bind(this)); + } + + create(screen: IScreen) { + if (this.screens.has(screen.name)) { + return; + } + + this.screens.set(screen.name, screen); + this.addRoutes(screen.name, screen.routes); + } + + addRoutes(screen: string, routes: ScreenRoute[]) { + for (const route of routes) { + this.routerService.router.add(route); + this.routeScreenMap.set(route.name, screen); + } + } + + isActive(name: string): boolean { + return this.screen?.name === name; + } + + buildUrl(screen: string) { + return this.routerService.router.buildUrl(screen); + } + + getScreenByRoute(route: string) { + const screen = this.routeScreenMap.get(route); + if (!screen) { + return undefined; + } + + return this.screens.get(screen); + } + + private async onRouteChange(state: SubscribeState) { + if (state.previousRoute) { + const previousScreen = this.getScreenByRoute(state.previousRoute.name); + if (previousScreen && previousScreen.onDeactivate) { + await previousScreen.onDeactivate(); + } + } + + const nextScreen = this.getScreenByRoute(state.route.name); + + if (nextScreen && nextScreen.onActivate) { + await nextScreen.onActivate(); + } + } +} diff --git a/webapp/packages/core/src/app/TopNavBar/Logo.tsx b/webapp/packages/core/src/app/TopNavBar/Logo.tsx index 4439d512e3..5f5fe8208e 100644 --- a/webapp/packages/core/src/app/TopNavBar/Logo.tsx +++ b/webapp/packages/core/src/app/TopNavBar/Logo.tsx @@ -7,37 +7,20 @@ */ import { observer } from 'mobx-react'; -import styled, { css } from 'reshadow'; -import { Icon } from '@dbeaver/core/blocks'; +import { AppLogo } from '@dbeaver/core/blocks'; import { useService } from '@dbeaver/core/di'; import { ServerService } from '@dbeaver/core/root'; +import { AppScreenService } from '../AppScreen/AppScreenService'; + declare const version: string; // declared in webpack DefinePlugin // todo move to enviroment? -const styles = css` - logo { - height: 100%; - display: flex; - align-items: center; - margin-right: 16px; - width: 250px; - } - - Icon { - height: 24px; - width: auto; - margin-bottom: 2px; - } -`; - export const Logo = observer(function Logo() { const serverService = useService(ServerService); + const appScreenService = useService(AppScreenService); + const title = `Frontend: ${version}\nBackend: ${serverService.config.data?.version}`; - return styled(styles)( - - - - ); + return appScreenService.navigateToRoot()}/>; }); diff --git a/webapp/packages/core/src/app/TopNavBar/MainMenu/MainMenu.tsx b/webapp/packages/core/src/app/TopNavBar/MainMenu/MainMenu.tsx index ed19176da0..efe3c0ed84 100644 --- a/webapp/packages/core/src/app/TopNavBar/MainMenu/MainMenu.tsx +++ b/webapp/packages/core/src/app/TopNavBar/MainMenu/MainMenu.tsx @@ -23,6 +23,7 @@ const styles = css` TopMenuItem { text-transform: uppercase; font-weight: 700; + height: 100%; } `; diff --git a/webapp/packages/core/src/app/TopNavBar/SettingsMenu/settingsMenuStyles.ts b/webapp/packages/core/src/app/TopNavBar/SettingsMenu/settingsMenuStyles.ts index cd8d29b2c4..b925fd2518 100644 --- a/webapp/packages/core/src/app/TopNavBar/SettingsMenu/settingsMenuStyles.ts +++ b/webapp/packages/core/src/app/TopNavBar/SettingsMenu/settingsMenuStyles.ts @@ -11,7 +11,6 @@ import { css } from 'reshadow'; export const settingsMenuStyles = css` MenuTrigger { padding: 0 16px !important; - margin-left: auto; height: 48px; cursor: pointer; background: none; @@ -20,6 +19,9 @@ export const settingsMenuStyles = css` font-weight: 700; outline: none !important; } + box { + width: 100%; + } Icon { height: 24px; } @@ -27,6 +29,7 @@ export const settingsMenuStyles = css` flex-direction: row-reverse; & menu-item-text { text-align: right; + margin-left: auto; } & Icon { transform: rotate(-180deg); diff --git a/webapp/packages/core/src/app/TopNavBar/TopNavBar.tsx b/webapp/packages/core/src/app/TopNavBar/TopNavBar.tsx index f1ac6baa5f..207f59faca 100644 --- a/webapp/packages/core/src/app/TopNavBar/TopNavBar.tsx +++ b/webapp/packages/core/src/app/TopNavBar/TopNavBar.tsx @@ -6,21 +6,17 @@ * you may not use this file except in compliance with the License. */ -import styled from 'reshadow'; - -import { Placeholder } from '@dbeaver/core/blocks'; +import { Placeholder, TopAppBar } from '@dbeaver/core/blocks'; import { useService } from '@dbeaver/core/di'; -import { useStyles } from '@dbeaver/core/theming'; import { TopNavService } from './TopNavBarService'; -import { topNavBarStyles } from './topNavBarStyles'; export function TopNavBar() { const topNavBarService = useService(TopNavService); - return styled(useStyles(topNavBarStyles))( -
+ return ( + -
+ ); } diff --git a/webapp/packages/core/src/app/TopNavBar/shared/TopMenuItem.tsx b/webapp/packages/core/src/app/TopNavBar/shared/TopMenuItem.tsx index fcaf0f9678..f9ad7827e5 100644 --- a/webapp/packages/core/src/app/TopNavBar/shared/TopMenuItem.tsx +++ b/webapp/packages/core/src/app/TopNavBar/shared/TopMenuItem.tsx @@ -41,12 +41,10 @@ const buttonStyle = composes( outline: none !important; color: inherit; cursor: pointer; - display: flex; - align-items: center; - & > span > Icon { - height: 16px; - transform: rotate(90deg); + & div { + display: flex; + align-items: center; } } ` diff --git a/webapp/packages/core/src/app/TopNavBar/shared/topMenuStyles.ts b/webapp/packages/core/src/app/TopNavBar/shared/topMenuStyles.ts index 2e25d7d8f7..495d0bd3b5 100644 --- a/webapp/packages/core/src/app/TopNavBar/shared/topMenuStyles.ts +++ b/webapp/packages/core/src/app/TopNavBar/shared/topMenuStyles.ts @@ -23,18 +23,16 @@ export const topMenuStyles = composes( MenuTrigger { height: 100%; padding: 0 16px !important; - display: flex; - align-items: center; padding-right: 0!important; &:before { display: none; } - & > div { + & box > div { display: block; } - & > Icon { + & box > Icon { background: #47a0dd; margin-left: 16px; width: 16px; @@ -48,7 +46,7 @@ export const topMenuStyles = composes( & menu-trigger-icon { margin-right: 8px; } - &:hover > Icon { + &:hover box > Icon { background: #236ea0; } } diff --git a/webapp/packages/core/src/app/index.ts b/webapp/packages/core/src/app/index.ts index 13060bf6cf..2c2c7e761f 100644 --- a/webapp/packages/core/src/app/index.ts +++ b/webapp/packages/core/src/app/index.ts @@ -1,4 +1,8 @@ // Services +export * from './RouterService'; +export * from './Screen/IScreen'; +export * from './Screen/ScreenService'; +export * from './AppScreen/AppScreenService'; export * from './TopNavBar/MainMenu/MainMenuService'; export * from './TopNavBar/SettingsMenu/SettingsMenuService'; export * from './TopNavBar/ConnectionSchemaManager/ConnectionSchemaManagerService'; @@ -40,6 +44,8 @@ export * from './shared/InlineEditor/InlineEditor'; // components export * from './Body'; export * from './Notifications/NotificationsItem/ErrorDetailsDialog/ErrorDetailsDialog'; +export * from './TopNavBar/SettingsMenu/SettingsMenu'; +export * from './TopNavBar/Logo'; // Interfaces export * from './shared/Navigation/INavigator'; diff --git a/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts b/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts index df9372b677..8457b6c613 100644 --- a/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts +++ b/webapp/packages/core/src/app/shared/NodesManager/NodesManagerService.ts @@ -80,6 +80,12 @@ export class NodesManagerService { }); } + async refreshNode(nodeId: string) { + await this.purgeServerCache(nodeId); + this.nodesStore.removeNode(nodeId); + await this.updateNodeInfo(nodeId); + } + getDatabaseObjectInfo(nodeId: string): DatabaseObjectInfoWithId | undefined { return this.nodesStore.getDatabaseObjectInfo(nodeId); } @@ -123,6 +129,12 @@ export class NodesManagerService { return info; } + async purgeServerCache(nodeId: string) { + await this.graphQLService.gql.navRefreshNode({ + nodePath: nodeId, + }); + } + async updateChildren(parentId: string) { const { navNodeChildren } = await this.graphQLService.gql.navNodeChildren({ parentPath: parentId, diff --git a/webapp/packages/core/src/app/shared/NodesManager/queries/navRefreshNode.gql b/webapp/packages/core/src/app/shared/NodesManager/queries/navRefreshNode.gql new file mode 100644 index 0000000000..a9aa79327c --- /dev/null +++ b/webapp/packages/core/src/app/shared/NodesManager/queries/navRefreshNode.gql @@ -0,0 +1,3 @@ +query navRefreshNode($nodePath: ID!) { + navRefreshNode(nodePath: $nodePath) +} diff --git a/webapp/packages/core/src/blocks/Checkbox.tsx b/webapp/packages/core/src/blocks/Checkbox.tsx new file mode 100644 index 0000000000..8411fd616e --- /dev/null +++ b/webapp/packages/core/src/blocks/Checkbox.tsx @@ -0,0 +1,67 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import styled, { css, use } from 'reshadow'; + +import { useStyles } from '@dbeaver/core/theming'; + +const styles = css` + label { + composes: theme-typography--body1 from global; + } + field { + display: flex; + flex: auto; + box-sizing: border-box; + align-items: center; + padding: 12px 0; + + & label { + width: 230px; + text-align: right; + padding: 0 12px; + line-height: 16px; + font-weight: 500; + } + & input { + flex: 1; + margin: 0 12px; + height: 26px; + } + & checkbox { + display: flex; + align-items: center; + } + } +`; + +type Props = Omit, 'onChange'> & { + checkboxLabel: string; + mod?: 'surface'; + onChange?(value: boolean): any; +} + +export function Checkbox({ + checkboxLabel, + children, + className, + mod, + onChange = () => {}, + ...rest +}: Props) { + + return styled(useStyles(styles))( + + + + onChange(e.target.checked)} {...rest} {...use({ mod })} /> + {checkboxLabel} + + + ); +} diff --git a/webapp/packages/core/src/blocks/IconButton.tsx b/webapp/packages/core/src/blocks/IconButton.tsx index b72ddb6e3a..bf86605bcf 100644 --- a/webapp/packages/core/src/blocks/IconButton.tsx +++ b/webapp/packages/core/src/blocks/IconButton.tsx @@ -5,7 +5,7 @@ import { Icon } from './Icons/Icon'; const styles = css` Button { - color: rgba(0, 0, 0, 0.45); + color: inherit; outline: none; border: none; background: none; @@ -13,10 +13,11 @@ const styles = css` padding: 0; margin: 4px; height: 16px; + width: 16px; & Icon { - width: 16px; - height: 16px; + width: 100%; + height: 100%; } } `; diff --git a/webapp/packages/core/src/blocks/InFocus.tsx b/webapp/packages/core/src/blocks/InFocus.tsx new file mode 100644 index 0000000000..2fcf4cab75 --- /dev/null +++ b/webapp/packages/core/src/blocks/InFocus.tsx @@ -0,0 +1,31 @@ +import React, { + useLayoutEffect, useRef, ReactElement, MutableRefObject +} from 'react'; + +type InFocusProps = { + children: ReactElement; +} + +export function InFocus({ children }: InFocusProps) { + const isFirstRender: MutableRefObject = useRef(true); + const childRef: MutableRefObject = useRef(null); + + useLayoutEffect(() => { + if (isFirstRender.current) { + isFirstRender.current = false; + if (childRef.current !== null) { + const firstFocusable: HTMLElement | null = childRef.current + .querySelector('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'); + if (firstFocusable) { + firstFocusable.focus(); + } + + } + } + }); + const childElement = React.Children.only(children); + return React.cloneElement( + childElement, + { ref: (el: HTMLElement) => childRef.current = el } + ); +} diff --git a/webapp/packages/core/src/blocks/Placeholder/PlaceholderContainer.ts b/webapp/packages/core/src/blocks/Placeholder/PlaceholderContainer.ts index 52c589a657..cb3d48ebea 100644 --- a/webapp/packages/core/src/blocks/Placeholder/PlaceholderContainer.ts +++ b/webapp/packages/core/src/blocks/Placeholder/PlaceholderContainer.ts @@ -22,7 +22,7 @@ export type PlaceholderElement = { order?: number; } -export class PlaceholderContainer { +export class PlaceholderContainer { private placeholders = observable>([], { deep: false }); get() { diff --git a/webapp/packages/core/src/blocks/PropertiesTable/PropertyItem.tsx b/webapp/packages/core/src/blocks/PropertiesTable/PropertyItem.tsx index a5aa447da4..10bdc75258 100644 --- a/webapp/packages/core/src/blocks/PropertiesTable/PropertyItem.tsx +++ b/webapp/packages/core/src/blocks/PropertiesTable/PropertyItem.tsx @@ -8,7 +8,7 @@ import { observer } from 'mobx-react'; import { - useCallback, useEffect, useRef, useState, + useCallback, useRef, useState, useLayoutEffect } from 'react'; import styled, { css, use } from 'reshadow'; @@ -16,8 +16,8 @@ import { composes, useStyles } from '@dbeaver/core/theming'; import { Icon } from '../Icons'; import { ShadowInput } from '../ShadowInput'; -import { DriverPropertyValueSelector } from './DriverPropertyValueSelector'; import { IProperty } from './IProperty'; +import { PropertyValueSelector } from './PropertyValueSelector'; const styles = composes( css` @@ -133,7 +133,7 @@ export const PropertyItem = observer(function PropertyItem({ ); const handleRemove = useCallback(() => onRemove(property.id), [property]); - useEffect(() => { + useLayoutEffect(() => { if (keyInputRef.current && isKeyEditable) { keyInputRef.current.focus(); } @@ -166,14 +166,14 @@ export const PropertyItem = observer(function PropertyItem({ {(property.validValues && property.validValues.length > 0) && ( - - + )} {isKeyEditable && ( diff --git a/webapp/packages/core/src/blocks/PropertiesTable/DriverPropertyValueSelector.tsx b/webapp/packages/core/src/blocks/PropertiesTable/PropertyValueSelector.tsx similarity index 86% rename from webapp/packages/core/src/blocks/PropertiesTable/DriverPropertyValueSelector.tsx rename to webapp/packages/core/src/blocks/PropertiesTable/PropertyValueSelector.tsx index e191dc9308..95f3a5e6f5 100644 --- a/webapp/packages/core/src/blocks/PropertiesTable/DriverPropertyValueSelector.tsx +++ b/webapp/packages/core/src/blocks/PropertiesTable/PropertyValueSelector.tsx @@ -6,7 +6,8 @@ * you may not use this file except in compliance with the License. */ -import { useCallback, useEffect } from 'react'; +import { observer } from 'mobx-react'; +import { useCallback, useLayoutEffect } from 'react'; import { useMenuState, Menu, @@ -42,6 +43,7 @@ const styles = composes( width: 420px; outline: none; padding: 4px 0; + z-index: 999; & MenuItem { background: transparent; @@ -56,20 +58,20 @@ const styles = composes( ` ); -type DriverPropertyValueSelectorProps = React.PropsWithChildren<{ +type Props = React.PropsWithChildren<{ propertyName?: string; values: string[]; onSelect(value: string): void; onSwitch(state: boolean): void; }> -export function DriverPropertyValueSelector({ +export const PropertyValueSelector = observer(function PropertyValueSelector({ propertyName, values, children, onSelect, onSwitch, -}: DriverPropertyValueSelectorProps) { +}: Props) { const menu = useMenuState(); const handleMenuSelect = useCallback( (value: string) => { @@ -78,7 +80,7 @@ export function DriverPropertyValueSelector({ }, [menu, onSelect] ); - useEffect(() => onSwitch(menu.visible), [menu.visible]); + useLayoutEffect(() => onSwitch(menu.visible), [menu.visible]); return styled(useStyles(styles))( <> @@ -94,4 +96,4 @@ export function DriverPropertyValueSelector({ ); -} +}); diff --git a/webapp/packages/core/src/blocks/PropertiesTable/styles.ts b/webapp/packages/core/src/blocks/PropertiesTable/styles.ts index dfb8bdfacd..b092a23517 100644 --- a/webapp/packages/core/src/blocks/PropertiesTable/styles.ts +++ b/webapp/packages/core/src/blocks/PropertiesTable/styles.ts @@ -28,7 +28,7 @@ export const PROPERTIES_TABLE_STYLES = composes( properties-header { box-sizing: border-box; display: inline-flex; - padding: 5px 1px; + padding: 2px; position: sticky; z-index: 1; top: 0; diff --git a/webapp/packages/core/src/blocks/Table/Table.tsx b/webapp/packages/core/src/blocks/Table/Table.tsx new file mode 100644 index 0000000000..df86cedd48 --- /dev/null +++ b/webapp/packages/core/src/blocks/Table/Table.tsx @@ -0,0 +1,40 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observable } from 'mobx'; +import { useState, useCallback } from 'react'; +import styled from 'reshadow'; + +import { useStyles } from '@dbeaver/core/theming'; + +import { TableContext, ITableContext } from './TableContext'; + +type Props = React.PropsWithChildren<{ + selectedItems?: Map; + className?: string; +}> + +export function Table({ selectedItems, children, className }: Props) { + const [selected] = useState>(() => selectedItems || observable(new Map())); + const setItemSelect = useCallback((item: any, state: boolean) => selected.set(item, state), []); + const clearSelection = useCallback(() => selected.clear(), []); + + const [context] = useState(() => ({ + selectedItems: selected, + setItemSelect, + clearSelection, + })); + + return styled(useStyles())( + + + {children} +
+
+ ); +} diff --git a/webapp/packages/core/src/blocks/Table/TableBody.tsx b/webapp/packages/core/src/blocks/Table/TableBody.tsx new file mode 100644 index 0000000000..eceb5b6f29 --- /dev/null +++ b/webapp/packages/core/src/blocks/Table/TableBody.tsx @@ -0,0 +1,23 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import styled from 'reshadow'; + +import { useStyles } from '@dbeaver/core/theming'; + +type Props = React.PropsWithChildren<{ + className?: string; +}> + +export function TableBody({ children, className }: Props) { + return styled(useStyles())( + + {children} + + ); +} diff --git a/webapp/packages/core/src/blocks/Table/TableColumnHeader.tsx b/webapp/packages/core/src/blocks/Table/TableColumnHeader.tsx new file mode 100644 index 0000000000..ac8e18c227 --- /dev/null +++ b/webapp/packages/core/src/blocks/Table/TableColumnHeader.tsx @@ -0,0 +1,27 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import styled, { use } from 'reshadow'; + +import { useStyles } from '@dbeaver/core/theming'; + +type Props = React.PropsWithChildren<{ + title?: string; + min?: boolean; + className?: string; +}> + +export function TableColumnHeader({ + title, children, min, className, +}: Props) { + return styled(useStyles())( + + {children} + + ); +} diff --git a/webapp/packages/core/src/blocks/Table/TableColumnValue.tsx b/webapp/packages/core/src/blocks/Table/TableColumnValue.tsx new file mode 100644 index 0000000000..16d8590a9c --- /dev/null +++ b/webapp/packages/core/src/blocks/Table/TableColumnValue.tsx @@ -0,0 +1,23 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; +import styled, { use } from 'reshadow'; + +import { useStyles } from '@dbeaver/core/theming'; + +type Props = React.PropsWithChildren<{ + className?: string; + centerContent?: boolean; +}> + +export const TableColumnValue = observer(function TableColumnValue({ children, centerContent, className }: Props) { + return styled(useStyles())( + {children} + ); +}); diff --git a/webapp/packages/core/src/blocks/Table/TableContext.tsx b/webapp/packages/core/src/blocks/Table/TableContext.tsx new file mode 100644 index 0000000000..10171a480d --- /dev/null +++ b/webapp/packages/core/src/blocks/Table/TableContext.tsx @@ -0,0 +1,17 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { createContext } from 'react'; + +export interface ITableContext { + selectedItems: Map; + setItemSelect: (item: any, state: boolean) => void; + clearSelection: () => void; +} + +export const TableContext = createContext(undefined); diff --git a/webapp/packages/core/src/blocks/Table/TableHeader.tsx b/webapp/packages/core/src/blocks/Table/TableHeader.tsx new file mode 100644 index 0000000000..e18148ac48 --- /dev/null +++ b/webapp/packages/core/src/blocks/Table/TableHeader.tsx @@ -0,0 +1,25 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import styled from 'reshadow'; + +import { useStyles } from '@dbeaver/core/theming'; + +type Props = React.PropsWithChildren<{ + className?: string; +}> + +export function TableHeader({ children, className }: Props) { + return styled(useStyles())( + + + {children} + + + ); +} diff --git a/webapp/packages/core/src/blocks/Table/TableItem.tsx b/webapp/packages/core/src/blocks/Table/TableItem.tsx new file mode 100644 index 0000000000..9113d69eb1 --- /dev/null +++ b/webapp/packages/core/src/blocks/Table/TableItem.tsx @@ -0,0 +1,69 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; +import { useContext, useCallback, useMemo } from 'react'; +import styled, { use } from 'reshadow'; + + +import { useStyles } from '@dbeaver/core/theming'; + +import { TableContext } from './TableContext'; +import { TableItemContext, ITableItemContext } from './TableItemContext'; + +type Props = React.PropsWithChildren<{ + item: any; + className?: string; + onClick?: () => void; + onDoubleClick?: () => void; +}> + +export const TableItem = observer(function TableItem({ + item, children, className, onClick, onDoubleClick, +}: Props) { + const context = useContext(TableContext); + if (!context) { + return null; + } + + const itemContext = useMemo(() => ({ + item, + isSelected: () => !!context.selectedItems.get(item), + }), [item]); + + const handleClick = useCallback( + (e: React.MouseEvent) => { + const isSelected = context.selectedItems.get(item); + if (!e.ctrlKey) { + context.clearSelection(); + } + + context.setItemSelect(item, !isSelected); + + if (onClick) { + onClick(); + } + }, + [context, item, onClick] + ); + const handleDoubleClick = useCallback((e: React.MouseEvent) => { + if (onDoubleClick) { + onDoubleClick(); + } + }, [onDoubleClick]); + + const isSelected = context.selectedItems.get(item); + + return styled(useStyles())( + + + {children} + + + ); +}); diff --git a/webapp/packages/core/src/blocks/Table/TableItemContext.tsx b/webapp/packages/core/src/blocks/Table/TableItemContext.tsx new file mode 100644 index 0000000000..ea435ee2da --- /dev/null +++ b/webapp/packages/core/src/blocks/Table/TableItemContext.tsx @@ -0,0 +1,16 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { createContext } from 'react'; + +export interface ITableItemContext { + item: any; + isSelected(): boolean; +} + +export const TableItemContext = createContext(undefined); diff --git a/webapp/packages/core/src/blocks/Table/TableItemSelect.tsx b/webapp/packages/core/src/blocks/Table/TableItemSelect.tsx new file mode 100644 index 0000000000..454656601c --- /dev/null +++ b/webapp/packages/core/src/blocks/Table/TableItemSelect.tsx @@ -0,0 +1,36 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { observer } from 'mobx-react'; +import { useContext, useCallback } from 'react'; +import styled from 'reshadow'; + +import { useStyles } from '@dbeaver/core/theming'; + +import { TableContext } from './TableContext'; +import { TableItemContext } from './TableItemContext'; + +type Props = { + className?: string; +} + +export const TableItemSelect = observer(function TableItemSelect({ className }: Props) { + const tableContext = useContext(TableContext); + const context = useContext(TableItemContext); + if (!context) { + return null; + } + const handleClick = useCallback((event: React.MouseEvent) => { + event.stopPropagation(); + tableContext?.setItemSelect(context.item, !context.isSelected()); + }, [tableContext, context]); + + return styled(useStyles())( + + ); +}); diff --git a/webapp/packages/core/src/blocks/Table/index.ts b/webapp/packages/core/src/blocks/Table/index.ts new file mode 100644 index 0000000000..bb980be906 --- /dev/null +++ b/webapp/packages/core/src/blocks/Table/index.ts @@ -0,0 +1,9 @@ +export * from './Table'; +export * from './TableBody'; +export * from './TableColumnHeader'; +export * from './TableColumnValue'; +export * from './TableContext'; +export * from './TableHeader'; +export * from './TableItem'; +export * from './TableItemContext'; +export * from './TableItemSelect'; diff --git a/webapp/packages/core/src/blocks/Tabs/Tab/TabTitle.tsx b/webapp/packages/core/src/blocks/Tabs/Tab/TabTitle.tsx index 28d7382966..b875fc9686 100644 --- a/webapp/packages/core/src/blocks/Tabs/Tab/TabTitle.tsx +++ b/webapp/packages/core/src/blocks/Tabs/Tab/TabTitle.tsx @@ -10,15 +10,14 @@ import styled from 'reshadow'; import { useStyles } from '@dbeaver/core/theming'; -type TabTitleProps = { - title?: string; +type TabTitleProps = React.PropsWithChildren<{ className?: string; -} +}> -export function TabTitle({ title, className }: TabTitleProps) { +export function TabTitle({ children, className }: TabTitleProps) { return styled(useStyles())( - {title || } + {children || } ); } diff --git a/webapp/packages/core/src/blocks/Tabs/TabsState.tsx b/webapp/packages/core/src/blocks/Tabs/TabsState.tsx index b0ae6738dc..199423e659 100644 --- a/webapp/packages/core/src/blocks/Tabs/TabsState.tsx +++ b/webapp/packages/core/src/blocks/Tabs/TabsState.tsx @@ -13,12 +13,16 @@ import { TabsContext } from './TabsContext'; type Props = React.PropsWithChildren<{ selectedId?: string; + orientation?: 'horizontal' | 'vertical'; currentTabId?: string | null; }> -export function TabsState({ selectedId, currentTabId, children }: Props) { +export function TabsState({ + selectedId, orientation, currentTabId, children, +}: Props) { const state = useTabState({ selectedId: selectedId || currentTabId, + orientation, manual: true, }); if (currentTabId) { diff --git a/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabHeader.tsx b/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabHeader.tsx index b2872aea54..24ca25cb66 100644 --- a/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabHeader.tsx +++ b/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabHeader.tsx @@ -7,77 +7,32 @@ */ import { observer } from 'mobx-react'; -import styled, { css, use } from 'reshadow'; +import styled from 'reshadow'; -import { composes, useStyles } from '@dbeaver/core/theming'; +import { useStyles, Style } from '@dbeaver/core/theming'; -import { IconOrImage } from '../../IconOrImage'; import { ITab } from '../ITab'; import { Tab } from '../Tab/Tab'; +import { TabIcon } from '../Tab/TabIcon'; +import { TabTitle } from '../Tab/TabTitle'; +import { verticalTabStyles } from './verticalTabStyles'; - -const styles = composes( - css` - Tab { - composes: theme-ripple theme-ripple-selectable from global; - } - `, - css` - tab-icon { - padding-right: 16px; - - & IconOrImage { - display: block; - width: 22px; - height: 22px; - } - } - - Tab[|vertical] { - border: none !important; - display: flex; - flex-shrink: 0; - text-align: left; - align-items: center; - outline: none; - font-weight: 500; - - height: 36px; - padding: 0 16px; - background: transparent; - color: inherit; - - &:global([aria-selected=true]):before { - display: block; - } - &:not(:global([aria-selected=true])) { - cursor: pointer; - font-weight: normal; - } - } - ` -); - -type VerticalTabHeaderProps = React.HTMLAttributes & { +type VerticalTabHeaderProps = Omit, 'style'> & { tab: ITab; + style: Style[]; } -export const VerticalTabHeader = observer(function VerticalTabHeader({ tab, ...props }: VerticalTabHeaderProps) { +export const VerticalTabHeader = observer(function VerticalTabHeader({ tab, style, ...props }: VerticalTabHeaderProps) { - return styled(useStyles(styles))( + return styled(useStyles(verticalTabStyles, ...style))( - {tab.icon && ( - - - - )} -
{tab.title}
+ {tab.icon && } + {tab.title}
); }); diff --git a/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabPanel.tsx b/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabPanel.tsx index 3705648649..bc19589b41 100644 --- a/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabPanel.tsx +++ b/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabPanel.tsx @@ -7,36 +7,23 @@ */ import { observer } from 'mobx-react'; -import styled, { css } from 'reshadow'; +import styled from 'reshadow'; -import { composes, useStyles } from '@dbeaver/core/theming'; +import { useStyles, Style } from '@dbeaver/core/theming'; import { ITab } from '../ITab'; import { TabPanel } from '../TabPanel'; +import { verticalTabStyles } from './verticalTabStyles'; -const styles = composes( - css` - TabPanel { - composes: theme-border-color-background from global; - } - `, - css` - TabPanel { - outline: none; - overflow: auto !important; - border-top: 1px solid; - } - `, -); - -type VerticalTabPanelProps = React.HTMLAttributes & { +type VerticalTabPanelProps = Omit, 'style'> & { tab: ITab; + style: Style[]; } -export const VerticalTabPanel = observer(function VerticalTabPanel({ tab }: VerticalTabPanelProps) { +export const VerticalTabPanel = observer(function VerticalTabPanel({ tab, style }: VerticalTabPanelProps) { const Panel = tab.panel; - return styled(useStyles(styles))( + return styled(useStyles(verticalTabStyles, ...style))( diff --git a/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabs.tsx b/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabs.tsx index d620db5e79..536164bfc4 100644 --- a/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabs.tsx +++ b/webapp/packages/core/src/blocks/Tabs/VerticalTabs/VerticalTabs.tsx @@ -7,64 +7,36 @@ */ import { observer } from 'mobx-react'; -import { TabList, useTabState } from 'reakit/Tab'; -import styled, { css } from 'reshadow'; +import styled from 'reshadow'; -import { composes, useStyles } from '@dbeaver/core/theming'; +import { useStyles, Style } from '@dbeaver/core/theming'; import { ITabContainer } from '../ITab'; -import { TabsContext } from '../TabsContext'; +import { TabList } from '../TabList'; +import { TabsState } from '../TabsState'; import { VerticalTabHeader } from './VerticalTabHeader'; import { VerticalTabPanel } from './VerticalTabPanel'; +import { verticalTabStyles } from './verticalTabStyles'; -const tabStyles = composes( - css` - TabList { - composes: theme-background-surface theme-text-on-surface theme-border-color-background from global; - } - `, - css` - vertical-tabs { - display: flex; - flex: 1; - overflow: hidden; - } - TabList { - display: flex; - flex-direction: column; - flex: 0 0 auto; - min-width: 150px; - border-right: 1px solid; - border-top: 1px solid; - overflow: auto; - } - ` -); - -type VerticalTabsProps = React.DOMAttributes & { +type VerticalTabsProps = Omit, 'style'> & { tabContainer: ITabContainer; + style: Style[]; }; -export const VerticalTabs = observer(function VerticalTabs({ tabContainer, ...props }: VerticalTabsProps) { - const tabState = useTabState({ - selectedId: tabContainer.currentTabId, - orientation: 'vertical', - manual: true, - }); - tabState.select(tabContainer.currentTabId); +export const VerticalTabs = observer(function VerticalTabs({ tabContainer, style, ...props }: VerticalTabsProps) { - return styled(useStyles(tabStyles))( - - - + return styled(useStyles(verticalTabStyles, ...style))( + + + {tabContainer.tabs.map(tab => ( - + ))} {tabContainer.tabs.map(tab => ( - + ))} - - + + ); }); diff --git a/webapp/packages/core/src/blocks/Tabs/VerticalTabs/verticalTabStyles.ts b/webapp/packages/core/src/blocks/Tabs/VerticalTabs/verticalTabStyles.ts new file mode 100644 index 0000000000..4b3320eef1 --- /dev/null +++ b/webapp/packages/core/src/blocks/Tabs/VerticalTabs/verticalTabStyles.ts @@ -0,0 +1,28 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { css } from 'reshadow'; + +export const verticalTabStyles = css` + Tab { + border: none !important; + flex-shrink: 0; + height: 36px !important; + } + vertical-tabs { + display: flex; + overflow: hidden; + } + TabList { + display: flex; + flex-direction: column; + flex: 0 0 auto; + min-width: 150px; + overflow: auto; + } +`; diff --git a/webapp/packages/core/src/blocks/Tabs/index.ts b/webapp/packages/core/src/blocks/Tabs/index.ts index 683b15242a..042e4cece0 100644 --- a/webapp/packages/core/src/blocks/Tabs/index.ts +++ b/webapp/packages/core/src/blocks/Tabs/index.ts @@ -10,3 +10,4 @@ export * from './TabsBox/TabsBox'; export * from './TabsBox/TabsBoxFromArray'; export * from './VerticalTabs/VerticalTabs'; +export * from './VerticalTabs/verticalTabStyles'; diff --git a/webapp/packages/core/src/blocks/index.ts b/webapp/packages/core/src/blocks/index.ts index a688b5421a..d494afeccf 100644 --- a/webapp/packages/core/src/blocks/index.ts +++ b/webapp/packages/core/src/blocks/index.ts @@ -1,22 +1,26 @@ -export * from './Icons'; -export * from './Split'; -export * from './StaticImage'; export * from './ComplexLoader'; -export * from './Loader/Loader'; -export * from './StaticImage'; -export * from './Tabs'; -export * from './Button'; -export * from './Radio'; -export * from './InputField'; -export * from './ShadowInput'; -export * from './ErrorMessage'; -export * from './IconOrImage'; -export * from './TextPlaceholder'; -export * from './useClipboard'; -export * from './SubmittingForm'; -export * from './SanitizedHTML/SanitizedHTML'; +export * from './Icons'; export * from './ItemList'; -export * from './PropertiesTable'; -export * from './IconButton'; +export * from './layout/AppLogo'; +export * from './layout/TopAppBar'; +export * from './Loader/Loader'; export * from './Placeholder/Placeholder'; export * from './Placeholder/PlaceholderContainer'; +export * from './PropertiesTable'; +export * from './SanitizedHTML/SanitizedHTML'; +export * from './Split'; +export * from './Table'; +export * from './Tabs'; +export * from './Button'; +export * from './Checkbox'; +export * from './ErrorMessage'; +export * from './IconButton'; +export * from './IconOrImage'; +export * from './InputField'; +export * from './Radio'; +export * from './ShadowInput'; +export * from './StaticImage'; +export * from './SubmittingForm'; +export * from './TextPlaceholder'; +export * from './InFocus'; +export * from './useClipboard'; diff --git a/webapp/packages/core/src/blocks/layout/AppLogo.tsx b/webapp/packages/core/src/blocks/layout/AppLogo.tsx new file mode 100644 index 0000000000..4b074003e5 --- /dev/null +++ b/webapp/packages/core/src/blocks/layout/AppLogo.tsx @@ -0,0 +1,41 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import styled, { css } from 'reshadow'; + +import { Icon } from '../Icons/Icon'; + +const styles = css` + logo { + height: 100%; + display: flex; + align-items: center; + margin-right: 16px; + width: 250px; + cursor: pointer; + } + + Icon { + height: 24px; + width: auto; + margin-bottom: 2px; + } +`; + +type Props = { + title: string; + onClick?: () => void; +} + +export function AppLogo({ title, onClick }: Props) { + return styled(styles)( + + + + ); +} diff --git a/webapp/packages/core/src/app/TopNavBar/topNavBarStyles.ts b/webapp/packages/core/src/blocks/layout/TopAppBar.tsx similarity index 62% rename from webapp/packages/core/src/app/TopNavBar/topNavBarStyles.ts rename to webapp/packages/core/src/blocks/layout/TopAppBar.tsx index 18aa0f60e8..1d28fa0bb0 100644 --- a/webapp/packages/core/src/app/TopNavBar/topNavBarStyles.ts +++ b/webapp/packages/core/src/blocks/layout/TopAppBar.tsx @@ -6,11 +6,11 @@ * you may not use this file except in compliance with the License. */ -import { css } from 'reshadow'; +import styled, { css } from 'reshadow'; -import { composes } from '@dbeaver/core/theming'; +import { useStyles, composes } from '@dbeaver/core/theming'; -export const topNavBarStyles = composes( +export const topAppBarStyles = composes( css` header { composes: theme-background-primary theme-text-on-primary from global; @@ -27,3 +27,11 @@ export const topNavBarStyles = composes( } ` ); + +export function TopAppBar({ children }: React.PropsWithChildren<{}>) { + return styled(useStyles(topAppBarStyles))( +
+ {children} +
+ ); +} diff --git a/webapp/packages/core/src/bootstrap.ts b/webapp/packages/core/src/bootstrap.ts index 87e2a02fe6..1c824d7ad9 100644 --- a/webapp/packages/core/src/bootstrap.ts +++ b/webapp/packages/core/src/bootstrap.ts @@ -13,6 +13,7 @@ export async function bootstrap(plugins: PluginManifest[]) { try { await appBootstrap.init(); + await app.initializeServices(); await app.initializePlugins(); await appBootstrap.doAfterPluginsInit(); await app.load(); diff --git a/webapp/packages/core/src/di/App.ts b/webapp/packages/core/src/di/App.ts index 3e2deee34a..95ced75684 100644 --- a/webapp/packages/core/src/di/App.ts +++ b/webapp/packages/core/src/di/App.ts @@ -6,6 +6,7 @@ * you may not use this file except in compliance with the License. */ +import { Bootstrap } from './Bootstrap'; import { DIContainer } from './DIContainer'; import { RootContainerService } from './entities/RootContainerService'; import { IServiceCollection, IServiceInjector } from './IApp'; @@ -55,6 +56,18 @@ export class App { } } + async initializeServices() { + for (const plugin of this.plugins) { + for (const service of plugin.providers) { + if (service.prototype instanceof Bootstrap) { + const serviceInstance = this.diWrapper.injector.getServiceByClass(service); + + await serviceInstance.bootstrap(); + } + } + } + } + // second phase - run init scripts todo run it based on dependency tree async initializePlugins() { for (const plugin of this.plugins) { diff --git a/webapp/packages/core/src/di/Bootstrap.ts b/webapp/packages/core/src/di/Bootstrap.ts new file mode 100644 index 0000000000..6f7a37b6c2 --- /dev/null +++ b/webapp/packages/core/src/di/Bootstrap.ts @@ -0,0 +1,14 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { injectable } from './injectable'; + +@injectable() +export abstract class Bootstrap { + abstract bootstrap(): void | Promise; +} diff --git a/webapp/packages/core/src/di/index.ts b/webapp/packages/core/src/di/index.ts index e46b7ac9a6..af0b07fbd7 100644 --- a/webapp/packages/core/src/di/index.ts +++ b/webapp/packages/core/src/di/index.ts @@ -1,6 +1,7 @@ export * from './IApp'; export * from './App'; export * from './AppContext'; +export * from './Bootstrap'; export * from './injectable'; export * from './PluginManifest'; export * from './useService'; diff --git a/webapp/packages/core/src/dialogs/CommonDialog/CommonDialog/CommonDialogWrapper.tsx b/webapp/packages/core/src/dialogs/CommonDialog/CommonDialog/CommonDialogWrapper.tsx new file mode 100644 index 0000000000..353522763e --- /dev/null +++ b/webapp/packages/core/src/dialogs/CommonDialog/CommonDialog/CommonDialogWrapper.tsx @@ -0,0 +1,55 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import styled, { use } from 'reshadow'; + +import { Icon } from '@dbeaver/core/blocks'; +import { useStyles } from '@dbeaver/core/theming'; + +import { commonDialogStyle } from './styles'; + +export type CommonDialogWrapperProps = { + title: string; + onReject?: () => void; + className?: string; + noBodyPadding?: boolean; + footer?: JSX.Element | boolean; + header?: JSX.Element | boolean; + children?: React.ReactNode; +} + +export function CommonDialogWrapper({ + title, + header, + footer, + noBodyPadding, + className, + onReject, + children, +}: CommonDialogWrapperProps) { + + return styled(useStyles(commonDialogStyle))( + +
+ +

{title}

+ {onReject && ( + + + + )} +
+ {header} +
+ {children} +
+ {footer} +
+
+ ); +} diff --git a/webapp/packages/core/src/dialogs/CommonDialog/CommonDialogWrapper.tsx b/webapp/packages/core/src/dialogs/CommonDialog/CommonDialog/styles.ts similarity index 58% rename from webapp/packages/core/src/dialogs/CommonDialog/CommonDialogWrapper.tsx rename to webapp/packages/core/src/dialogs/CommonDialog/CommonDialog/styles.ts index 59b526b071..55edba7d76 100644 --- a/webapp/packages/core/src/dialogs/CommonDialog/CommonDialogWrapper.tsx +++ b/webapp/packages/core/src/dialogs/CommonDialog/CommonDialog/styles.ts @@ -6,22 +6,12 @@ * you may not use this file except in compliance with the License. */ -import styled, { css, use } from 'reshadow'; -import { Icon } from '@dbeaver/core/blocks'; -import { composes, useStyles } from '@dbeaver/core/theming'; +import { css } from 'reshadow'; -export type CommonDialogWrapperProps = { - title: string; - onReject?: () => void; - className?: string; - noBodyPadding?: boolean; - footer?: JSX.Element | boolean; - header?: JSX.Element | boolean; - children?: React.ReactNode; -} +import { composes } from '@dbeaver/core/theming'; -const style = composes( +export const commonDialogStyle = composes( css` dialog { composes: theme-background-surface theme-text-on-surface from global; @@ -91,34 +81,3 @@ const style = composes( } ` ); - -export function CommonDialogWrapper({ - title, - header, - footer, - noBodyPadding, - className, - onReject, - children, -}: CommonDialogWrapperProps) { - - return styled(useStyles(style))( - -
- -

{title}

- {onReject && ( - - - - )} -
- {header} -
- {children} -
- {footer} -
-
- ); -} diff --git a/webapp/packages/core/src/dialogs/CommonDialog/CommonDialogService.ts b/webapp/packages/core/src/dialogs/CommonDialog/CommonDialogService.ts index 724e0f2e3f..e94f8fb7c4 100644 --- a/webapp/packages/core/src/dialogs/CommonDialog/CommonDialogService.ts +++ b/webapp/packages/core/src/dialogs/CommonDialog/CommonDialogService.ts @@ -19,6 +19,7 @@ export type DialogComponentProps = { options?: DialogOptions; resolveDialog(result: TResult | null): void; rejectDialog(): void; // the dialog was closed by cancel button or backdrop click + className?: string; } export type DialogComponent = React.ElementType< diff --git a/webapp/packages/core/src/dialogs/CommonDialog/ConfirmationDialog.tsx b/webapp/packages/core/src/dialogs/CommonDialog/ConfirmationDialog.tsx new file mode 100644 index 0000000000..24560175d1 --- /dev/null +++ b/webapp/packages/core/src/dialogs/CommonDialog/ConfirmationDialog.tsx @@ -0,0 +1,74 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +import { useCallback } from 'react'; +import styled, { css } from 'reshadow'; + +import { Icon, Button } from '@dbeaver/core/blocks'; +import { Translate } from '@dbeaver/core/localization'; +import { useStyles } from '@dbeaver/core/theming'; + +import { commonDialogStyle } from './CommonDialog/styles'; +import { DialogComponentProps } from './CommonDialogService'; + +const style = css` + footer { + align-items: center; + justify-content: flex-end; + } + + fill { + flex: 1; + } +`; + +export interface ConfirmationDialogPayload { + title: string; + message: string; +} + +export function ConfirmationDialog({ + payload, + resolveDialog, + rejectDialog, + className, +}: DialogComponentProps) { + const handleReject = useCallback(() => resolveDialog(false), [resolveDialog]); + const handleResolve = useCallback(() => resolveDialog(true), [resolveDialog]); + + return styled(useStyles(commonDialogStyle, style))( + +
+ +

+ + + +
+
+ +
+ + + +
+
+ ); +} diff --git a/webapp/packages/core/src/dialogs/CommonDialog/DialogsPortal.tsx b/webapp/packages/core/src/dialogs/CommonDialog/DialogsPortal.tsx index 15e77e73be..0bd7188453 100644 --- a/webapp/packages/core/src/dialogs/CommonDialog/DialogsPortal.tsx +++ b/webapp/packages/core/src/dialogs/CommonDialog/DialogsPortal.tsx @@ -7,7 +7,7 @@ */ import { observer } from 'mobx-react'; -import { useCallback } from 'react'; +import { useCallback, useRef, useLayoutEffect } from 'react'; import { Dialog, DialogBackdrop, @@ -58,6 +58,7 @@ type NestedDialogType = { function NestedDialog(props: NestedDialogType) { const dialogState = useDialogState(); const styles = useStyles(dialogStyles); + const refToDialog = useRef(); dialogState.visible = props.visible; const handleReject = useCallback(() => props.rejectDialog(props.dialog), [props.dialog, props.rejectDialog]); const handleResolve = useCallback( @@ -71,12 +72,15 @@ function NestedDialog(props: NestedDialogType) { }, [props.dialog.options?.persistent, handleReject]); const DialogComponent = props.dialog.component; + useLayoutEffect(() => { + refToDialog.current?.removeAttribute('tabIndex'); + }, [refToDialog.current]); // TODO: place Dialog inside CommonDialogWrapper, so we can pass aria-label return styled(styles)( <> - + - {children} + + {children} + @@ -143,7 +145,9 @@ export const MenuInnerTrigger = forwardRef(function MenuInnerTrigger( return styled(useStyles(menuPanelStyles, ...style))( <> - + + + diff --git a/webapp/packages/core/src/dialogs/Menu/MenuPanel/menuPanelStyles.ts b/webapp/packages/core/src/dialogs/Menu/MenuPanel/menuPanelStyles.ts index b1baf232bb..407f6c24e2 100644 --- a/webapp/packages/core/src/dialogs/Menu/MenuPanel/menuPanelStyles.ts +++ b/webapp/packages/core/src/dialogs/Menu/MenuPanel/menuPanelStyles.ts @@ -30,8 +30,13 @@ export const menuPanelStyles = composes( outline: none !important; color: inherit; cursor: pointer; - display: flex; padding: 12px 0; + + & box { + display: flex; + align-items: center; + height: inherit; + } } Menu { composes: theme-typography--body2 theme-elevation-z5 from global; diff --git a/webapp/packages/core/src/dialogs/SessionExpire/SessionExpiredDialog.tsx b/webapp/packages/core/src/dialogs/SessionExpire/SessionExpiredDialog.tsx index 66176949c1..27b34ff217 100644 --- a/webapp/packages/core/src/dialogs/SessionExpire/SessionExpiredDialog.tsx +++ b/webapp/packages/core/src/dialogs/SessionExpire/SessionExpiredDialog.tsx @@ -14,8 +14,8 @@ import { Button } from '@dbeaver/core/blocks'; import { useTranslate } from '@dbeaver/core/localization'; import { useStyles } from '@dbeaver/core/theming'; +import { CommonDialogWrapper } from '../CommonDialog/CommonDialog/CommonDialogWrapper'; import { DialogComponent } from '../CommonDialog/CommonDialogService'; -import { CommonDialogWrapper } from '../CommonDialog/CommonDialogWrapper'; const styles = css` dialog-content { diff --git a/webapp/packages/core/src/dialogs/index.ts b/webapp/packages/core/src/dialogs/index.ts index 01d5b7d111..691d8ac6db 100644 --- a/webapp/packages/core/src/dialogs/index.ts +++ b/webapp/packages/core/src/dialogs/index.ts @@ -1,5 +1,6 @@ +export * from './CommonDialog/CommonDialog/CommonDialogWrapper'; export * from './CommonDialog/CommonDialogService'; -export * from './CommonDialog/CommonDialogWrapper'; +export * from './CommonDialog/ConfirmationDialog'; export * from './CommonDialog/DialogsPortal'; export * from './Menu/IMenuPanel'; diff --git a/webapp/packages/core/src/localization/LocalizationService.ts b/webapp/packages/core/src/localization/LocalizationService.ts index 8e4b4f7d3f..6a8d04af20 100644 --- a/webapp/packages/core/src/localization/LocalizationService.ts +++ b/webapp/packages/core/src/localization/LocalizationService.ts @@ -8,7 +8,6 @@ import { action, observable } from 'mobx'; -import defaultLocale from '@dbeaver/core/assets/locales/en'; import { injectable } from '@dbeaver/core/di'; import { NotificationService } from '@dbeaver/core/eventsLog'; import { SessionService, ServerService } from '@dbeaver/core/root'; @@ -42,9 +41,6 @@ export class LocalizationService { private serverService: ServerService, private graphQLService: GraphQLService, private settingsService: SettingsService) { - - // note that the default locale is always embedded in the build - this.localeMap.set(DEFAULT_LOCALE_NAME, defaultLocale); } readonly translate = (token: TLocalizationToken): string => { @@ -84,6 +80,7 @@ export class LocalizationService { async init() { const session = await this.sessionService.session.load(); const config = await this.serverService.config.load(); + await this.loadLocaleAsync(DEFAULT_LOCALE_NAME); if (!session || !config) { return; @@ -126,8 +123,9 @@ export class LocalizationService { return; } try { - const locale = await import(`@dbeaver/core/assets/locales/${key}`); - this.localeMap.set(key, locale.default); + const response = await fetch(`locales/${key}.json`); + const locale = await response.json() as Locale; + this.localeMap.set(key, locale); } catch (error) { this.notificationService.logException(error, 'Locale is not found', true); } diff --git a/webapp/packages/core/src/manifest.ts b/webapp/packages/core/src/manifest.ts index 761a3cd237..1f7a189c28 100644 --- a/webapp/packages/core/src/manifest.ts +++ b/webapp/packages/core/src/manifest.ts @@ -12,6 +12,7 @@ import { ConnectionSchemaManagerService, NavigationTabsService, NavigationTreeContextMenuService, SettingsMenuService, LogViewerService, LogViewerMenuService, TopNavService, + RouterService, ScreenService, AppScreenService } from '@dbeaver/core/app'; import { PluginManifest } from '@dbeaver/core/di'; import { CommonDialogService, ContextMenuService, SessionExpireService } from '@dbeaver/core/dialogs'; @@ -46,6 +47,9 @@ export const coreManifest: PluginManifest = { ConnectionDialogsService, ConnectionSchemaManagerService, ConnectionsManagerService, + RouterService, + ScreenService, + AppScreenService, ContextMenuService, EnvironmentService, ExceptionsCatcherService, diff --git a/webapp/packages/core/src/queries/Authentication/Users/createUser.gql b/webapp/packages/core/src/queries/Authentication/Users/createUser.gql new file mode 100644 index 0000000000..9ab9dc119d --- /dev/null +++ b/webapp/packages/core/src/queries/Authentication/Users/createUser.gql @@ -0,0 +1,9 @@ +query createUser($userId: ID!) { + user: createUser(userId: $userId) { + userId + + #metaParameters + #configurationParameters + grantedRoles + } +} \ No newline at end of file diff --git a/webapp/packages/core/src/queries/Authentication/Users/deleteUser.gql b/webapp/packages/core/src/queries/Authentication/Users/deleteUser.gql new file mode 100644 index 0000000000..bf6e1fbc9a --- /dev/null +++ b/webapp/packages/core/src/queries/Authentication/Users/deleteUser.gql @@ -0,0 +1,3 @@ +query deleteUser($userId: ID!) { + deleteUser(userId: $userId) +} \ No newline at end of file diff --git a/webapp/packages/core/src/queries/Authentication/Users/getPermissionsList.gql b/webapp/packages/core/src/queries/Authentication/Users/getPermissionsList.gql new file mode 100644 index 0000000000..ba043e0904 --- /dev/null +++ b/webapp/packages/core/src/queries/Authentication/Users/getPermissionsList.gql @@ -0,0 +1,10 @@ +query getPermissionsList($roleId: ID) { + permissions: listPermissions { + id + label + description + + provider + category + } +} \ No newline at end of file diff --git a/webapp/packages/core/src/queries/Authentication/Users/getRolesList.gql b/webapp/packages/core/src/queries/Authentication/Users/getRolesList.gql new file mode 100644 index 0000000000..b7a323567a --- /dev/null +++ b/webapp/packages/core/src/queries/Authentication/Users/getRolesList.gql @@ -0,0 +1,8 @@ +query getRolesList($roleId: ID) { + roles: listRoles(roleId: $roleId) { + roleId + roleName + + #rolePermissions + } +} \ No newline at end of file diff --git a/webapp/packages/core/src/queries/Authentication/Users/getUsersList.gql b/webapp/packages/core/src/queries/Authentication/Users/getUsersList.gql new file mode 100644 index 0000000000..d4375ca038 --- /dev/null +++ b/webapp/packages/core/src/queries/Authentication/Users/getUsersList.gql @@ -0,0 +1,9 @@ +query getUsersList($userId: ID) { + users: listUsers(userId: $userId) { + userId + + #metaParameters + #configurationParameters + grantedRoles + } +} \ No newline at end of file diff --git a/webapp/packages/core/src/queries/Authentication/Users/grantUserRole.gql b/webapp/packages/core/src/queries/Authentication/Users/grantUserRole.gql new file mode 100644 index 0000000000..b0e3c5325f --- /dev/null +++ b/webapp/packages/core/src/queries/Authentication/Users/grantUserRole.gql @@ -0,0 +1,3 @@ +query grantUserRole($userId: ID!, $roleId: ID!) { + grantUserRole(userId: $userId, roleId: $roleId) +} \ No newline at end of file diff --git a/webapp/packages/core/src/queries/Authentication/Users/setUserCredentials.gql b/webapp/packages/core/src/queries/Authentication/Users/setUserCredentials.gql new file mode 100644 index 0000000000..61f975b467 --- /dev/null +++ b/webapp/packages/core/src/queries/Authentication/Users/setUserCredentials.gql @@ -0,0 +1,3 @@ +query setUserCredentials($userId: ID!, $providerId: ID!, $credentials: Object!) { + setUserCredentials(userId: $userId, providerId: $providerId, credentials: $credentials) +} \ No newline at end of file diff --git a/webapp/packages/core/src/sdk/sdk.ts b/webapp/packages/core/src/sdk/sdk.ts index bebdd4e831..f424d9d083 100644 --- a/webapp/packages/core/src/sdk/sdk.ts +++ b/webapp/packages/core/src/sdk/sdk.ts @@ -1,6 +1,5 @@ /* eslint-disable max-len */ import { GraphQLClient } from 'graphql-request'; - export type Maybe = T; /** All built-in and custom scalars, mapped to their actual values */ @@ -14,122 +13,189 @@ export type Scalars = { DateTime: any; }; - -export type Query = { - authLogin: UserAuthInfo; - authLogout?: Maybe; - authProviders: Array; - connectionState: ConnectionInfo; - dataSourceList: Array; - dataTransferAvailableStreamProcessors: Array; - dataTransferExportDataFromContainer: AsyncTaskInfo; - dataTransferExportDataFromResults: AsyncTaskInfo; - dataTransferRemoveDataFile?: Maybe; - driverList: Array; - metadataGetNodeDDL?: Maybe; - navGetStructContainers: DatabaseStructContainers; - navNodeChildren: Array; - navNodeInfo: NavigatorNodeInfo; - navRefreshNode?: Maybe; - readSessionLog: Array; - serverConfig: ServerConfig; - sessionPermissions: Array>; - sessionState: SessionInfo; - sessionUser?: Maybe; - sqlCompletionProposals?: Maybe>>; - sqlDialectInfo?: Maybe; - sqlListContexts?: Maybe>>; -}; - - -export type QueryAuthLoginArgs = { - provider: Scalars['ID']; - credentials: Scalars['Object']; -}; - - -export type QueryConnectionStateArgs = { +export type AdminPermissionInfo = { id: Scalars['ID']; + label?: Maybe; + description?: Maybe; + provider: Scalars['String']; + category?: Maybe; +}; + +export type AdminRoleInfo = { + roleId: Scalars['ID']; + roleName?: Maybe; + rolePermissions: Array>; +}; + +export type AdminUserInfo = { + userId: Scalars['ID']; + metaParameters: Scalars['Object']; + configurationParameters: Scalars['Object']; + grantedRoles: Array>; +}; + +export type AsyncTaskInfo = { + id: Scalars['String']; + name?: Maybe; + running: Scalars['Boolean']; + status?: Maybe; + error?: Maybe; + result?: Maybe; + taskResult?: Maybe; +}; + +export enum AuthCredentialEncryption { + None = 'none', + Plain = 'plain', + Hash = 'hash' +} + +export type AuthCredentialInfo = { + id: Scalars['ID']; + displayName: Scalars['String']; + description?: Maybe; + admin?: Maybe; + user?: Maybe; + possibleValues?: Maybe>>; + encryption?: Maybe; +}; + +export type AuthProviderInfo = { + id: Scalars['ID']; + label: Scalars['String']; + icon?: Maybe; + description?: Maybe; + defaultProvider?: Maybe; + credentialParameters: Array; +}; + +export type ConnectionConfig = { + name?: Maybe; + description?: Maybe; + dataSourceId?: Maybe; + driverId?: Maybe; + host?: Maybe; + port?: Maybe; + databaseName?: Maybe; + url?: Maybe; + properties?: Maybe; + userName?: Maybe; + userPassword?: Maybe; +}; + +export type ConnectionInfo = { + id: Scalars['ID']; + driverId: Scalars['ID']; + name: Scalars['String']; + description?: Maybe; + properties?: Maybe; + connected: Scalars['Boolean']; + provided: Scalars['Boolean']; + connectTime?: Maybe; + connectionError?: Maybe; + serverVersion?: Maybe; + clientVersion?: Maybe; + features: Array; +}; + +export type DatabaseObjectInfo = { + name?: Maybe; + description?: Maybe; + type?: Maybe; + properties?: Maybe>>; + ordinalPosition?: Maybe; + fullyQualifiedName?: Maybe; + overloadedName?: Maybe; + uniqueName?: Maybe; + state?: Maybe; + features?: Maybe>>; + editors?: Maybe>>; }; -export type QueryDataTransferExportDataFromContainerArgs = { - connectionId: Scalars['ID']; - containerNodePath: Scalars['ID']; - parameters: DataTransferParameters; +export type DatabaseObjectInfoPropertiesArgs = { + filter?: Maybe; +}; + +export type DatabaseStructContainers = { + catalogList: Array; + schemaList: Array; +}; + +export type DataSourceInfo = { + id: Scalars['ID']; + driverId: Scalars['ID']; + name: Scalars['String']; + description?: Maybe; + host?: Maybe; + server?: Maybe; + port?: Maybe; + url?: Maybe; + properties?: Maybe; +}; + +export type DataTransferParameters = { + processorId: Scalars['ID']; + settings?: Maybe; + processorProperties: Scalars['Object']; + filter?: Maybe; +}; + +export type DataTransferProcessorInfo = { + id: Scalars['ID']; + name?: Maybe; + description?: Maybe; + fileExtension?: Maybe; + appFileExtension?: Maybe; + appName?: Maybe; + order: Scalars['Int']; + icon?: Maybe; + properties?: Maybe>>; + isBinary?: Maybe; + isHTML?: Maybe; }; -export type QueryDataTransferExportDataFromResultsArgs = { - connectionId: Scalars['ID']; - contextId: Scalars['ID']; - resultsId: Scalars['ID']; - parameters: DataTransferParameters; +export type DriverInfo = { + id: Scalars['ID']; + name?: Maybe; + description?: Maybe; + icon?: Maybe; + iconBig?: Maybe; + providerId?: Maybe; + driverClassName?: Maybe; + defaultPort?: Maybe; + sampleURL?: Maybe; + driverInfoURL?: Maybe; + driverPropertiesURL?: Maybe; + embedded?: Maybe; + anonymousAccess?: Maybe; + allowsEmptyPassword?: Maybe; + licenseRequired?: Maybe; + license?: Maybe; + custom?: Maybe; + promotedScore?: Maybe; + connectionProperties?: Maybe; + defaultConnectionProperties?: Maybe; + driverProperties?: Maybe>>; + driverParameters?: Maybe; }; - -export type QueryDataTransferRemoveDataFileArgs = { - dataFileId: Scalars['String']; +export type DriverPropertyInfo = { + id: Scalars['ID']; + displayName?: Maybe; + description?: Maybe; + category?: Maybe; + dataType?: Maybe; + defaultValue?: Maybe; + validValues?: Maybe>>; }; - -export type QueryDriverListArgs = { - id?: Maybe; -}; - - -export type QueryMetadataGetNodeDdlArgs = { - nodeId: Scalars['ID']; - options?: Maybe; -}; - - -export type QueryNavGetStructContainersArgs = { - connectionId: Scalars['ID']; - catalog?: Maybe; -}; - - -export type QueryNavNodeChildrenArgs = { - parentPath: Scalars['ID']; - offset?: Maybe; - limit?: Maybe; - onlyFolders?: Maybe; -}; - - -export type QueryNavNodeInfoArgs = { - nodePath: Scalars['ID']; -}; - - -export type QueryNavRefreshNodeArgs = { - nodePath: Scalars['ID']; -}; - - -export type QueryReadSessionLogArgs = { - maxEntries?: Maybe; - clearEntries?: Maybe; -}; - - -export type QuerySqlCompletionProposalsArgs = { - connectionId: Scalars['ID']; - contextId: Scalars['ID']; - query: Scalars['String']; - position: Scalars['Int']; - maxResults?: Maybe; -}; - - -export type QuerySqlDialectInfoArgs = { - connectionId: Scalars['ID']; -}; - - -export type QuerySqlListContextsArgs = { - connectionId: Scalars['ID']; +export type LogEntry = { + time?: Maybe; + type: Scalars['String']; + message?: Maybe; + stackTrace?: Maybe; }; export type Mutation = { @@ -249,39 +315,230 @@ export type MutationUpdateResultsDataArgs = { updateValues?: Maybe; }; -export type AsyncTaskInfo = { - id: Scalars['String']; +export type NavigatorNodeInfo = { + id: Scalars['ID']; name?: Maybe; - running: Scalars['Boolean']; - status?: Maybe; - error?: Maybe; - result?: Maybe; - taskResult?: Maybe; + icon?: Maybe; + description?: Maybe; + nodeType?: Maybe; + hasChildren?: Maybe; + object?: Maybe; + features?: Maybe>>; + folder?: Maybe; + inline?: Maybe; + navigable?: Maybe; }; -export type ServerError = { - message?: Maybe; - errorCode?: Maybe; - stackTrace?: Maybe; - causedBy?: Maybe; -}; -export type ServerMessage = { - time?: Maybe; - message?: Maybe; -}; - -export type ServerLanguage = { - isoCode: Scalars['String']; +export type ObjectDescriptor = { + id?: Maybe; displayName?: Maybe; - nativeName?: Maybe; + fullName?: Maybe; + uniqueName?: Maybe; + description?: Maybe; + value?: Maybe; }; -export type WebServiceConfig = { - id: Scalars['String']; - name: Scalars['String']; - description: Scalars['String']; - bundleVersion: Scalars['String']; +export type ObjectPropertyFilter = { + ids?: Maybe>>; + features?: Maybe>>; + categories?: Maybe>>; + dataTypes?: Maybe>>; +}; + +export type ObjectPropertyInfo = { + id?: Maybe; + displayName?: Maybe; + description?: Maybe; + category?: Maybe; + dataType?: Maybe; + value?: Maybe; + validValues?: Maybe>>; + defaultValue?: Maybe; + features: Array; +}; + +export type Query = { + authLogin: UserAuthInfo; + authLogout?: Maybe; + authProviders: Array; + connectionState: ConnectionInfo; + createRole: AdminRoleInfo; + createUser: AdminUserInfo; + dataSourceList: Array; + dataTransferAvailableStreamProcessors: Array; + dataTransferExportDataFromContainer: AsyncTaskInfo; + dataTransferExportDataFromResults: AsyncTaskInfo; + dataTransferRemoveDataFile?: Maybe; + deleteRole?: Maybe; + deleteUser?: Maybe; + driverList: Array; + grantUserRole?: Maybe; + listPermissions: Array>; + listRoles: Array>; + listUsers: Array>; + metadataGetNodeDDL?: Maybe; + navGetStructContainers: DatabaseStructContainers; + navNodeChildren: Array; + navNodeInfo: NavigatorNodeInfo; + navRefreshNode?: Maybe; + readSessionLog: Array; + revokeUserRole?: Maybe; + serverConfig: ServerConfig; + sessionPermissions: Array>; + sessionState: SessionInfo; + sessionUser?: Maybe; + setRolePermissions?: Maybe; + setUserCredentials?: Maybe; + sqlCompletionProposals?: Maybe>>; + sqlDialectInfo?: Maybe; + sqlListContexts?: Maybe>>; +}; + + +export type QueryAuthLoginArgs = { + provider: Scalars['ID']; + credentials: Scalars['Object']; +}; + + +export type QueryConnectionStateArgs = { + id: Scalars['ID']; +}; + + +export type QueryCreateRoleArgs = { + roleId: Scalars['ID']; +}; + + +export type QueryCreateUserArgs = { + userId: Scalars['ID']; +}; + + +export type QueryDataTransferExportDataFromContainerArgs = { + connectionId: Scalars['ID']; + containerNodePath: Scalars['ID']; + parameters: DataTransferParameters; +}; + + +export type QueryDataTransferExportDataFromResultsArgs = { + connectionId: Scalars['ID']; + contextId: Scalars['ID']; + resultsId: Scalars['ID']; + parameters: DataTransferParameters; +}; + + +export type QueryDataTransferRemoveDataFileArgs = { + dataFileId: Scalars['String']; +}; + + +export type QueryDeleteRoleArgs = { + roleId: Scalars['ID']; +}; + + +export type QueryDeleteUserArgs = { + userId: Scalars['ID']; +}; + + +export type QueryDriverListArgs = { + id?: Maybe; +}; + + +export type QueryGrantUserRoleArgs = { + userId: Scalars['ID']; + roleId: Scalars['ID']; +}; + + +export type QueryListRolesArgs = { + roleId?: Maybe; +}; + + +export type QueryListUsersArgs = { + userId?: Maybe; +}; + + +export type QueryMetadataGetNodeDdlArgs = { + nodeId: Scalars['ID']; + options?: Maybe; +}; + + +export type QueryNavGetStructContainersArgs = { + connectionId: Scalars['ID']; + catalog?: Maybe; +}; + + +export type QueryNavNodeChildrenArgs = { + parentPath: Scalars['ID']; + offset?: Maybe; + limit?: Maybe; + onlyFolders?: Maybe; +}; + + +export type QueryNavNodeInfoArgs = { + nodePath: Scalars['ID']; +}; + + +export type QueryNavRefreshNodeArgs = { + nodePath: Scalars['ID']; +}; + + +export type QueryReadSessionLogArgs = { + maxEntries?: Maybe; + clearEntries?: Maybe; +}; + + +export type QueryRevokeUserRoleArgs = { + userId: Scalars['ID']; + roleId: Scalars['ID']; +}; + + +export type QuerySetRolePermissionsArgs = { + roleId: Scalars['ID']; + permissions: Array>; +}; + + +export type QuerySetUserCredentialsArgs = { + userId: Scalars['ID']; + providerId: Scalars['ID']; + credentials: Scalars['Object']; +}; + + +export type QuerySqlCompletionProposalsArgs = { + connectionId: Scalars['ID']; + contextId: Scalars['ID']; + query: Scalars['String']; + position: Scalars['Int']; + maxResults?: Maybe; +}; + + +export type QuerySqlDialectInfoArgs = { + connectionId: Scalars['ID']; +}; + + +export type QuerySqlListContextsArgs = { + connectionId: Scalars['ID']; }; export type ServerConfig = { @@ -299,6 +556,24 @@ export type ServerConfig = { productConfiguration: Scalars['Object']; }; +export type ServerError = { + message?: Maybe; + errorCode?: Maybe; + stackTrace?: Maybe; + causedBy?: Maybe; +}; + +export type ServerLanguage = { + isoCode: Scalars['String']; + displayName?: Maybe; + nativeName?: Maybe; +}; + +export type ServerMessage = { + time?: Maybe; + message?: Maybe; +}; + export type SessionInfo = { createTime: Scalars['String']; lastAccessTime: Scalars['String']; @@ -308,168 +583,6 @@ export type SessionInfo = { connections: Array; }; -export type DriverInfo = { - id: Scalars['ID']; - name?: Maybe; - description?: Maybe; - icon?: Maybe; - iconBig?: Maybe; - providerId?: Maybe; - driverClassName?: Maybe; - defaultPort?: Maybe; - sampleURL?: Maybe; - driverInfoURL?: Maybe; - driverPropertiesURL?: Maybe; - embedded?: Maybe; - anonymousAccess?: Maybe; - allowsEmptyPassword?: Maybe; - licenseRequired?: Maybe; - license?: Maybe; - custom?: Maybe; - promotedScore?: Maybe; - connectionProperties?: Maybe; - defaultConnectionProperties?: Maybe; - driverProperties?: Maybe>>; - driverParameters?: Maybe; -}; - -export type DriverPropertyInfo = { - id: Scalars['ID']; - displayName?: Maybe; - description?: Maybe; - category?: Maybe; - dataType?: Maybe; - defaultValue?: Maybe; - validValues?: Maybe>>; -}; - -export type DataSourceInfo = { - id: Scalars['ID']; - driverId: Scalars['ID']; - name: Scalars['String']; - description?: Maybe; - host?: Maybe; - server?: Maybe; - port?: Maybe; - url?: Maybe; - properties?: Maybe; -}; - -export type ConnectionConfig = { - name?: Maybe; - description?: Maybe; - dataSourceId?: Maybe; - driverId?: Maybe; - host?: Maybe; - port?: Maybe; - databaseName?: Maybe; - url?: Maybe; - properties?: Maybe; - userName?: Maybe; - userPassword?: Maybe; -}; - -export type ConnectionInfo = { - id: Scalars['ID']; - driverId: Scalars['ID']; - name: Scalars['String']; - description?: Maybe; - properties?: Maybe; - connected: Scalars['Boolean']; - provided: Scalars['Boolean']; - connectTime?: Maybe; - connectionError?: Maybe; - serverVersion?: Maybe; - clientVersion?: Maybe; - features: Array; -}; - -export type LogEntry = { - time?: Maybe; - type: Scalars['String']; - message?: Maybe; - stackTrace?: Maybe; -}; - -export type ObjectDescriptor = { - id?: Maybe; - displayName?: Maybe; - fullName?: Maybe; - uniqueName?: Maybe; - description?: Maybe; - value?: Maybe; -}; - -export type ObjectPropertyInfo = { - id?: Maybe; - displayName?: Maybe; - description?: Maybe; - category?: Maybe; - dataType?: Maybe; - value?: Maybe; - validValues?: Maybe>>; - defaultValue?: Maybe; - features: Array; -}; - -export type ObjectPropertyFilter = { - ids?: Maybe>>; - features?: Maybe>>; - categories?: Maybe>>; - dataTypes?: Maybe>>; -}; - -export type DatabaseObjectInfo = { - name?: Maybe; - description?: Maybe; - type?: Maybe; - properties?: Maybe>>; - ordinalPosition?: Maybe; - fullyQualifiedName?: Maybe; - overloadedName?: Maybe; - uniqueName?: Maybe; - state?: Maybe; - features?: Maybe>>; - editors?: Maybe>>; -}; - - -export type DatabaseObjectInfoPropertiesArgs = { - filter?: Maybe; -}; - -export type NavigatorNodeInfo = { - id: Scalars['ID']; - name?: Maybe; - icon?: Maybe; - description?: Maybe; - nodeType?: Maybe; - hasChildren?: Maybe; - object?: Maybe; - features?: Maybe>>; - folder?: Maybe; - inline?: Maybe; - navigable?: Maybe; -}; - -export type DatabaseStructContainers = { - catalogList: Array; - schemaList: Array; -}; - -export type SqlDialectInfo = { - name?: Maybe; - dataTypes?: Maybe>>; - functions?: Maybe>>; - reservedWords?: Maybe>>; - quoteStrings?: Maybe>>>>; - singleLineComments?: Maybe>>; - multiLineComments?: Maybe>>>>; - catalogSeparator?: Maybe; - structSeparator?: Maybe; - scriptDelimiter?: Maybe; -}; - export type SqlCompletionProposal = { displayString?: Maybe; type?: Maybe; @@ -488,6 +601,14 @@ export type SqlContextInfo = { defaultSchema?: Maybe; }; +export type SqlDataFilter = { + offset?: Maybe; + limit?: Maybe; + constraints?: Maybe>>; + where?: Maybe; + orderBy?: Maybe; +}; + export type SqlDataFilterConstraint = { attribute: Scalars['String']; orderPosition?: Maybe; @@ -497,11 +618,30 @@ export type SqlDataFilterConstraint = { value?: Maybe; }; -export type SqlDataFilter = { - offset?: Maybe; - limit?: Maybe; - constraints?: Maybe>>; - where?: Maybe; +export type SqlDialectInfo = { + name?: Maybe; + dataTypes?: Maybe>>; + functions?: Maybe>>; + reservedWords?: Maybe>>; + quoteStrings?: Maybe>>>>; + singleLineComments?: Maybe>>; + multiLineComments?: Maybe>>>>; + catalogSeparator?: Maybe; + structSeparator?: Maybe; + scriptDelimiter?: Maybe; +}; + +export type SqlExecuteInfo = { + statusMessage?: Maybe; + duration?: Maybe; + results: Array; +}; + +export type SqlQueryResults = { + title?: Maybe; + updateRowCount?: Maybe; + sourceQuery?: Maybe; + resultSet?: Maybe; }; export type SqlResultColumn = { @@ -525,44 +665,6 @@ export type SqlResultSet = { hasMoreData?: Maybe; }; -export type SqlQueryResults = { - title?: Maybe; - updateRowCount?: Maybe; - sourceQuery?: Maybe; - resultSet?: Maybe; -}; - -export type SqlExecuteInfo = { - statusMessage?: Maybe; - duration?: Maybe; - results: Array; -}; - -export enum AuthCredentialEncryption { - None = 'none', - Plain = 'plain', - Hash = 'hash' -} - -export type AuthCredentialInfo = { - id: Scalars['ID']; - displayName: Scalars['String']; - description?: Maybe; - admin?: Maybe; - user?: Maybe; - possibleValues?: Maybe>>; - encryption?: Maybe; -}; - -export type AuthProviderInfo = { - id: Scalars['ID']; - label: Scalars['String']; - icon?: Maybe; - description?: Maybe; - defaultProvider?: Maybe; - credentialParameters: Array; -}; - export type UserAuthInfo = { userId: Scalars['String']; displayName?: Maybe; @@ -571,25 +673,11 @@ export type UserAuthInfo = { message?: Maybe; }; -export type DataTransferProcessorInfo = { - id: Scalars['ID']; - name?: Maybe; - description?: Maybe; - fileExtension?: Maybe; - appFileExtension?: Maybe; - appName?: Maybe; - order: Scalars['Int']; - icon?: Maybe; - properties?: Maybe>>; - isBinary?: Maybe; - isHTML?: Maybe; -}; - -export type DataTransferParameters = { - processorId: Scalars['ID']; - settings?: Maybe; - processorProperties: Scalars['Object']; - filter?: Maybe; +export type WebServiceConfig = { + id: Scalars['String']; + name: Scalars['String']; + description: Scalars['String']; + bundleVersion: Scalars['String']; }; export type NavGetStructContainersQueryVariables = { @@ -598,7 +686,7 @@ export type NavGetStructContainersQueryVariables = { }; -export type NavGetStructContainersQuery = { navGetStructContainers: { catalogList: Array>; schemaList: Array> } }; +export type NavGetStructContainersQuery = { navGetStructContainers: { catalogList: Array>, schemaList: Array> } }; export type CloseConnectionMutationVariables = { id: Scalars['ID']; @@ -639,7 +727,7 @@ export type DriverPropertiesQueryVariables = { export type DriverPropertiesQuery = { driver: Array<( Pick & { driverProperties?: Maybe>>> } - )>; }; + )> }; export type GetDriverByIdQueryVariables = { driverId: Scalars['ID']; @@ -670,7 +758,7 @@ export type NavNodeChildrenQueryVariables = { export type NavNodeChildrenQuery = { navNodeChildren: Array<( Pick & { object?: Maybe> } - )>; }; + )> }; export type NavNodeInfoQueryVariables = { nodePath: Scalars['ID']; @@ -680,7 +768,14 @@ export type NavNodeInfoQueryVariables = { export type NavNodeInfoQuery = { navNodeInfo: ( Pick & { object?: Maybe> } - ); }; + ) }; + +export type NavRefreshNodeQueryVariables = { + nodePath: Scalars['ID']; +}; + + +export type NavRefreshNodeQuery = Pick; export type QueryChildrenDatabaseObjectInfoQueryVariables = { nodePath: Scalars['ID']; @@ -693,8 +788,8 @@ export type QueryChildrenDatabaseObjectInfoQuery = { childrenDatabaseObjectInfo: & { object?: Maybe<( Pick & { properties?: Maybe>>> } - )>; } - )>; }; + )> } + )> }; export type QueryDatabaseObjectInfoQueryVariables = { nodeId: Scalars['ID']; @@ -707,8 +802,8 @@ export type QueryDatabaseObjectInfoQuery = { objectInfo: ( & { object?: Maybe<( Pick & { properties?: Maybe>>> } - )>; } - ); }; + )> } + ) }; export type ReadSessionLogQueryVariables = { maxEntries: Scalars['Int']; @@ -725,6 +820,58 @@ export type ChangeSessionLanguageMutationVariables = { export type ChangeSessionLanguageMutation = Pick; +export type CreateUserQueryVariables = { + userId: Scalars['ID']; +}; + + +export type CreateUserQuery = { user: Pick }; + +export type DeleteUserQueryVariables = { + userId: Scalars['ID']; +}; + + +export type DeleteUserQuery = Pick; + +export type GetPermissionsListQueryVariables = { + roleId?: Maybe; +}; + + +export type GetPermissionsListQuery = { permissions: Array>> }; + +export type GetRolesListQueryVariables = { + roleId?: Maybe; +}; + + +export type GetRolesListQuery = { roles: Array>> }; + +export type GetUsersListQueryVariables = { + userId?: Maybe; +}; + + +export type GetUsersListQuery = { users: Array>> }; + +export type GrantUserRoleQueryVariables = { + userId: Scalars['ID']; + roleId: Scalars['ID']; +}; + + +export type GrantUserRoleQuery = Pick; + +export type SetUserCredentialsQueryVariables = { + userId: Scalars['ID']; + providerId: Scalars['ID']; + credentials: Scalars['Object']; +}; + + +export type SetUserCredentialsQuery = Pick; + export type AuthLoginQueryVariables = { provider: Scalars['ID']; credentials: Scalars['Object']; @@ -744,7 +891,7 @@ export type GetAuthProvidersQueryVariables = {}; export type GetAuthProvidersQuery = { providers: Array<( Pick & { credentialParameters: Array> } - )>; }; + )> }; export type GetSessionUserQueryVariables = {}; @@ -759,7 +906,7 @@ export type AsyncExportTaskStatusMutationVariables = { export type AsyncExportTaskStatusMutation = { taskInfo: ( Pick & { error?: Maybe> } - ); }; + ) }; export type ExportDataFromContainerQueryVariables = { connectionId: Scalars['ID']; @@ -771,7 +918,7 @@ export type ExportDataFromContainerQueryVariables = { export type ExportDataFromContainerQuery = { taskInfo: ( Pick & { error?: Maybe> } - ); }; + ) }; export type ExportDataFromResultsQueryVariables = { connectionId: Scalars['ID']; @@ -784,7 +931,7 @@ export type ExportDataFromResultsQueryVariables = { export type ExportDataFromResultsQuery = { taskInfo: ( Pick & { error?: Maybe> } - ); }; + ) }; export type GetDataTransferProcessorsQueryVariables = {}; @@ -792,7 +939,7 @@ export type GetDataTransferProcessorsQueryVariables = {}; export type GetDataTransferProcessorsQuery = { processors: Array<( Pick & { properties?: Maybe>>> } - )>; }; + )> }; export type RemoveDataTransferFileQueryVariables = { dataFileId: Scalars['String']; @@ -818,10 +965,10 @@ export type AsyncSqlExecuteQueryMutation = { taskInfo: ( & { resultSet?: Maybe<( Pick & { columns?: Maybe>>> } - )>; } - )>; } - )>; error?: Maybe>; } - ); }; + )> } + )> } + )>, error?: Maybe> } + ) }; export type AsyncTaskCancelMutationVariables = { taskId: Scalars['String']; @@ -844,10 +991,10 @@ export type AsyncTaskStatusMutation = { taskInfo: ( & { resultSet?: Maybe<( Pick & { columns?: Maybe>>> } - )>; } - )>; } - )>; error?: Maybe>; } - ); }; + )> } + )> } + )>, error?: Maybe> } + ) }; export type ExecuteSqlQueryMutationVariables = { connectionId: Scalars['ID']; @@ -864,9 +1011,9 @@ export type ExecuteSqlQueryMutation = { result?: Maybe<( & { resultSet?: Maybe<( Pick & { columns?: Maybe>>> } - )>; } - )>; } - )>; }; + )> } + )> } + )> }; export type MetadataGetNodeDdlQueryVariables = { nodeId: Scalars['ID']; @@ -908,9 +1055,9 @@ export type ReadDataFromContainerMutation = { readDataFromContainer?: Maybe<( & { resultSet?: Maybe<( Pick & { columns?: Maybe>>> } - )>; } - )>; } - )>; }; + )> } + )> } + )> }; export type SqlContextCreateMutationVariables = { connectionId: Scalars['ID']; @@ -962,8 +1109,8 @@ export type UpdateResultsDataMutation = { result?: Maybe<( & { results: Array<( Pick & { resultSet?: Maybe> } - )>; } - )>; }; + )> } + )> }; export type OpenSessionMutationVariables = {}; @@ -971,7 +1118,7 @@ export type OpenSessionMutationVariables = {}; export type OpenSessionMutation = { session: ( Pick & { connections: Array> } - ); }; + ) }; export type ServerConfigQueryVariables = {}; @@ -979,7 +1126,7 @@ export type ServerConfigQueryVariables = {}; export type ServerConfigQuery = { serverConfig: ( Pick & { supportedLanguages: Array> } - ); }; + ) }; export type SessionPermissionsQueryVariables = {}; @@ -992,7 +1139,7 @@ export type SessionStateQueryVariables = {}; export type SessionStateQuery = { sessionState: ( Pick & { connections: Array> } - ); }; + ) }; export type TouchSessionMutationVariables = {}; @@ -1146,6 +1293,11 @@ export const NavNodeInfoDocument = ` } } `; +export const NavRefreshNodeDocument = ` + query navRefreshNode($nodePath: ID!) { + navRefreshNode(nodePath: $nodePath) +} + `; export const QueryChildrenDatabaseObjectInfoDocument = ` query queryChildrenDatabaseObjectInfo($nodePath: ID!, $filter: ObjectPropertyFilter) { childrenDatabaseObjectInfo: navNodeChildren(parentPath: $nodePath) { @@ -1199,6 +1351,56 @@ export const ChangeSessionLanguageDocument = ` changeSessionLanguage(locale: $locale) } `; +export const CreateUserDocument = ` + query createUser($userId: ID!) { + user: createUser(userId: $userId) { + userId + grantedRoles + } +} + `; +export const DeleteUserDocument = ` + query deleteUser($userId: ID!) { + deleteUser(userId: $userId) +} + `; +export const GetPermissionsListDocument = ` + query getPermissionsList($roleId: ID) { + permissions: listPermissions { + id + label + description + provider + category + } +} + `; +export const GetRolesListDocument = ` + query getRolesList($roleId: ID) { + roles: listRoles(roleId: $roleId) { + roleId + roleName + } +} + `; +export const GetUsersListDocument = ` + query getUsersList($userId: ID) { + users: listUsers(userId: $userId) { + userId + grantedRoles + } +} + `; +export const GrantUserRoleDocument = ` + query grantUserRole($userId: ID!, $roleId: ID!) { + grantUserRole(userId: $userId, roleId: $roleId) +} + `; +export const SetUserCredentialsDocument = ` + query setUserCredentials($userId: ID!, $providerId: ID!, $credentials: Object!) { + setUserCredentials(userId: $userId, providerId: $providerId, credentials: $credentials) +} + `; export const AuthLoginDocument = ` query authLogin($provider: ID!, $credentials: Object!) { user: authLogin(provider: $provider, credentials: $credentials) { @@ -1645,6 +1847,9 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = navNodeInfo(variables: NavNodeInfoQueryVariables): Promise { return withWrapper(() => client.request(NavNodeInfoDocument, variables)); }, + navRefreshNode(variables: NavRefreshNodeQueryVariables): Promise { + return withWrapper(() => client.request(NavRefreshNodeDocument, variables)); + }, queryChildrenDatabaseObjectInfo(variables: QueryChildrenDatabaseObjectInfoQueryVariables): Promise { return withWrapper(() => client.request(QueryChildrenDatabaseObjectInfoDocument, variables)); }, @@ -1657,6 +1862,27 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = changeSessionLanguage(variables: ChangeSessionLanguageMutationVariables): Promise { return withWrapper(() => client.request(ChangeSessionLanguageDocument, variables)); }, + createUser(variables: CreateUserQueryVariables): Promise { + return withWrapper(() => client.request(CreateUserDocument, variables)); + }, + deleteUser(variables: DeleteUserQueryVariables): Promise { + return withWrapper(() => client.request(DeleteUserDocument, variables)); + }, + getPermissionsList(variables?: GetPermissionsListQueryVariables): Promise { + return withWrapper(() => client.request(GetPermissionsListDocument, variables)); + }, + getRolesList(variables?: GetRolesListQueryVariables): Promise { + return withWrapper(() => client.request(GetRolesListDocument, variables)); + }, + getUsersList(variables?: GetUsersListQueryVariables): Promise { + return withWrapper(() => client.request(GetUsersListDocument, variables)); + }, + grantUserRole(variables: GrantUserRoleQueryVariables): Promise { + return withWrapper(() => client.request(GrantUserRoleDocument, variables)); + }, + setUserCredentials(variables: SetUserCredentialsQueryVariables): Promise { + return withWrapper(() => client.request(SetUserCredentialsDocument, variables)); + }, authLogin(variables: AuthLoginQueryVariables): Promise { return withWrapper(() => client.request(AuthLoginDocument, variables)); }, @@ -1737,7 +1963,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = }, touchSession(variables?: TouchSessionMutationVariables): Promise { return withWrapper(() => client.request(TouchSessionDocument, variables)); - }, + } }; } -export type Sdk = ReturnType; +export type Sdk = ReturnType; \ No newline at end of file diff --git a/webapp/packages/core/src/theming/ThemeService.ts b/webapp/packages/core/src/theming/ThemeService.ts index 130a01e0a7..b927dffba1 100644 --- a/webapp/packages/core/src/theming/ThemeService.ts +++ b/webapp/packages/core/src/theming/ThemeService.ts @@ -60,11 +60,11 @@ export class ThemeService { constructor(private notificationService: NotificationService, private settingsService: SettingsService) { + this.loadAllThemes(); } async init() { this.settingsService.registerSettings(this.settings, THEME_SETTINGS_KEY); - await this.loadAllThemesAsync(); await this.changeThemeAsync(this.currentThemeId); } @@ -95,7 +95,7 @@ export class ThemeService { this.settings.currentThemeId = themeId; } - private async loadAllThemesAsync(): Promise { + private loadAllThemes(): void { for (const theme of themes) { this.themeMap.set(theme.id, theme); } diff --git a/webapp/packages/core/src/theming/useStyles.ts b/webapp/packages/core/src/theming/useStyles.ts index a0c74a5c1a..2d5901beea 100644 --- a/webapp/packages/core/src/theming/useStyles.ts +++ b/webapp/packages/core/src/theming/useStyles.ts @@ -11,6 +11,7 @@ import { useMemo, useState } from 'react'; import { create } from 'reshadow'; import { useService } from '@dbeaver/core/di'; +import { flat } from '@dbeaver/core/utils'; import { ThemeService } from './ThemeService'; import { applyComposes, ClassCollection, Composes } from './themeUtils'; @@ -41,7 +42,7 @@ export function useStyles( style => ((typeof style === 'object' || style instanceof Composes) ? style : style(currentThemeId)) ) ) - .then(styles => setLoadedStyles(styles.flat())); + .then(styles => setLoadedStyles(flat(styles))); }, [currentThemeId]); const styles = useMemo(() => { diff --git a/webapp/packages/core/src/utils/flat.ts b/webapp/packages/core/src/utils/flat.ts new file mode 100644 index 0000000000..f71cc6a4bb --- /dev/null +++ b/webapp/packages/core/src/utils/flat.ts @@ -0,0 +1,16 @@ +/* + * cloudbeaver - Cloud Database Manager + * Copyright (C) 2020 DBeaver Corp and others + * + * Licensed under the Apache License, Version 2.0. + * you may not use this file except in compliance with the License. + */ + +export function flat(array: any[]) { + if (array.flat) { + return array.flat(); + } + + // EDGE workaround + return array.reduce((acc, val) => acc.concat(val), []); +} diff --git a/webapp/packages/core/src/utils/index.ts b/webapp/packages/core/src/utils/index.ts index e1ae9aa805..edf629eaa4 100644 --- a/webapp/packages/core/src/utils/index.ts +++ b/webapp/packages/core/src/utils/index.ts @@ -1,6 +1,7 @@ +export * from './flat'; export * from './OrderedMap'; -export * from './uuid_'; export * from './parseJSONFlat'; +export * from './uuid_'; export * from './Promises/CancellablePromise'; export * from './Promises/Deferred'; diff --git a/webapp/packages/core/theming/package.json b/webapp/packages/core/theming/package.json index 1fab528238..b2f6aec659 100644 --- a/webapp/packages/core/theming/package.json +++ b/webapp/packages/core/theming/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/theming", "private": true, "sideEffects": false, - "main": "../dist/theming", - "module": "../dist/theming", - "types": "../dist/types/theming" + "main": "../dist/theming/index.js", + "module": "../dist/theming/index.js" } diff --git a/webapp/packages/core/tsconfig.build.json b/webapp/packages/core/tsconfig.build.json deleted file mode 100644 index 0ae3f077c2..0000000000 --- a/webapp/packages/core/tsconfig.build.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/core/tsconfig.json b/webapp/packages/core/tsconfig.json index 892d9beb6b..d2a85dac2a 100644 --- a/webapp/packages/core/tsconfig.json +++ b/webapp/packages/core/tsconfig.json @@ -1,5 +1,12 @@ { "extends": "../../tsconfig.json", - "exclude": ["node_modules"], + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, + "exclude": [ + "node_modules", + "@dbeaver/**" + ], "include": ["src/**/*"] } diff --git a/webapp/packages/core/utils/package.json b/webapp/packages/core/utils/package.json index 9b19ca67e0..0e1fcf922a 100644 --- a/webapp/packages/core/utils/package.json +++ b/webapp/packages/core/utils/package.json @@ -2,7 +2,6 @@ "name": "@dbeaver/core/utils", "private": true, "sideEffects": false, - "main": "../dist/utils", - "module": ".../dist/utils", - "types": "../dist/types/utils" + "main": "../dist/utils/index.js", + "module": ".../dist/utils/index.js" } diff --git a/webapp/packages/custom-connection-plugin/package.json b/webapp/packages/custom-connection-plugin/package.json index 26feb5bc6c..0114356bc2 100644 --- a/webapp/packages/custom-connection-plugin/package.json +++ b/webapp/packages/custom-connection-plugin/package.json @@ -3,26 +3,19 @@ "version": "0.1.0", "description": "", "license": "Apache-2.0", - "main": "dist/index.js", - "module": "dist/index.js", - "types": "dist/types", + "main": "./dist/index.js", + "module": "./dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "clean-dist": "rimraf dist/*", "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { - "@dbeaver/core": "^0.1.0" + "@dbeaver/core": "^0.1.0", + "@dbeaver/builder": "^0.1.0" }, "peerDependencies": { - "@dbeaver/core": "^0.1.0", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.77", - "rxjs": "^6.5.5" + "@dbeaver/core": "^0.1.0" } } diff --git a/webapp/packages/custom-connection-plugin/src/CustomConnection/ConnectionFormDialog/ConnectionFormDialog.tsx b/webapp/packages/custom-connection-plugin/src/CustomConnection/ConnectionFormDialog/ConnectionFormDialog.tsx index cef1038a22..a071514208 100644 --- a/webapp/packages/custom-connection-plugin/src/CustomConnection/ConnectionFormDialog/ConnectionFormDialog.tsx +++ b/webapp/packages/custom-connection-plugin/src/CustomConnection/ConnectionFormDialog/ConnectionFormDialog.tsx @@ -101,10 +101,10 @@ export const ConnectionFormDialog = observer( header={( - + {translate('customConnection_options')} setLoadProperties(true)} > - + {translate('customConnection_properties')} )} diff --git a/webapp/packages/custom-connection-plugin/tsconfig.build.json b/webapp/packages/custom-connection-plugin/tsconfig.build.json deleted file mode 100644 index dd700023ea..0000000000 --- a/webapp/packages/custom-connection-plugin/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules", - "@dbeaver/**" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/custom-connection-plugin/tsconfig.json b/webapp/packages/custom-connection-plugin/tsconfig.json index cf0afdc7c0..3ab6d3aadc 100644 --- a/webapp/packages/custom-connection-plugin/tsconfig.json +++ b/webapp/packages/custom-connection-plugin/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, "include": [ "src/**/*" ], diff --git a/webapp/packages/data-export-plugin/package.json b/webapp/packages/data-export-plugin/package.json index 156b75e8b4..88098f7716 100644 --- a/webapp/packages/data-export-plugin/package.json +++ b/webapp/packages/data-export-plugin/package.json @@ -3,27 +3,20 @@ "version": "0.1.0", "description": "", "license": "Apache-2.0", - "main": "dist/index.js", - "types": "dist/types", + "main": "./dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "clean-dist": "rimraf dist/*", "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { - "@dbeaver/data-viewer-plugin": "^0.1.0", - "@dbeaver/core": "^0.1.0" + "@dbeaver/builder": "^0.1.0", + "@dbeaver/core": "^0.1.0", + "@dbeaver/data-viewer-plugin": "^0.1.0" }, "peerDependencies": { - "@dbeaver/data-viewer-plugin": "^0.1.0", "@dbeaver/core": "^0.1.0", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.77", - "rxjs": "^6.5.5" + "@dbeaver/data-viewer-plugin": "^0.1.0" } } diff --git a/webapp/packages/data-export-plugin/src/ExportNotification/ExportNotification.tsx b/webapp/packages/data-export-plugin/src/ExportNotification/ExportNotification.tsx index 04faf81739..e581643c88 100644 --- a/webapp/packages/data-export-plugin/src/ExportNotification/ExportNotification.tsx +++ b/webapp/packages/data-export-plugin/src/ExportNotification/ExportNotification.tsx @@ -34,6 +34,9 @@ const styles = css` margin: 0; } } + IconButton { + color: rgba(0, 0, 0, 0.45); + } `; export const ExportNotification = observer(function ExportNotification({ diff --git a/webapp/packages/data-export-plugin/tsconfig.build.json b/webapp/packages/data-export-plugin/tsconfig.build.json deleted file mode 100644 index dd700023ea..0000000000 --- a/webapp/packages/data-export-plugin/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules", - "@dbeaver/**" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/data-export-plugin/tsconfig.json b/webapp/packages/data-export-plugin/tsconfig.json index cf0afdc7c0..3ab6d3aadc 100644 --- a/webapp/packages/data-export-plugin/tsconfig.json +++ b/webapp/packages/data-export-plugin/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, "include": [ "src/**/*" ], diff --git a/webapp/packages/data-viewer-plugin/package.json b/webapp/packages/data-viewer-plugin/package.json index 71d033192f..24de724868 100644 --- a/webapp/packages/data-viewer-plugin/package.json +++ b/webapp/packages/data-viewer-plugin/package.json @@ -3,15 +3,15 @@ "version": "0.1.0", "description": "", "license": "Apache-2.0", - "main": "dist/index.js", - "types": "dist/types", + "main": "./dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "clean-dist": "rimraf dist/*", "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { + "@dbeaver/builder": "^0.1.0", "@dbeaver/ag-grid-plugin": "^0.1.0", "@dbeaver/object-viewer-plugin": "^0.1.0", "@dbeaver/core": "^0.1.0" @@ -19,13 +19,6 @@ "peerDependencies": { "@dbeaver/ag-grid-plugin": "^0.1.0", "@dbeaver/object-viewer-plugin": "^0.1.0", - "@dbeaver/core": "^0.1.0", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.77", - "rxjs": "^6.5.5" + "@dbeaver/core": "^0.1.0" } } diff --git a/webapp/packages/data-viewer-plugin/src/DataViewerPage/DataViewerTab.tsx b/webapp/packages/data-viewer-plugin/src/DataViewerPage/DataViewerTab.tsx index c1a122ddfa..bd6ba0807a 100644 --- a/webapp/packages/data-viewer-plugin/src/DataViewerPage/DataViewerTab.tsx +++ b/webapp/packages/data-viewer-plugin/src/DataViewerPage/DataViewerTab.tsx @@ -27,7 +27,7 @@ export const DataViewerTab = observer(function DataViewerTab({ return styled(useStyles(...style))( - + Data ); }); diff --git a/webapp/packages/data-viewer-plugin/src/DataViewerTableService.ts b/webapp/packages/data-viewer-plugin/src/DataViewerTableService.ts index defbba75a5..67808e1847 100644 --- a/webapp/packages/data-viewer-plugin/src/DataViewerTableService.ts +++ b/webapp/packages/data-viewer-plugin/src/DataViewerTableService.ts @@ -7,12 +7,14 @@ */ import { injectable } from '@dbeaver/core/di'; -import { GraphQLService } from '@dbeaver/core/sdk'; +import { GraphQLService, SqlDataFilterConstraint } from '@dbeaver/core/sdk'; import { IExecutionContext } from './IExecutionContext'; import { RowDiff } from './TableViewer/TableDataModel/EditedRow'; -import { IRequestDataResult, TableViewerModel } from './TableViewer/TableViewerModel'; +import { IRequestDataResult, IRequestDataResultOptions, TableViewerModel } from './TableViewer/TableViewerModel'; import { TableViewerStorageService } from './TableViewer/TableViewerStorageService'; +import { RequestDataOptionsToConstrains } from './DataViewerUtils'; + @injectable() export class DataViewerTableService { @@ -98,7 +100,8 @@ export class DataViewerTableService { private async requestDataAsync( data: TableViewerModel, rowOffset: number, - count: number + count: number, + options: IRequestDataResultOptions, ): Promise { if (!data.containerNodePath) { throw new Error('containerNodePath must be provided for table'); @@ -117,6 +120,7 @@ export class DataViewerTableService { filter: { offset: rowOffset, limit: count, + constraints: RequestDataOptionsToConstrains(options), }, }); const dataSet = readDataFromContainer!.results[0].resultSet!; // we expect only one dataset for a table diff --git a/webapp/packages/data-viewer-plugin/src/DataViewerUtils.ts b/webapp/packages/data-viewer-plugin/src/DataViewerUtils.ts new file mode 100644 index 0000000000..0bbbd0f26f --- /dev/null +++ b/webapp/packages/data-viewer-plugin/src/DataViewerUtils.ts @@ -0,0 +1,19 @@ +import { SqlDataFilterConstraint } from '@dbeaver/core/sdk'; + +import { IRequestDataResultOptions } from './TableViewer/TableViewerModel'; + +export function RequestDataOptionsToConstrains( + options?: IRequestDataResultOptions +): SqlDataFilterConstraint[] | undefined { + const constraints: SqlDataFilterConstraint[] = (options?.sorting || []) + .map((columnSorting, index) => { + const constrain: SqlDataFilterConstraint = { + attribute: columnSorting.colId, + orderPosition: index, + orderAsc: columnSorting.sort === 'asc', + }; + return constrain; + }); + + return constraints.length ? constraints : undefined; +} diff --git a/webapp/packages/data-viewer-plugin/src/TableViewer/TableViewerModel.ts b/webapp/packages/data-viewer-plugin/src/TableViewer/TableViewerModel.ts index 47f312c075..d7410b822d 100644 --- a/webapp/packages/data-viewer-plugin/src/TableViewer/TableViewerModel.ts +++ b/webapp/packages/data-viewer-plugin/src/TableViewer/TableViewerModel.ts @@ -8,7 +8,9 @@ import { action, observable } from 'mobx'; -import { IAgGridModel, IRequestedData } from '@dbeaver/ag-grid-plugin'; +import { + IAgGridModel, IRequestedData, IRequestDataOptions, SortModel +} from '@dbeaver/ag-grid-plugin'; import { ErrorDetailsDialog } from '@dbeaver/core/app'; import { CommonDialogService } from '@dbeaver/core/dialogs'; import { GQLError } from '@dbeaver/core/sdk'; @@ -28,6 +30,11 @@ export const fetchingSettings = { fetchDefault: 200, }; +export interface IRequestDataResultOptions extends IRequestDataOptions { + // to be extended, now just reexport to avoid ag-grid-plugin dependency + sorting?: SortModel; +} + export interface ITableViewerModelOptions { tableId?: string; connectionId: string; @@ -37,7 +44,11 @@ export interface ITableViewerModelOptions { sourceName?: string; // TODO: refactor it, used for showing sql query for export initialState?: IRequestDataResult; noLoaderWhileRequestingDataAsync?: boolean; - requestDataAsync(model: TableViewerModel, rowOffset: number, count: number): Promise; + requestDataAsync( + model: TableViewerModel, + rowOffset: number, + count: number, + options?: IRequestDataResultOptions): Promise; saveChanges(model: TableViewerModel, diffs: RowDiff[]): Promise; } @@ -58,7 +69,11 @@ export class TableViewerModel implements ITableViewerModelOptions { sourceName?: string; initialState?: IRequestDataResult; noLoaderWhileRequestingDataAsync?: boolean; - requestDataAsync: (model: TableViewerModel, rowOffset: number, count: number) => Promise; + requestDataAsync: ( + model: TableViewerModel, + rowOffset: number, + count: number, + options?: IRequestDataResultOptions) => Promise; saveChanges: (model: TableViewerModel, diffs: RowDiff[]) => Promise; agGridModel: IAgGridModel = { @@ -69,6 +84,7 @@ export class TableViewerModel implements ITableViewerModelOptions { onRequestData: this.onRequestData.bind(this), onCellEditingStopped: this.onCellEditingStopped.bind(this), onEditSave: this.onSaveChanges.bind(this), + onSortChanged: this.onSortChanged.bind(this), onEditCancel: this.onEditCancel.bind(this), actions: null, // to be set by ag-grid-plugin }; @@ -142,7 +158,7 @@ export class TableViewerModel implements ITableViewerModelOptions { this.tableEditor.editCellValue(rowNumber, colNumber, value); } - private async onRequestData(rowOffset: number, count: number): Promise { + private async onRequestData(rowOffset: number, count: number, options: IRequestDataOptions): Promise { // try to return data from cache if (this.tableDataModel.isChunkLoaded(rowOffset, count) || this.isFullyLoaded) { const data: IRequestedData = { @@ -156,7 +172,7 @@ export class TableViewerModel implements ITableViewerModelOptions { this._isLoaderVisible = !this.noLoaderWhileRequestingDataAsync; try { - const response = await this.requestDataAsync(this, rowOffset, count); + const response = await this.requestDataAsync(this, rowOffset, count, options); this.insertRows(rowOffset, response.rows, !response.isFullyLoaded); if (!this.tableDataModel.getColumns().length) { @@ -263,6 +279,11 @@ export class TableViewerModel implements ITableViewerModelOptions { } } + private onSortChanged() { + this.tableDataModel.resetData(); + this._hasMoreRows = true; + } + private async trySaveChanges(diffs: RowDiff[]) { this._isLoaderVisible = true; diff --git a/webapp/packages/data-viewer-plugin/src/index.ts b/webapp/packages/data-viewer-plugin/src/index.ts index cfc5078a2f..b7037de539 100644 --- a/webapp/packages/data-viewer-plugin/src/index.ts +++ b/webapp/packages/data-viewer-plugin/src/index.ts @@ -13,4 +13,6 @@ export * from './TableViewer/TableDataModel/TableColumn'; export * from './TableViewer/TableDataModel/TableRow'; export * from './TableViewer/TableDataModel/EditedRow'; +export * from './DataViewerUtils'; + export * from './IExecutionContext'; diff --git a/webapp/packages/data-viewer-plugin/tsconfig.build.json b/webapp/packages/data-viewer-plugin/tsconfig.build.json deleted file mode 100644 index dd700023ea..0000000000 --- a/webapp/packages/data-viewer-plugin/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules", - "@dbeaver/**" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/data-viewer-plugin/tsconfig.json b/webapp/packages/data-viewer-plugin/tsconfig.json index cf0afdc7c0..3ab6d3aadc 100644 --- a/webapp/packages/data-viewer-plugin/tsconfig.json +++ b/webapp/packages/data-viewer-plugin/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, "include": [ "src/**/*" ], diff --git a/webapp/packages/ddl-viewer-plugin/package.json b/webapp/packages/ddl-viewer-plugin/package.json index 2cfac8e2d2..cb7c45711b 100644 --- a/webapp/packages/ddl-viewer-plugin/package.json +++ b/webapp/packages/ddl-viewer-plugin/package.json @@ -5,13 +5,14 @@ "license": "Apache-2.0", "main": "dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "clean-dist": "rimraf dist/*", "test": "echo \"Error: no test specified\" && exit 1", "tsc": "tsc" }, "devDependencies": { + "@dbeaver/builder": "^0.1.0", "@dbeaver/core": "^0.1.0", "@dbeaver/object-viewer-plugin": "^0.1.0", "@dbeaver/sql-editor": "^0.1.0" @@ -19,13 +20,6 @@ "peerDependencies": { "@dbeaver/core": "^0.1.0", "@dbeaver/object-viewer-plugin": "^0.1.0", - "@dbeaver/sql-editor": "^0.1.0", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.77", - "rxjs": "^6.5.5" + "@dbeaver/sql-editor": "^0.1.0" } } diff --git a/webapp/packages/ddl-viewer-plugin/tsconfig.build.json b/webapp/packages/ddl-viewer-plugin/tsconfig.build.json deleted file mode 100644 index dd700023ea..0000000000 --- a/webapp/packages/ddl-viewer-plugin/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules", - "@dbeaver/**" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/ddl-viewer-plugin/tsconfig.json b/webapp/packages/ddl-viewer-plugin/tsconfig.json index 6b4c45f333..26d254ccf5 100644 --- a/webapp/packages/ddl-viewer-plugin/tsconfig.json +++ b/webapp/packages/ddl-viewer-plugin/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, "include": [ "src" ], diff --git a/webapp/packages/object-viewer-plugin/package.json b/webapp/packages/object-viewer-plugin/package.json index 22661caf01..5b613ac87e 100644 --- a/webapp/packages/object-viewer-plugin/package.json +++ b/webapp/packages/object-viewer-plugin/package.json @@ -3,25 +3,18 @@ "version": "0.1.0", "description": "", "license": "Apache-2.0", - "main": "dist/index.js", - "types": "dist/types", + "main": "./dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "clean-dist": "rimraf dist/*", "test": "echo \"Error: no test specified\" && exit 1" }, "devDependencies": { + "@dbeaver/builder": "^0.1.0", "@dbeaver/core": "^0.1.0" }, "peerDependencies": { - "@dbeaver/core": "^0.1.0", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.77", - "rxjs": "^6.5.5" + "@dbeaver/core": "^0.1.0" } } diff --git a/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectFolders.tsx b/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectFolders.tsx index ddbc93209f..5d2985d8c9 100644 --- a/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectFolders.tsx +++ b/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectFolders.tsx @@ -12,18 +12,39 @@ import styled, { css } from 'reshadow'; import { ITab } from '@dbeaver/core/app'; import { VerticalTabs } from '@dbeaver/core/blocks'; import { useController } from '@dbeaver/core/di'; -import { useStyles } from '@dbeaver/core/theming'; +import { useStyles, composes } from '@dbeaver/core/theming'; import { IObjectViewerTabState } from '../IObjectViewerTabState'; import { ObjectFoldersController } from './ObjectFoldersController'; -const styles = css` - folders { - display: flex; - flex: 1; - overflow: hidden; - } -`; +const styles = composes( + css` + TabList { + composes: theme-background-surface theme-text-on-surface theme-border-color-background from global; + } + VerticalTabs { + composes: theme-border-color-background from global; + } + Tab { + composes: theme-ripple theme-background-background theme-ripple-selectable from global; + } + `, + css` + Tab { + color: inherit; + } + VerticalTabs { + border-top: 1px solid; + flex: 1; + } + TabPanel { + overflow: auto !important; + } + TabList { + border-right: 1px solid; + } + ` +); type ObjectFoldersProps = { tab: ITab; @@ -32,9 +53,5 @@ type ObjectFoldersProps = { export const ObjectFolders = observer(function ObjectFolders({ tab }: ObjectFoldersProps) { const controller = useController(ObjectFoldersController, tab); - return styled(useStyles(styles))( - - - - ); + return styled(useStyles(styles))(); }); diff --git a/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertiesPageTab.tsx b/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertiesPageTab.tsx index 1d27710589..3d2627ea92 100644 --- a/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertiesPageTab.tsx +++ b/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertiesPageTab.tsx @@ -21,7 +21,7 @@ export const ObjectPropertiesPageTab = observer(function ObjectPropertiesPageTab return styled(useStyles(...style))( - + Properties ); }); diff --git a/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/Header.tsx b/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/Header.tsx index 00bb6725f3..aa10885d4a 100644 --- a/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/Header.tsx +++ b/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/Header.tsx @@ -8,11 +8,12 @@ import styled, { css } from 'reshadow'; +import { TableColumnHeader } from '@dbeaver/core/blocks'; import { ObjectPropertyInfo } from '@dbeaver/core/sdk'; import { useStyles } from '@dbeaver/core/theming'; const styles = css` - th:first-child { + TableColumnHeader:nth-child(2) { width:16px; border-right: none; } @@ -34,13 +35,14 @@ type HeaderProps = { export function Header({ properties }: HeaderProps) { return styled(useStyles(styles))( - - + <> + + {properties.map(property => ( - + {property.displayName} - + ))} - + ); } diff --git a/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/Item.tsx b/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/Item.tsx index f70f7fa368..0786c8d21f 100644 --- a/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/Item.tsx +++ b/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/Item.tsx @@ -8,10 +8,12 @@ import { observer } from 'mobx-react'; import { useCallback } from 'react'; -import styled, { css, use } from 'reshadow'; +import styled, { css } from 'reshadow'; import { NodesManagerService, useDatabaseObjectInfo, useNode } from '@dbeaver/core/app'; -import { StaticImage } from '@dbeaver/core/blocks'; +import { + StaticImage, TableItem, TableColumnValue, TableItemSelect +} from '@dbeaver/core/blocks'; import { useService } from '@dbeaver/core/di'; import { useStyles } from '@dbeaver/core/theming'; @@ -32,10 +34,10 @@ const itemStyles = css` height: 16px; width: 180px; } - tr { + TableItem { position: relative; } - td:nth-child(2) { + TableColumnValue:nth-child(3) { cursor: pointer; user-select: none; } @@ -44,51 +46,47 @@ const itemStyles = css` type ItemProps = { objectId: string; columns: number; - isSelected: boolean; - onClick: (objectId: string, isMultiple: boolean) => void; } export const Item = observer(function Item({ - objectId, columns, isSelected, onClick, + objectId, columns, }: ItemProps) { const nodesManagerService = useService(NodesManagerService); const object = useNode(objectId); const databaseObjectInfo = useDatabaseObjectInfo(objectId); const handleOpen = useCallback(() => nodesManagerService.navToNode(objectId), [objectId]); - const handleClick = useCallback( - (e: React.MouseEvent) => onClick(objectId, e.ctrlKey), - [objectId, onClick] - ); if (!object || !databaseObjectInfo?.properties) { return styled(useStyles(itemStyles))( - - + + + - + {Array(columns) .fill(0) .map((_, i) => ( - + - + ))} - + ); } return styled(useStyles(itemStyles))( - - + + + - + {databaseObjectInfo.properties.map(property => ( - {getValue(property.value)} + {getValue(property.value)} ))} - + ); }); diff --git a/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/ObjectChildrenPropertyTable.tsx b/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/ObjectChildrenPropertyTable.tsx index df0e106371..7d275f796f 100644 --- a/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/ObjectChildrenPropertyTable.tsx +++ b/webapp/packages/object-viewer-plugin/src/ObjectPropertiesPage/ObjectPropertyTable/ObjectChildrenPropertyTable.tsx @@ -7,67 +7,42 @@ */ import { observer } from 'mobx-react'; -import { useCallback, useState } from 'react'; -import styled, { css } from 'reshadow'; import { useDatabaseObjectInfo } from '@dbeaver/core/app'; -import { useStyles } from '@dbeaver/core/theming'; +import { TableHeader, TableBody, Table } from '@dbeaver/core/blocks'; import { Header } from './Header'; import { Item } from './Item'; -const styles = css` - table { - composes: theme-typography--body2 from global; - } -`; - type ObjectChildrenPropertyTableProps = { nodeIds?: string[]; } -export const ObjectChildrenPropertyTable = observer(function ObjectPropertyTable( - props: ObjectChildrenPropertyTableProps -) { +export const ObjectChildrenPropertyTable = observer(function ObjectPropertyTable({ + nodeIds, +}: ObjectChildrenPropertyTableProps) { - const [selected, setSelected] = useState([]); - const handleSelect = useCallback((objectId: string, isMultiple: boolean) => { - if (isMultiple) { - if (selected.includes(objectId)) { - setSelected(selected.filter(v => v !== objectId)); - } else { - setSelected([...selected, objectId]); - } - } else if (!selected.includes(objectId)) { - setSelected([objectId]); - } else { - setSelected([]); - } - }, [selected]); - - if (!props.nodeIds) { + if (!nodeIds) { return null; } - const firstChild = props.nodeIds[0] || ''; + const firstChild = nodeIds[0] || ''; const properties = useDatabaseObjectInfo(firstChild)?.properties; - return styled(useStyles(styles))( - - + return ( +
+
- -
- {props.nodeIds.map(id => ( + + + {nodeIds.map(id => ( ))} - -
+ + ); }); diff --git a/webapp/packages/object-viewer-plugin/src/ObjectViewerTab.tsx b/webapp/packages/object-viewer-plugin/src/ObjectViewerTab.tsx index 4e4723b91c..687e5c9cb1 100644 --- a/webapp/packages/object-viewer-plugin/src/ObjectViewerTab.tsx +++ b/webapp/packages/object-viewer-plugin/src/ObjectViewerTab.tsx @@ -23,7 +23,7 @@ export const ObjectViewerTab = observer(function ObjectViewerTab({ return styled(useStyles(...style))( - + {node?.name || tab.handlerState.tabTitle} ); }); diff --git a/webapp/packages/object-viewer-plugin/tsconfig.build.json b/webapp/packages/object-viewer-plugin/tsconfig.build.json deleted file mode 100644 index dd700023ea..0000000000 --- a/webapp/packages/object-viewer-plugin/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules", - "@dbeaver/**" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/object-viewer-plugin/tsconfig.json b/webapp/packages/object-viewer-plugin/tsconfig.json index 6b4c45f333..26d254ccf5 100644 --- a/webapp/packages/object-viewer-plugin/tsconfig.json +++ b/webapp/packages/object-viewer-plugin/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, "include": [ "src" ], diff --git a/webapp/packages/sql-editor/package.json b/webapp/packages/sql-editor/package.json index b121c87637..aa457f63b7 100644 --- a/webapp/packages/sql-editor/package.json +++ b/webapp/packages/sql-editor/package.json @@ -3,10 +3,9 @@ "version": "0.1.0", "description": "", "license": "Apache-2.0", - "main": "dist/index.js", - "types": "dist/types", + "main": "./dist/index.js", "scripts": { - "build": "npm run clean-dist && builder build-plugin", + "build": "yarn run clean-dist && builder build-plugin", "serve-plugin": "builder serve-plugin", "clean-dist": "rimraf dist/*", "test": "echo \"Error: no test specified\" && exit 1" @@ -16,19 +15,13 @@ "react-codemirror2": "^7.1.0" }, "devDependencies": { + "@dbeaver/builder": "^0.1.0", "@dbeaver/core": "^0.1.0", "@dbeaver/data-viewer-plugin": "^0.1.0", "@types/codemirror": "^0.0.91" }, "peerDependencies": { "@dbeaver/core": "^0.1.0", - "@dbeaver/data-viewer-plugin": "^0.1.0", - "mobx": "^5.15.4", - "mobx-react": "^6.2.2", - "react": "^16.13.1", - "react-dom": "^16.13.1", - "reakit": "^1.0.0-beta.11", - "reshadow": "0.0.1-alpha.77", - "rxjs": "^6.5.5" + "@dbeaver/data-viewer-plugin": "^0.1.0" } } diff --git a/webapp/packages/sql-editor/src/SqlEditorTab.tsx b/webapp/packages/sql-editor/src/SqlEditorTab.tsx index 05b8e9f2a8..4565762d56 100644 --- a/webapp/packages/sql-editor/src/SqlEditorTab.tsx +++ b/webapp/packages/sql-editor/src/SqlEditorTab.tsx @@ -25,7 +25,7 @@ export function SqlEditorTab({ return styled(useStyles(...style))( - + {name} ); } diff --git a/webapp/packages/sql-editor/src/SqlResultTabs/SQLQueryExecutionProcess.ts b/webapp/packages/sql-editor/src/SqlResultTabs/SQLQueryExecutionProcess.ts index 85c823ef59..cb5760adc9 100644 --- a/webapp/packages/sql-editor/src/SqlResultTabs/SQLQueryExecutionProcess.ts +++ b/webapp/packages/sql-editor/src/SqlResultTabs/SQLQueryExecutionProcess.ts @@ -13,6 +13,7 @@ import { import { CancellablePromise, cancellableTimeout, Deferred, EDeferredState, } from '@dbeaver/core/utils'; +import { IRequestDataResultOptions, RequestDataOptionsToConstrains } from '@dbeaver/data-viewer-plugin'; import { ISqlQueryParams } from '../ISqlEditorTabState'; @@ -31,10 +32,11 @@ export class SQLQueryExecutionProcess extends Deferred { async start(sqlQueryParams: ISqlQueryParams, rowOffset: number, - count: number): Promise { + count: number, + options?: IRequestDataResultOptions): Promise { // start async task try { - const taskInfo = await this.executeQueryAsync(sqlQueryParams, rowOffset, count); + const taskInfo = await this.executeQueryAsync(sqlQueryParams, rowOffset, count, options); this.applyResult(taskInfo); this.taskId = taskInfo.id; if (this.getState() === EDeferredState.CANCELLING) { @@ -104,7 +106,8 @@ export class SQLQueryExecutionProcess extends Deferred { private async executeQueryAsync(sqlQueryParams: ISqlQueryParams, rowOffset: number, - count: number): Promise { + count: number, + options?: IRequestDataResultOptions): Promise { const { taskInfo } = await this.graphQLService.gql.asyncSqlExecuteQuery({ connectionId: sqlQueryParams.connectionId, contextId: sqlQueryParams.contextId, @@ -113,6 +116,7 @@ export class SQLQueryExecutionProcess extends Deferred { filter: { offset: rowOffset, limit: count, + constraints: RequestDataOptionsToConstrains(options), }, }); return taskInfo; diff --git a/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultPanel/SqlResultPanelController.ts b/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultPanel/SqlResultPanelController.ts index 8cd4f17791..b2fd539ffb 100644 --- a/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultPanel/SqlResultPanelController.ts +++ b/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultPanel/SqlResultPanelController.ts @@ -17,6 +17,7 @@ import { PromiseCancelledError } from '@dbeaver/core/utils'; import { fetchingSettings, IRequestDataResult, + IRequestDataResultOptions, RowDiff, TableViewerStorageService, TableViewerModel, @@ -155,9 +156,11 @@ implements IInitializableController, IDestructibleController { model: TableViewerModel, rowOffset: number, count: number, + options: IRequestDataResultOptions, ): Promise { - const queryExecutionProcess = this.sqlResultService.asyncSqlQuery(this.panelInit.sqlQueryParams, rowOffset, count); + const queryExecutionProcess = this.sqlResultService + .asyncSqlQuery(this.panelInit.sqlQueryParams, rowOffset, count, options); sqlExecutingState.setCurrentlyExecutingQuery(queryExecutionProcess); const response = await queryExecutionProcess.promise; const dataResults = this.sqlResultService.sqlExecuteInfoToData(response, this.panelInit.indexInResultSet, count); diff --git a/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultService.ts b/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultService.ts index 0f466f4cb3..332941ce62 100644 --- a/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultService.ts +++ b/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultService.ts @@ -12,7 +12,12 @@ import { GraphQLService, SqlExecuteInfo, } from '@dbeaver/core/sdk'; -import { IRequestDataResult, RowDiff } from '@dbeaver/data-viewer-plugin'; +import { + IRequestDataResult, + RowDiff, + IRequestDataResultOptions, + RequestDataOptionsToConstrains, +} from '@dbeaver/data-viewer-plugin'; import { ISqlQueryParams } from '../ISqlEditorTabState'; import { SQLQueryExecutionProcess } from './SQLQueryExecutionProcess'; @@ -28,7 +33,8 @@ export class SqlResultService { */ async fetchData(sqlQueryParams: ISqlQueryParams, rowOffset: number, - count: number): Promise { + count: number, + options: IRequestDataResultOptions): Promise { const response = await this.graphQLService.gql.executeSqlQuery({ connectionId: sqlQueryParams.connectionId, contextId: sqlQueryParams.contextId, @@ -37,6 +43,7 @@ export class SqlResultService { filter: { offset: rowOffset, limit: count, + constraints: RequestDataOptionsToConstrains(options), }, }); return response.result!; @@ -44,10 +51,11 @@ export class SqlResultService { asyncSqlQuery(sqlQueryParams: ISqlQueryParams, rowOffset: number, - count: number): SQLQueryExecutionProcess { + count: number, + options?: IRequestDataResultOptions): SQLQueryExecutionProcess { const cancellableSqlQuery = new SQLQueryExecutionProcess(this.graphQLService, this.notificationService); - cancellableSqlQuery.start(sqlQueryParams, rowOffset, count); + cancellableSqlQuery.start(sqlQueryParams, rowOffset, count, options); return cancellableSqlQuery; } diff --git a/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultTabs.tsx b/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultTabs.tsx index 00f7d21f82..063fb283d8 100644 --- a/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultTabs.tsx +++ b/webapp/packages/sql-editor/src/SqlResultTabs/SqlResultTabs.tsx @@ -70,7 +70,7 @@ export const SqlResultTabs = observer(function SqlDataResult({ tab }: SqlDataRes currentTabId={currentId} tabs={tab.handlerState.resultTabs.map(result => ( - + {result.name} ))} style={[styles]} diff --git a/webapp/packages/sql-editor/tsconfig.build.json b/webapp/packages/sql-editor/tsconfig.build.json deleted file mode 100644 index dd700023ea..0000000000 --- a/webapp/packages/sql-editor/tsconfig.build.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "extends": "../../tsconfig.base.json", - "compilerOptions": { - "declarationDir": "dist/types", - "declaration": true, - "noEmit": false, - "outDir": "dist/js" - }, - "exclude": [ - "node_modules", - "@dbeaver/**" - ], - "include": ["src/**/*"] -} diff --git a/webapp/packages/sql-editor/tsconfig.json b/webapp/packages/sql-editor/tsconfig.json index 6b4c45f333..26d254ccf5 100644 --- a/webapp/packages/sql-editor/tsconfig.json +++ b/webapp/packages/sql-editor/tsconfig.json @@ -1,5 +1,9 @@ { "extends": "../../tsconfig.json", + "compilerOptions": { + "declarationDir": "dist", + "outDir": "dist" + }, "include": [ "src" ], diff --git a/webapp/tsconfig.base.json b/webapp/tsconfig.base.json deleted file mode 100644 index c8a747fb46..0000000000 --- a/webapp/tsconfig.base.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "files": ["typings.d.ts"], - "compilerOptions": { - "moduleResolution": "node", - "target": "es2017", - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": false, - "skipLibCheck": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "downlevelIteration": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "sourceMap": true, - "resolveJsonModule": true, - "jsx": "preserve", - "isolatedModules": true, - "types": ["reflect-metadata", "node"], - "experimentalDecorators": true, - "emitDecoratorMetadata": true, - "baseUrl": "." - } -} diff --git a/webapp/tsconfig.json b/webapp/tsconfig.json index 1882fdb842..aed3df133a 100644 --- a/webapp/tsconfig.json +++ b/webapp/tsconfig.json @@ -1,26 +1,26 @@ { - "extends": "./tsconfig.base.json", + "files": ["typings.d.ts"], "compilerOptions": { - "paths": { - "@dbeaver/*": ["packages/*/src"], - - "@dbeaver/core/assets": ["packages/core/assets"], - - "@dbeaver/core/app": ["packages/core/src/app"], - "@dbeaver/core/blocks": ["packages/core/src/blocks"], - "@dbeaver/core/di": ["packages/core/src/di"], - "@dbeaver/core/dialogs": ["packages/core/src/dialogs"], - "@dbeaver/core/eventsLog": ["packages/core/src/eventsLog"], - "@dbeaver/core/localization": ["packages/core/src/localization"], - "@dbeaver/core/root": ["packages/core/src/root"], - "@dbeaver/core/sdk": ["packages/core/src/sdk"], - "@dbeaver/core/settings": ["packages/core/src/settings"], - "@dbeaver/core/theming": ["packages/core/src/theming"], - "@dbeaver/core/utils": ["packages/core/src/utils"], - "@dbeaver/core/extensions": ["packages/core/src/extensions"], - "@dbeaver/core/plugin": ["packages/core/src/plugin"], - "@dbeaver/core/product": ["packages/core/src/product"], - "@dbeaver/core/placeholder": ["packages/core/src/placeholder"] - } + "declaration": true, + "noEmit": false, + "moduleResolution": "node", + "target": "es2017", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": false, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "downlevelIteration": true, + "esModuleInterop": true, + "module": "esnext", + "sourceMap": true, + "resolveJsonModule": true, + "jsx": "preserve", + "isolatedModules": true, + "types": ["reflect-metadata", "node"], + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "declarationMap": true, + "baseUrl": "." } } diff --git a/webapp/yarn.lock b/webapp/yarn.lock index beb844f416..fce072f970 100644 --- a/webapp/yarn.lock +++ b/webapp/yarn.lock @@ -2,41 +2,41 @@ # yarn lockfile v1 -"@ag-grid-community/all-modules@^23.0.2": - version "23.0.2" - resolved "https://registry.yarnpkg.com/@ag-grid-community/all-modules/-/all-modules-23.0.2.tgz#3b224149c83a5495f8cf21f7f383d3e1b7098e86" - integrity sha512-JkzYoJ1+1oog0anO2FgrTHSYlpRceI2zRupXVCNKKWm7KFUyjM4bQAAKnq3iM8YYZEFrBSJYL+byT+k0CEUZcw== +"@ag-grid-community/all-modules@^23.1.1": + version "23.1.1" + resolved "https://registry.yarnpkg.com/@ag-grid-community/all-modules/-/all-modules-23.1.1.tgz#9a55c4ce592c5fb8b4f3ddec9e3196d61a876959" + integrity sha512-TjYTF6h7VDJXNW0w3hj5adDHdTJgNYaWOYCjnPBkQKx2dRgQMVqXGwtTWSPO3PForj/qmbrSCNIqYG84boHqKA== dependencies: - "@ag-grid-community/client-side-row-model" "~23.0.0" - "@ag-grid-community/core" "~23.0.0" - "@ag-grid-community/csv-export" "~23.0.0" - "@ag-grid-community/infinite-row-model" "~23.0.0" + "@ag-grid-community/client-side-row-model" "~23.1.0" + "@ag-grid-community/core" "~23.1.0" + "@ag-grid-community/csv-export" "~23.1.0" + "@ag-grid-community/infinite-row-model" "~23.1.0" -"@ag-grid-community/client-side-row-model@~23.0.0": - version "23.0.2" - resolved "https://registry.yarnpkg.com/@ag-grid-community/client-side-row-model/-/client-side-row-model-23.0.2.tgz#52eee1e4d50fa9cd7a0c3ab8787ef34ad27f13f2" - integrity sha512-1JLd3QTW3DsWn3oHdVJF1dDx7e8yI+KuEU8ii4zTHx33gDSaHGHlUqEY8E9oj4YzGcCFU/sscwxD3ZMQOVLFWA== +"@ag-grid-community/client-side-row-model@~23.1.0": + version "23.1.1" + resolved "https://registry.yarnpkg.com/@ag-grid-community/client-side-row-model/-/client-side-row-model-23.1.1.tgz#091b6a4190f2c5db203503b7c80f8b2aa8e269d1" + integrity sha512-oBkr2Y4EuaLB60PDM2AQAX74fez2fPsQzn+oWwzEKdO8bQdYCaJ6WjoZQXy417L+D9+zB9TIRTgm4zg74CaNJg== dependencies: - "@ag-grid-community/core" "~23.0.0" + "@ag-grid-community/core" "~23.1.0" -"@ag-grid-community/core@^23.0.2", "@ag-grid-community/core@~23.0.0": - version "23.0.2" - resolved "https://registry.yarnpkg.com/@ag-grid-community/core/-/core-23.0.2.tgz#b751a344222e75ea37f2545af21efd9b6579b53d" - integrity sha512-jCzthokscek+g3LGuARdZ4f7k3/wRgQX3mmzHBz8hCt96FULVErWEHe09jJIm9CT2iFPXucm5p0QP8iNYbO3vQ== +"@ag-grid-community/core@^23.1.1", "@ag-grid-community/core@~23.1.0": + version "23.1.1" + resolved "https://registry.yarnpkg.com/@ag-grid-community/core/-/core-23.1.1.tgz#f64db5dcd5f30c8959249f859efeeb64a8ce81c9" + integrity sha512-vTw4l2K5g/zre2QYmT1gfCDQ1TljT0kDaqyx6LkVLN2WSbPi1HfkD4qvYAGFBlVHa4cuOgp1chC2lPaabVLdzA== -"@ag-grid-community/csv-export@~23.0.0": - version "23.0.2" - resolved "https://registry.yarnpkg.com/@ag-grid-community/csv-export/-/csv-export-23.0.2.tgz#6d83be4406adae83d00a349b323eaea99b4d5ae5" - integrity sha512-pZoRhc5i/6+lt9BYNUc9x0hiJnCptgr1MZNkyYQfIswNbUBwJZT1eZyZyOIJFLyOlCPMvmHl2hUF6jsI6o722Q== +"@ag-grid-community/csv-export@~23.1.0": + version "23.1.1" + resolved "https://registry.yarnpkg.com/@ag-grid-community/csv-export/-/csv-export-23.1.1.tgz#62eca745d9612c16c607dcfe5d8192e0020930be" + integrity sha512-9TpYKngOuL3+5nIA56ilcUbXk0YYq4ooUPr8GqodrCHqP6FhocB8HhRpvYV8+KgOgWyPZa5jBe38ebCGxxNjPg== dependencies: - "@ag-grid-community/core" "~23.0.0" + "@ag-grid-community/core" "~23.1.0" -"@ag-grid-community/infinite-row-model@~23.0.0": - version "23.0.2" - resolved "https://registry.yarnpkg.com/@ag-grid-community/infinite-row-model/-/infinite-row-model-23.0.2.tgz#a7e6fd743122f145c3a27af43945a46a810eecec" - integrity sha512-yFBjE4RQYsjwBy1PVqrBZu3ojKUueEXyfSQ5UZZ38COIgPAOZE2ZFVS96dMU8CXVjJumHts62OIwUgExyyollw== +"@ag-grid-community/infinite-row-model@~23.1.0": + version "23.1.1" + resolved "https://registry.yarnpkg.com/@ag-grid-community/infinite-row-model/-/infinite-row-model-23.1.1.tgz#af4352e8aebbaf96cbf3270e7d4bdfd89505edf8" + integrity sha512-79sitY8wWMevnYd245YxyS0Em6Y985A6dsmTeBOmQJhrz7u/PxQp/ouNlopBwZtPj0cVWtXNir48VylvYCsWTQ== dependencies: - "@ag-grid-community/core" "~23.0.0" + "@ag-grid-community/core" "~23.1.0" "@babel/cli@^7.7.4": version "7.7.5" @@ -68,6 +68,28 @@ dependencies: "@babel/highlight" "^7.8.3" +"@babel/core@^7.0.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.10.0.tgz#a6fe5db77ebfb61e0da6c5c36aaf14aab07b2b44" + integrity sha512-FGgV2XyPoVtYDvbFXlukEWt13Afka4mBRQ2CoTsHxpgVGO6XfgtT6eI+WyjQRGGTL90IDkIVmme8riFCLZ8lUw== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.10.0" + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helpers" "^7.10.0" + "@babel/parser" "^7.10.0" + "@babel/template" "^7.10.0" + "@babel/traverse" "^7.10.0" + "@babel/types" "^7.10.0" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.1" + json5 "^2.1.2" + lodash "^4.17.13" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/core@^7.7.4": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.7.5.tgz#ae1323cd035b5160293307f50647e83f8ba62f7e" @@ -88,6 +110,16 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/generator@^7.10.0", "@babel/generator@^7.5.0", "@babel/generator@^7.9.6": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.0.tgz#a238837896edf35ee5fbfb074548d3256b4bc55d" + integrity sha512-ThoWCJHlgukbtCP79nAK4oLqZt5fVo70AHUni/y8Jotyg5rtJiG2FVl+iJjRNKIyl4hppqztLyAoEWcCvqyOFQ== + dependencies: + "@babel/types" "^7.10.0" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/generator@^7.5.5", "@babel/generator@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.4.tgz#db651e2840ca9aa66f327dcec1dc5f5fa9611369" @@ -98,16 +130,6 @@ lodash "^4.17.13" source-map "^0.5.0" -"@babel/generator@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" - integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== - dependencies: - "@babel/types" "^7.9.6" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - "@babel/helper-annotate-as-pure@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.4.tgz#bb3faf1e74b74bd547e867e48f551fa6b098b6ce" @@ -115,6 +137,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-annotate-as-pure@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz#60bc0bc657f63a0924ff9a4b4a0b24a13cf4deee" + integrity sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw== + dependencies: + "@babel/types" "^7.8.3" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.7.4.tgz#5f73f2b28580e224b5b9bd03146a4015d6217f5f" @@ -123,6 +152,15 @@ "@babel/helper-explode-assignable-expression" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-builder-react-jsx-experimental@^7.9.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz#0b4b3e04e6123f03b404ca4dfd6528fe6bb92fe3" + integrity sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-module-imports" "^7.8.3" + "@babel/types" "^7.9.5" + "@babel/helper-builder-react-jsx@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.7.4.tgz#da188d247508b65375b2c30cf59de187be6b0c66" @@ -131,6 +169,14 @@ "@babel/types" "^7.7.4" esutils "^2.0.0" +"@babel/helper-builder-react-jsx@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz#16bf391990b57732700a3278d4d9a81231ea8d32" + integrity sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/types" "^7.9.0" + "@babel/helper-call-delegate@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.7.4.tgz#621b83e596722b50c0066f9dc37d3232e461b801" @@ -140,28 +186,16 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/helper-create-class-features-plugin@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.4.tgz#fce60939fd50618610942320a8d951b3b639da2d" - integrity sha512-l+OnKACG4uiDHQ/aJT8dwpR+LhCJALxL0mJ6nzjB25e5IPwqV1VOsY7ah6UB1DG+VOXAIMtuC54rFJGiHkxjgA== - dependencies: - "@babel/helper-function-name" "^7.7.4" - "@babel/helper-member-expression-to-functions" "^7.7.4" - "@babel/helper-optimise-call-expression" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.7.4" - "@babel/helper-split-export-declaration" "^7.7.4" - "@babel/helper-create-class-features-plugin@^7.8.3": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz#965c8b0a9f051801fd9d3b372ca0ccf200a90897" - integrity sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow== + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.0.tgz#3a2b7b86f6365ea4ac3837a49ec5791e65217944" + integrity sha512-n4tPJaI0iuLRayriXTQ8brP3fMA/fNmxpxswfNuhe4qXQbcCWzeAqm6SeR/KExIOcdCvOh/KkPQVgBsjcb0oqA== dependencies: "@babel/helper-function-name" "^7.9.5" - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-member-expression-to-functions" "^7.10.0" + "@babel/helper-optimise-call-expression" "^7.10.0" "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.9.6" + "@babel/helper-replace-supers" "^7.10.0" "@babel/helper-split-export-declaration" "^7.8.3" "@babel/helper-create-regexp-features-plugin@^7.7.4": @@ -181,6 +215,15 @@ "@babel/types" "^7.7.4" lodash "^4.17.13" +"@babel/helper-define-map@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz#a0655cad5451c3760b726eba875f1cd8faa02c15" + integrity sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/types" "^7.8.3" + lodash "^4.17.13" + "@babel/helper-explode-assignable-expression@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.7.4.tgz#fa700878e008d85dc51ba43e9fb835cddfe05c84" @@ -198,7 +241,7 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/helper-function-name@^7.9.5": +"@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5": version "7.9.5" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== @@ -228,6 +271,13 @@ dependencies: "@babel/types" "^7.7.4" +"@babel/helper-member-expression-to-functions@^7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.0.tgz#e8cf57470bfd1247f2b41aa621a527e952efa6f1" + integrity sha512-xKLTpbMkJcvwEsDaTfs9h0IlfUiBLPFfybxaPpPPsQDsZTRg+UKh+86oK7sctHF3OUiRQkb10oS9MXSqgyV6/g== + dependencies: + "@babel/types" "^7.10.0" + "@babel/helper-member-expression-to-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.4.tgz#356438e2569df7321a8326644d4b790d2122cb74" @@ -235,13 +285,6 @@ dependencies: "@babel/types" "^7.7.4" -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.4.tgz#e5a92529f8888bf319a6376abfbd1cebc491ad91" @@ -268,6 +311,26 @@ "@babel/types" "^7.7.4" lodash "^4.17.13" +"@babel/helper-module-transforms@^7.9.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" + integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== + dependencies: + "@babel/helper-module-imports" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-simple-access" "^7.8.3" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/template" "^7.8.6" + "@babel/types" "^7.9.0" + lodash "^4.17.13" + +"@babel/helper-optimise-call-expression@^7.10.0", "@babel/helper-optimise-call-expression@^7.8.3": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.0.tgz#6dcfb565842f43bed31b24f3e4277f18826e5e79" + integrity sha512-HgMd8QKA8wMJs5uK/DYKdyzJAEuGt1zyDp9wLMlMR6LitTQTHPUE+msC82ZsEDwq+U3/yHcIXIngRm9MS4IcIg== + dependencies: + "@babel/types" "^7.10.0" + "@babel/helper-optimise-call-expression@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2" @@ -275,13 +338,6 @@ dependencies: "@babel/types" "^7.7.4" -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" - "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" @@ -310,6 +366,16 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-replace-supers@^7.10.0", "@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.0.tgz#26bc22ee1a35450934d2e2a9b27de10a22fac9d6" + integrity sha512-erl4iVeiANf14JszXP7b69bSrz3e3+qW09pVvEmTWwzRQEOoyb1WFlYCA8d/VjVZGYW8+nGpLh7swf9CifH5wg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.10.0" + "@babel/helper-optimise-call-expression" "^7.10.0" + "@babel/traverse" "^7.10.0" + "@babel/types" "^7.10.0" + "@babel/helper-replace-supers@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.4.tgz#3c881a6a6a7571275a72d82e6107126ec9e2cdd2" @@ -320,16 +386,6 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/helper-replace-supers@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444" - integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" - "@babel/helper-simple-access@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.4.tgz#a169a0adb1b5f418cfc19f22586b2ebf58a9a294" @@ -338,6 +394,14 @@ "@babel/template" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helper-simple-access@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" + integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== + dependencies: + "@babel/template" "^7.8.3" + "@babel/types" "^7.8.3" + "@babel/helper-split-export-declaration@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.4.tgz#57292af60443c4a3622cf74040ddc28e68336fd8" @@ -367,6 +431,15 @@ "@babel/traverse" "^7.7.4" "@babel/types" "^7.7.4" +"@babel/helpers@^7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.0.tgz#634400a0977b8dcf7b311761a77ca94ed974b3b6" + integrity sha512-lQtFJoDZAGf/t2PgR6Z59Q2MwjvOGGsxZ0BAlsrgyDhKuMbe63EfbQmVmcLfyTBj8J4UtiadQimcotvYVg/kVQ== + dependencies: + "@babel/template" "^7.10.0" + "@babel/traverse" "^7.10.0" + "@babel/types" "^7.10.0" + "@babel/helpers@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.7.4.tgz#62c215b9e6c712dadc15a9a0dcab76c92a940302" @@ -394,16 +467,21 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/parser@7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" + integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== + +"@babel/parser@^7.0.0", "@babel/parser@^7.10.0", "@babel/parser@^7.9.6": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.0.tgz#8eca3e71a73dd562c5222376b08253436bb4995b" + integrity sha512-fnDUl1Uy2gThM4IFVW4ISNHqr3cJrCsRkSCasFgx0XDO9JcttDS5ytyBc4Cu4X1+fjoo3IVvFbRD6TeFlHJlEQ== + "@babel/parser@^7.5.5", "@babel/parser@^7.7.4", "@babel/parser@^7.7.5": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.5.tgz#cbf45321619ac12d83363fcf9c94bb67fa646d71" integrity sha512-KNlOe9+/nk4i29g0VXgl8PEXIRms5xKLJeuZ6UptN0fHv+jDiriG+y94X6qAgWTR0h3KaoM1wK5G5h7MHFRSig== -"@babel/parser@^7.8.6", "@babel/parser@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" - integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== - "@babel/plugin-proposal-async-generator-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.7.4.tgz#0351c5ac0a9e927845fffd5b82af476947b7ce6d" @@ -413,7 +491,7 @@ "@babel/helper-remap-async-to-generator" "^7.7.4" "@babel/plugin-syntax-async-generators" "^7.7.4" -"@babel/plugin-proposal-class-properties@^7.8.3": +"@babel/plugin-proposal-class-properties@^7.0.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.8.3.tgz#5e06654af5cd04b608915aada9b2a6788004464e" integrity sha512-EqFhbo7IosdgPgZggHaNObkmO1kNUe3slaKu54d5OWvy+p9QIKOzK1GAEpAIsZtWVtPXUHSMcT4smvDrCfY4AA== @@ -421,15 +499,6 @@ "@babel/helper-create-class-features-plugin" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-proposal-decorators@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.7.4.tgz#58c1e21d21ea12f9f5f0a757e46e687b94a7ab2b" - integrity sha512-GftcVDcLCwVdzKmwOBDjATd548+IE+mBo7ttgatqNDR7VG7GqIuZPtRWlMLHbhTXhcnFZiGER8iIYl1n/imtsg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-decorators" "^7.7.4" - "@babel/plugin-proposal-dynamic-import@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.4.tgz#dde64a7f127691758cbfed6cf70de0fa5879d52d" @@ -446,6 +515,15 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.7.4" +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.0.tgz#d27b0910b637f7c9d9a5629f2adcd04dc9ea4e69" + integrity sha512-DOD+4TqMcRKJdAfN08+v9cciK5d0HW5hwTndOoKZEfEzU/mRrKboheD5mnWU4Q96VOnDdAj86kKjZhoQyG6s+A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.9.5" + "@babel/plugin-proposal-object-rest-spread@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.7.4.tgz#cc57849894a5c774214178c8ab64f6334ec8af71" @@ -462,14 +540,6 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.7.4" -"@babel/plugin-proposal-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.8.3.tgz#ae10b3214cb25f7adb1f3bc87ba42ca10b7e2543" - integrity sha512-QIoIR9abkVn+seDE3OjA08jWcs3eZ9+wJCKSRgo3WdEU2csFYgdScb+8qHB3+WXsGJD55u+5hWCISI7ejXS+kg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-proposal-unicode-property-regex@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.4.tgz#7c239ccaf09470dbe1d453d50057460e84517ebb" @@ -485,12 +555,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-decorators@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.7.4.tgz#3c91cfee2a111663ff3ac21b851140f5a52a4e0b" - integrity sha512-0oNLWNH4k5ZbBVfAwiTU53rKFWIeTh6ZlaWOXWJc4ywxs0tjz5fc3uZ6jKAnZSxN98eXVgg7bJIuzjX+3SXY+A== +"@babel/plugin-syntax-class-properties@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" + integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-dynamic-import@^7.7.4": version "7.7.4" @@ -506,6 +576,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz#f2c883bd61a6316f2c89380ae5122f923ba4527f" + integrity sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-json-strings@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.7.4.tgz#86e63f7d2e22f9e27129ac4e83ea989a382e86cc" @@ -513,6 +590,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz#521b06c83c40480f1e58b4fd33b92eceb1d6ea94" + integrity sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx@^7.2.0", "@babel/plugin-syntax-jsx@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.7.4.tgz#dab2b56a36fb6c3c222a1fbc71f7bf97f327a9ec" @@ -520,6 +604,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-syntax-object-rest-spread@^7.0.0", "@babel/plugin-syntax-object-rest-spread@^7.8.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + "@babel/plugin-syntax-object-rest-spread@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.7.4.tgz#47cf220d19d6d0d7b154304701f468fc1cc6ff46" @@ -534,13 +625,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-optional-chaining@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - "@babel/plugin-syntax-top-level-await@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.7.4.tgz#bd7d8fa7b9fee793a36e4027fd6dd1aa32f946da" @@ -548,12 +632,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-typescript@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.7.4.tgz#5d037ffa10f3b25a16f32570ebbe7a8c2efa304b" - integrity sha512-77blgY18Hud4NM1ggTA8xVT/dBENQf17OpiToSa2jSmEY3fWXD2jwrdVlO4kq5yzUTeF15WSQ6b4fByNvJcjpQ== +"@babel/plugin-transform-arrow-functions@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz#82776c2ed0cd9e1a49956daeb896024c9473b8b6" + integrity sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-arrow-functions@^7.7.4": version "7.7.4" @@ -571,6 +655,13 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-remap-async-to-generator" "^7.7.4" +"@babel/plugin-transform-block-scoped-functions@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz#437eec5b799b5852072084b3ae5ef66e8349e8a3" + integrity sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-block-scoped-functions@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.7.4.tgz#d0d9d5c269c78eaea76227ace214b8d01e4d837b" @@ -578,6 +669,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-block-scoping@^7.0.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.0.tgz#5d7aa0cf921ec91bdc97c9b311bf1fce0ea979b0" + integrity sha512-AoMn0D3nLG9i71useuBrZZTnHbjnhcaTXCckUtOx3JPuhGGJdOUYMwOV9niPJ+nZCk52dfLLqbmV3pBMCRQLNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + lodash "^4.17.13" + "@babel/plugin-transform-block-scoping@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.7.4.tgz#200aad0dcd6bb80372f94d9e628ea062c58bf224" @@ -586,6 +685,20 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" +"@babel/plugin-transform-classes@^7.0.0": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" + integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-define-map" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-optimise-call-expression" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-split-export-declaration" "^7.8.3" + globals "^11.1.0" + "@babel/plugin-transform-classes@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.4.tgz#c92c14be0a1399e15df72667067a8f510c9400ec" @@ -600,6 +713,13 @@ "@babel/helper-split-export-declaration" "^7.7.4" globals "^11.1.0" +"@babel/plugin-transform-computed-properties@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz#96d0d28b7f7ce4eb5b120bb2e0e943343c86f81b" + integrity sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-computed-properties@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.7.4.tgz#e856c1628d3238ffe12d668eb42559f79a81910d" @@ -607,6 +727,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-destructuring@^7.0.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.0.tgz#59145194029721e49e511afb4bdd1d2f38369180" + integrity sha512-yKoghHpYbC0eM+6o6arPUJT9BQBvOOn8iOCEHwFvkJ5gjAxYmoUaAuLwaoA9h2YvC6dzcRI0KPQOpRXr8qQTxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-destructuring@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.7.4.tgz#2b713729e5054a1135097b6a67da1b6fe8789267" @@ -637,6 +764,21 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-flow-strip-types@^7.0.0": + version "7.9.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.9.0.tgz#8a3538aa40434e000b8f44a3c5c9ac7229bd2392" + integrity sha512-7Qfg0lKQhEHs93FChxVLAvhBshOPQDtJUTVHr/ZwQNRccCm4O9D79r9tVSoV8iNwjP1YgfD+e/fgHcPkN1qEQg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-flow" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.0.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.0.tgz#ff2bf95dc1deb9b309c7fd78d9620ac9266a3efe" + integrity sha512-0ldl5xEe9kbuhB1cDqs17JiBPEm1+6/LH7loo29+MAJOyB/xbpLI/u6mRzDPjr0nYL7z0S14FPT4hs2gH8Im9Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-for-of@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.7.4.tgz#248800e3a5e507b1f103d8b4ca998e77c63932bc" @@ -644,6 +786,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-function-name@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz#279373cb27322aaad67c2683e776dfc47196ed8b" + integrity sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ== + dependencies: + "@babel/helper-function-name" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-function-name@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.7.4.tgz#75a6d3303d50db638ff8b5385d12451c865025b1" @@ -652,6 +802,13 @@ "@babel/helper-function-name" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-literals@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz#aef239823d91994ec7b68e55193525d76dbd5dc1" + integrity sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.7.4.tgz#27fe87d2b5017a2a5a34d1c41a6b9f6a6262643e" @@ -659,6 +816,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-member-expression-literals@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.8.3.tgz#963fed4b620ac7cbf6029c755424029fa3a40410" + integrity sha512-3Wk2EXhnw+rP+IDkK6BdtPKsUE5IeZ6QOGrPYvw52NwBStw9V1ZVzxgK6fSKSxqUvH9eQPR3tm3cOq79HlsKYA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-member-expression-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.7.4.tgz#aee127f2f3339fc34ce5e3055d7ffbf7aa26f19a" @@ -675,6 +839,16 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" +"@babel/plugin-transform-modules-commonjs@^7.0.0": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277" + integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ== + dependencies: + "@babel/helper-module-transforms" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-simple-access" "^7.8.3" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-commonjs@^7.7.5": version "7.7.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz#1d27f5eb0bcf7543e774950e5b2fa782e637b345" @@ -716,6 +890,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-object-super@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz#ebb6a1e7a86ffa96858bd6ac0102d65944261725" + integrity sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/helper-replace-supers" "^7.8.3" + "@babel/plugin-transform-object-super@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.7.4.tgz#48488937a2d586c0148451bf51af9d7dda567262" @@ -724,6 +906,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-replace-supers" "^7.7.4" +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" + integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== + dependencies: + "@babel/helper-get-function-arity" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-parameters@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.7.4.tgz#da4555c97f39b51ac089d31c7380f03bca4075ce" @@ -733,6 +923,13 @@ "@babel/helper-get-function-arity" "^7.7.4" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-property-literals@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.8.3.tgz#33194300d8539c1ed28c62ad5087ba3807b98263" + integrity sha512-uGiiXAZMqEoQhRWMK17VospMZh5sXWg+dlh2soffpkAl96KAm+WZuJfa6lcELotSRmooLqg0MWdH6UUq85nmmg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-property-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.7.4.tgz#2388d6505ef89b266103f450f9167e6bd73f98c2" @@ -740,6 +937,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-react-display-name@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.8.3.tgz#70ded987c91609f78353dd76d2fb2a0bb991e8e5" + integrity sha512-3Jy/PCw8Fe6uBKtEgz3M82ljt+lTg+xJaM4og+eyu83qLT87ZUSckn0wy7r31jflURWLO83TW6Ylf7lyXj3m5A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-react-display-name@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.7.4.tgz#9f2b80b14ebc97eef4a9b29b612c58ed9c0d10dd" @@ -763,6 +967,16 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.7.4" +"@babel/plugin-transform-react-jsx@^7.0.0": + version "7.9.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.9.4.tgz#86f576c8540bd06d0e95e0b61ea76d55f6cbd03f" + integrity sha512-Mjqf3pZBNLt854CK0C/kRuXAnE6H/bo7xYojP+WGtX8glDGSibcwnsWwhwoSuRg0+EBnxPC1ouVnuetUIlPSAw== + dependencies: + "@babel/helper-builder-react-jsx" "^7.9.0" + "@babel/helper-builder-react-jsx-experimental" "^7.9.0" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-jsx" "^7.8.3" + "@babel/plugin-transform-react-jsx@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.7.4.tgz#d91205717fae4e2f84d020cd3057ec02a10f11da" @@ -796,6 +1010,13 @@ resolve "^1.8.1" semver "^5.5.1" +"@babel/plugin-transform-shorthand-properties@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz#28545216e023a832d4d3a1185ed492bcfeac08c8" + integrity sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-shorthand-properties@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.7.4.tgz#74a0a9b2f6d67a684c6fbfd5f0458eb7ba99891e" @@ -803,6 +1024,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-transform-spread@^7.0.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.0.tgz#6918d9b2b52c604802bd50a5f22b649efddf9af6" + integrity sha512-P3Zj04ylqumJBjmjylNl05ZHRo4j4gFNG7P70loys0//q5BTe30E8xIj6PnqEWAfsPYu2sdIPcJeeQdclqlM6A== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-spread@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.7.4.tgz#aa673b356fe6b7e70d69b6e33a17fef641008578" @@ -818,6 +1046,14 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/helper-regex" "^7.0.0" +"@babel/plugin-transform-template-literals@^7.0.0": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz#7bfa4732b455ea6a43130adc0ba767ec0e402a80" + integrity sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-transform-template-literals@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.7.4.tgz#1eb6411736dd3fe87dbd20cc6668e5121c17d604" @@ -833,15 +1069,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typescript@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.4.tgz#2974fd05f4e85c695acaf497f432342de9fc0636" - integrity sha512-X8e3tcPEKnwwPVG+vP/vSqEShkwODOEeyQGod82qrIuidwIrfnsGn11qPM1jBLF4MqguTXXYzm58d0dY+/wdpg== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.7.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-typescript" "^7.7.4" - "@babel/plugin-transform-unicode-regex@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.4.tgz#a3c0f65b117c4c81c5b6484f2a5e7b95346b83ae" @@ -918,14 +1145,6 @@ "@babel/plugin-transform-react-jsx-self" "^7.7.4" "@babel/plugin-transform-react-jsx-source" "^7.7.4" -"@babel/preset-typescript@^7.7.4": - version "7.7.4" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.7.4.tgz#780059a78e6fa7f7a4c87f027292a86b31ce080a" - integrity sha512-rqrjxfdiHPsnuPur0jKrIIGQCIgoTWMTjlbWE69G4QJ6TIOVnnRnIJhUxNTL/VwDmEAVX08Tq3B1nirer5341w== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.7.4" - "@babel/runtime-corejs3@^7.7.4": version "7.7.6" resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.7.6.tgz#5b1044ea11b659d288f77190e19c62da959ed9a3" @@ -941,6 +1160,13 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/runtime@^7.0.0", "@babel/runtime@^7.9.2": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.0.tgz#2cdcd6d7a391c24f7154235134c830cfb58ac0b1" + integrity sha512-tgYb3zVApHbLHYOPWtVwg25sBqHhfBXRKeKoTIyoheIxln1nA7oBl7SfHfiTG2GhDPI8EUBkOD/0wJCP/3HN4Q== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.5", "@babel/runtime@^7.7.4": version "7.7.6" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.6.tgz#d18c511121aff1b4f2cd1d452f1bac9601dd830f" @@ -948,6 +1174,15 @@ dependencies: regenerator-runtime "^0.13.2" +"@babel/template@^7.10.0", "@babel/template@^7.8.3", "@babel/template@^7.8.6": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.10.0.tgz#f15d852ce16cd5fb3e219097a75f662710b249b1" + integrity sha512-aMLEQn5tcG49LEWrsEwxiRTdaJmvLem3+JMCMSeCy2TILau0IDVyWdm/18ACx7XOCady64FLt6KkHy28tkDQHQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/parser" "^7.10.0" + "@babel/types" "^7.10.0" + "@babel/template@^7.2.2", "@babel/template@^7.7.4": version "7.7.4" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.4.tgz#428a7d9eecffe27deac0a98e23bf8e3675d2a77b" @@ -957,14 +1192,35 @@ "@babel/parser" "^7.7.4" "@babel/types" "^7.7.4" -"@babel/template@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== +"@babel/traverse@7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" + integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/generator" "^7.9.6" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.10.0": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.0.tgz#290935529881baf619398d94fd453838bef36740" + integrity sha512-NZsFleMaLF1zX3NxbtXI/JCs2RPOdpGru6UBdGsfhdsDsP+kFF+h2QQJnMJglxk0kc69YmMFs4A44OJY0tKo5g== + dependencies: + "@babel/code-frame" "^7.8.3" + "@babel/generator" "^7.10.0" + "@babel/helper-function-name" "^7.9.5" + "@babel/helper-split-export-declaration" "^7.8.3" + "@babel/parser" "^7.10.0" + "@babel/types" "^7.10.0" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" "@babel/traverse@^7.5.5", "@babel/traverse@^7.7.4": version "7.7.4" @@ -981,20 +1237,23 @@ globals "^11.1.0" lodash "^4.17.13" -"@babel/traverse@^7.9.6": +"@babel/types@7.9.6": version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" - integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" + integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.6" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.6" - "@babel/types" "^7.9.6" - debug "^4.1.0" - globals "^11.1.0" + "@babel/helper-validator-identifier" "^7.9.5" lodash "^4.17.13" + to-fast-properties "^2.0.0" + +"@babel/types@^7.0.0", "@babel/types@^7.10.0", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6": + version "7.10.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.10.0.tgz#d47d92249e42393a5723aad5319035ae411e3e38" + integrity sha512-t41W8yWFyQFPOAAvPvjyRhejcLGnJTA3iRpFcDbEKwVJ3UnHQePFzLk8GagTsucJlImyNwrGikGsYURrWbQG8w== + dependencies: + "@babel/helper-validator-identifier" "^7.9.5" + lodash "^4.17.13" + to-fast-properties "^2.0.0" "@babel/types@^7.5.5", "@babel/types@^7.7.4": version "7.7.4" @@ -1014,15 +1273,6 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.8.6", "@babel/types@^7.9.5", "@babel/types@^7.9.6": - version "7.9.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" - integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== - dependencies: - "@babel/helper-validator-identifier" "^7.9.5" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - "@csstools/convert-colors@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" @@ -1127,14 +1377,386 @@ unique-filename "^1.1.1" which "^1.3.1" -"@jest/types@^24.9.0": - version "24.9.0" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-24.9.0.tgz#63cb26cb7500d069e5a389441a7c6ab5e909fc59" - integrity sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw== +"@graphql-codegen/add@1.15.0", "@graphql-codegen/add@^1.8.1": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/add/-/add-1.15.0.tgz#494c9a4409d78f12f352e013bea6f3437132a469" + integrity sha512-EUAfufvK0Lpt2aV1BDG7Nlt4z3cmqg0J+ahn74Q7lBUc3+6Yv5lZi6nKaPxvgyS5pWYZRnazcy8JZRGk7NmMJw== dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^1.1.1" - "@types/yargs" "^13.0.0" + "@graphql-codegen/plugin-helpers" "1.15.0" + tslib "~2.0.0" + +"@graphql-codegen/cli@^1.8.1": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/cli/-/cli-1.15.0.tgz#790f5495a17c58c4d5499a9f90903dd3412437fe" + integrity sha512-gnWM8OYmg4aWR21BlcRztAqJl/e3qzUZNvnJSoi5hPQr3ZuqZTY+o3ETAXrZtUwN4Lek6Qhjfl5PFKfxvcdfsg== + dependencies: + "@graphql-codegen/core" "1.15.0" + "@graphql-codegen/plugin-helpers" "1.15.0" + "@graphql-tools/apollo-engine-loader" "6.0.1" + "@graphql-tools/code-file-loader" "6.0.1" + "@graphql-tools/git-loader" "6.0.1" + "@graphql-tools/github-loader" "6.0.1" + "@graphql-tools/graphql-file-loader" "6.0.1" + "@graphql-tools/json-file-loader" "6.0.1" + "@graphql-tools/load" "6.0.1" + "@graphql-tools/prisma-loader" "6.0.1" + "@graphql-tools/url-loader" "6.0.1" + "@graphql-tools/utils" "6.0.1" + ansi-escapes "4.3.1" + camel-case "4.1.1" + chalk "4.0.0" + chokidar "3.4.0" + commander "5.1.0" + common-tags "1.8.0" + constant-case "3.0.3" + cosmiconfig "6.0.0" + debounce "1.2.0" + dependency-graph "0.9.0" + detect-indent "6.0.0" + glob "7.1.6" + graphql-config "3.0.2" + indent-string "4.0.0" + inquirer "7.1.0" + is-glob "4.0.1" + json-to-pretty-yaml "1.2.2" + listr "0.14.3" + listr-update-renderer "0.5.0" + log-symbols "4.0.0" + lower-case "2.0.1" + minimatch "3.0.4" + mkdirp "1.0.4" + pascal-case "3.1.1" + request "2.88.2" + ts-log "2.1.4" + tslib "^2.0.0" + upper-case "2.0.1" + valid-url "1.0.9" + wrap-ansi "7.0.0" + +"@graphql-codegen/core@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/core/-/core-1.15.0.tgz#d2bdd86746dda0d84f0a01e6c7845d24c51fcec6" + integrity sha512-+PdIqZ1bgjKUdVRmJoEkgHs2xHzKWlom2rb8UJs0m0ARfe0vAlJdFnMUNSsgPLnJN5nB8n0wd/SEDfPFEB1XHA== + dependencies: + "@graphql-codegen/plugin-helpers" "1.15.0" + "@graphql-tools/merge" "6.0.1" + "@graphql-tools/utils" "6.0.1" + tslib "~2.0.0" + +"@graphql-codegen/near-operation-file-preset@^1.8.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/near-operation-file-preset/-/near-operation-file-preset-1.15.0.tgz#16940903b521891d783e01adea55541d2e25ea57" + integrity sha512-AT7JxVwznVDocD3oSgUFy/fRcTyjp6eRBuvFDjcvcOVgSHnSTd9y6gBbR1ljeA5lAroJ0FaOS43Pla7ry4QPiw== + dependencies: + "@graphql-codegen/add" "1.15.0" + "@graphql-codegen/plugin-helpers" "1.15.0" + "@graphql-codegen/visitor-plugin-common" "1.15.0" + parse-filepath "1.0.2" + tslib "~2.0.0" + +"@graphql-codegen/plugin-helpers@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/plugin-helpers/-/plugin-helpers-1.15.0.tgz#140ba0b3c452eb6b81b820bbec536ee99faa8cfb" + integrity sha512-wCD5mY7g3ZP0ftuYEHiycmRgEyPuMihMyaas2Xd5DNgQ9MHUndjxOKbvlIA64Ju0BCL0tSSL5TKy2iITpEPbKQ== + dependencies: + "@graphql-tools/utils" "6.0.1" + camel-case "4.1.1" + common-tags "1.8.0" + constant-case "3.0.3" + import-from "3.0.0" + lower-case "2.0.1" + param-case "3.0.3" + pascal-case "3.1.1" + tslib "~2.0.0" + upper-case "2.0.1" + +"@graphql-codegen/typescript-graphql-files-modules@^1.8.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-graphql-files-modules/-/typescript-graphql-files-modules-1.15.0.tgz#9947d102b80e5ef09951afbe677d72a0159487ff" + integrity sha512-W+ezhqZQ62Y4Kh3pgQGbNf2iW6LVON5ZzH7/pbEie5rXtjrLPhQByjDAjTUW2cUpTCfOSxmJNu2ggq2TjC9wFA== + dependencies: + "@graphql-codegen/plugin-helpers" "1.15.0" + tslib "~2.0.0" + +"@graphql-codegen/typescript-graphql-request@^1.8.1": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-graphql-request/-/typescript-graphql-request-1.15.0.tgz#a178e868e97bf33a0180b24c0c8708de7a83eba1" + integrity sha512-xDyKlC1CY8lsKvDql45F5c9acyBg8jd1N8dXrJnGrKWkepMYa8NJp8KLnSMr/rqnck5i6+MQyBNSAAQfmvtJMA== + dependencies: + "@graphql-codegen/plugin-helpers" "1.15.0" + "@graphql-codegen/visitor-plugin-common" "1.15.0" + auto-bind "~4.0.0" + tslib "~2.0.0" + +"@graphql-codegen/typescript-operations@^1.8.1": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript-operations/-/typescript-operations-1.15.0.tgz#2e81f08fc999f244d46aef06460299566ff65ba1" + integrity sha512-EPRhgrCPgtSHvkHN68MY9KnOTR36nSuFs6pIUhD+bMCWCNfEosY6/jwGIAhBjoOrxqdf1RA793Siznb2dyJJMQ== + dependencies: + "@graphql-codegen/plugin-helpers" "1.15.0" + "@graphql-codegen/typescript" "1.15.0" + "@graphql-codegen/visitor-plugin-common" "1.15.0" + auto-bind "~4.0.0" + tslib "~2.0.0" + +"@graphql-codegen/typescript@1.15.0", "@graphql-codegen/typescript@^1.8.1": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/typescript/-/typescript-1.15.0.tgz#7dd5c66df2d5c7050543cbf0fd897b1d4451a137" + integrity sha512-9O0jJGzEdgpo/AwxA3j4FmZFI8pxcJAvaBOOt7Xc/eU5XcTckRl7cDjQaRzNh4DyS4uZ56+AMNqelf015mz3qg== + dependencies: + "@graphql-codegen/plugin-helpers" "1.15.0" + "@graphql-codegen/visitor-plugin-common" "1.15.0" + auto-bind "~4.0.0" + tslib "~2.0.0" + +"@graphql-codegen/visitor-plugin-common@1.15.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-1.15.0.tgz#2516baec59ec26b81bf3795cf58698b229e87ff4" + integrity sha512-XyJpomjVGFV7/jJKS6WFB4fciM7lEGy4mzHNlUtNV4vyohHiPBlb5P9OxIzw+7bLNZc9rqRUBfm9DSf0zTy/aQ== + dependencies: + "@graphql-codegen/plugin-helpers" "1.15.0" + "@graphql-tools/relay-operation-optimizer" "6.0.1" + array.prototype.flatmap "1.2.3" + auto-bind "~4.0.0" + dependency-graph "0.9.0" + graphql-tag "2.10.3" + parse-filepath "1.0.2" + pascal-case "3.1.1" + tslib "~2.0.0" + +"@graphql-toolkit/common@0.10.7", "@graphql-toolkit/common@~0.10.6": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/common/-/common-0.10.7.tgz#e5d4ddeae080c4f7357bc7d6a8d02e75578e9bd1" + integrity sha512-epcJvmIAo+vSEY76F0Dj1Ef6oeewT5pdMe1obHj7LHXN9V22O86aQzwdEEm1iG91qROqSw/apcDnSCMjuVeQVA== + dependencies: + aggregate-error "3.0.1" + camel-case "4.1.1" + graphql-tools "5.0.0" + lodash "4.17.15" + +"@graphql-toolkit/core@~0.10.6": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/core/-/core-0.10.7.tgz#e4d86d9e439fbb05b634054b0865c16d488fad97" + integrity sha512-LXcFLG7XcRJrPz/xD+0cExzLx/ptVynDM20650/FbmHbKOU50d9mSbcsrzAOq/3f4q3HrRDssvn0f6pPm0EHMg== + dependencies: + "@graphql-toolkit/common" "0.10.7" + "@graphql-toolkit/schema-merging" "0.10.7" + aggregate-error "3.0.1" + globby "11.0.0" + import-from "^3.0.0" + is-glob "4.0.1" + lodash "4.17.15" + p-limit "2.3.0" + resolve-from "5.0.0" + tslib "1.11.2" + unixify "1.0.0" + valid-url "1.0.9" + +"@graphql-toolkit/graphql-file-loader@~0.10.6": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/graphql-file-loader/-/graphql-file-loader-0.10.7.tgz#496e49712def12449b339739d3583ed1bda7a24f" + integrity sha512-6tUIuw/YBlm0VyVgXgMrOXsEQ+WpXVgr2NQwHNzmZo82kPGqImveq7A2D3gBWLyVTcinDScRcKJMxM4kCF5T0A== + dependencies: + "@graphql-toolkit/common" "0.10.7" + tslib "1.11.2" + +"@graphql-toolkit/json-file-loader@~0.10.6": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/json-file-loader/-/json-file-loader-0.10.7.tgz#6ac38258bc3da8540b38232b71bb5820bf02cff6" + integrity sha512-nVISrODqvn5LiQ4nKL5pz1Let/W1tuj2viEwrNyTS+9mcjaCE2nhV5MOK/7ZY0cR+XeA4N2u65EH1lQd63U3Cw== + dependencies: + "@graphql-toolkit/common" "0.10.7" + tslib "1.11.2" + +"@graphql-toolkit/schema-merging@0.10.7", "@graphql-toolkit/schema-merging@~0.10.6": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/schema-merging/-/schema-merging-0.10.7.tgz#7b33becd48629bc656d602405c0b5c17d33ebd85" + integrity sha512-VngxJbVdRfXYhdMLhL90pqN+hD/2XTZwhHPGvpWqmGQhT6roc98yN3xyDyrWFYYsuiY4gTexdmrHQ3d7mzitwA== + dependencies: + "@graphql-toolkit/common" "0.10.7" + deepmerge "4.2.2" + graphql-tools "5.0.0" + tslib "1.11.2" + +"@graphql-toolkit/url-loader@~0.10.6": + version "0.10.7" + resolved "https://registry.yarnpkg.com/@graphql-toolkit/url-loader/-/url-loader-0.10.7.tgz#0de998eeeaebcbf918526a26cb5f30f8250211f0" + integrity sha512-Ec3T4Zuo63LwG+RfK2ryz8ChPfncBf8fiSJ1xr68FtLDVznDNulvlNKFbfREE5koWejwsnJrjLCv6IX5IbhExg== + dependencies: + "@graphql-toolkit/common" "0.10.7" + cross-fetch "3.0.4" + graphql-tools "5.0.0" + tslib "1.11.2" + valid-url "1.0.9" + +"@graphql-tools/apollo-engine-loader@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-6.0.1.tgz#be0102def73b1d7504743d13310b892da9a960b0" + integrity sha512-nFWlwCIJMqvkmxLXOXkM6m3GHjQgf0hwZV7LfYp5t/3nU4xIVxKr/1Le3wnA94+PO6uKMnnwhb0NGHa/IvYRDQ== + dependencies: + "@graphql-tools/utils" "6.0.1" + cross-fetch "3.0.4" + tslib "~2.0.0" + +"@graphql-tools/code-file-loader@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/code-file-loader/-/code-file-loader-6.0.1.tgz#2f68e91d00d49768dea1fe6fe432ddb06b669708" + integrity sha512-4kB0DZI66VramNNk8WppzqP3NcFIzGQTImxHXcoWXw2QO9Nd7Wet4HP8BT61qUP3q2ty9+NkhJF8piytocd6OA== + dependencies: + "@graphql-tools/graphql-tag-pluck" "6.0.1" + "@graphql-tools/utils" "6.0.1" + fs-extra "9.0.0" + tslib "~2.0.0" + +"@graphql-tools/delegate@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/delegate/-/delegate-6.0.1.tgz#17581d5681ff1183d3492cd0b8acb74c8bfaa092" + integrity sha512-eb6KyskEOTOe3cJtqQGwoyjSxWZKvARPoS7bUB1ZY7SzSAFvDUomee3ercLVk9PTNwv+BE2ePpsFyAZkBhF4Xg== + dependencies: + "@graphql-tools/schema" "6.0.1" + "@graphql-tools/utils" "6.0.1" + tslib "~2.0.0" + +"@graphql-tools/git-loader@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/git-loader/-/git-loader-6.0.1.tgz#3f9575802aabde23c2b058bbaec3305b6f4bf499" + integrity sha512-nnv/6XaW9zsW5NGOJc2BJwpELJTdEsE1zTSqrVFCuQLiUqzRkDfWwLA8piFcIMH3B+65g7KIJGLfK2XH+MxXxw== + dependencies: + "@graphql-tools/graphql-tag-pluck" "6.0.1" + "@graphql-tools/utils" "6.0.1" + simple-git "2.5.0" + +"@graphql-tools/github-loader@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/github-loader/-/github-loader-6.0.1.tgz#81d00a7bdbf388f2f07ab7add12b3641de5db2a4" + integrity sha512-me3DzQU+qSqdmqrVAHUb8HNnGcDxFNXgsCU9qjjroclWOWNQzepXDenjczCseq/0Px9oT58AjjRb/0U8ygDtTA== + dependencies: + "@graphql-tools/graphql-tag-pluck" "6.0.1" + "@graphql-tools/utils" "6.0.1" + cross-fetch "3.0.4" + +"@graphql-tools/graphql-file-loader@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-file-loader/-/graphql-file-loader-6.0.1.tgz#93a383b7ef59a585b78092370aa794467ae91fe7" + integrity sha512-8wHHzAp3fu6ot2Kj4DNNPDQQJuxjsP4Yv9JIjKVgEDEjt7oJe6FhtITkrq3ewolRXeSFPVF77im02aUSgs3PUw== + dependencies: + "@graphql-tools/import" "6.0.1" + "@graphql-tools/utils" "6.0.1" + fs-extra "9.0.0" + tslib "~2.0.0" + +"@graphql-tools/graphql-tag-pluck@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-6.0.1.tgz#29b3b3df128e49d9feb95592da7a12f859175b8a" + integrity sha512-KnVXjemtoaXvGcnVr6OG2HEgWgfw8bY9atnBsPArHS86xWZd9+xDiYBItaKTaXzHUZYf0Y1spKbo5fRgcNqdlA== + dependencies: + "@babel/parser" "7.9.6" + "@babel/traverse" "7.9.6" + "@babel/types" "7.9.6" + "@graphql-tools/utils" "6.0.1" + optionalDependencies: + vue-template-compiler "^2.6.11" + +"@graphql-tools/import@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/import/-/import-6.0.1.tgz#4dde866317d9cfffb88b6a8985aa35c034d30717" + integrity sha512-d+ZLx2qPUCR2/9UnxW1tLpN1hEJlI72k881MXn1LZvEJOYDHGwV5sVJRjOuW7YyKL630z7CM5m0GsCYk7zJCtA== + dependencies: + fs-extra "9.0.0" + resolve-from "5.0.0" + +"@graphql-tools/json-file-loader@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/json-file-loader/-/json-file-loader-6.0.1.tgz#42174a9300e61335f9476c847fb05097036e1ac0" + integrity sha512-GqSgRcGDv+VqY2v+cT9IKXlzCYeFesyb2jOLDgOkp+dM8jKXfxAsMGIlsMXdWJ954Nb86KBP51whL1q5tpXKPA== + dependencies: + "@graphql-tools/utils" "6.0.1" + fs-extra "9.0.0" + tslib "~2.0.0" + +"@graphql-tools/load@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/load/-/load-6.0.1.tgz#431ac8e98c515fe2ecaf1c3c261c36ee78c1eaeb" + integrity sha512-DX/+7uoglRsY87b8m/VjO8zAyF+IHp/SVKLlqwWIfv4GCw4Qx0ad9yRgWvIDDDISWZtUEft5HR2OpozqtIwSLQ== + dependencies: + "@graphql-tools/merge" "6.0.1" + "@graphql-tools/utils" "6.0.1" + globby "11.0.0" + import-from "3.0.0" + is-glob "4.0.1" + p-limit "2.3.0" + tslib "~2.0.0" + unixify "1.0.0" + valid-url "1.0.9" + +"@graphql-tools/merge@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/merge/-/merge-6.0.1.tgz#2ce4efe5f541b7ea34b80e94e546dd4b99dde274" + integrity sha512-kQFAoF3N8KXUhY0uEbdM5qAIrDvrWiPIuFktvbYMyJMU2K0xMiAokNDNYACBZ+UOC8aRUIismjB2/ylKqefU3Q== + dependencies: + "@graphql-tools/schema" "6.0.1" + "@graphql-tools/utils" "6.0.1" + tslib "~2.0.0" + +"@graphql-tools/prisma-loader@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/prisma-loader/-/prisma-loader-6.0.1.tgz#6eb3d88dfd734a2674d64ec3bd17771d8b9801c8" + integrity sha512-XkKD6fd+/bGPAV55jzXtkG7qPCytyRQ2XULLdRQNjyNg10R68iYA1wVAMP+tL84J0gpikmO9Bu2QiwxdCAFNwA== + dependencies: + "@graphql-tools/url-loader" "6.0.1" + "@graphql-tools/utils" "6.0.1" + fs-extra "9.0.0" + prisma-yml "1.34.10" + tslib "~2.0.0" + +"@graphql-tools/relay-operation-optimizer@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-6.0.1.tgz#1776774895c30d9126a6f343746023fc22093638" + integrity sha512-p2ZH+ov5JZfQW9P/w+o3SGNLiEJ9DHCrhfQuG6C8jJOqUs5TXtwqEaATdR19tuWYDCglmkBCYh727TYO9xwwXQ== + dependencies: + "@graphql-tools/utils" "6.0.1" + relay-compiler "9.1.0" + +"@graphql-tools/schema@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/schema/-/schema-6.0.1.tgz#7464982c866e2b772976d6d97a4ce7f72f93cbb0" + integrity sha512-/X9Uji9BCulP5vx69pLD6TcmETRKl71qVAZbNUEURklpU3kty8zrCqs6gqO2nz4nEJzYRrXFTMf+zZ6L7Ae3ew== + dependencies: + "@graphql-tools/utils" "6.0.1" + tslib "~2.0.0" + +"@graphql-tools/url-loader@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/url-loader/-/url-loader-6.0.1.tgz#b7ebcd8fe4dd7756b01039eb5992a46aa6327e80" + integrity sha512-Op+WqdQyFbNisY6hLKJYpc7HiYtiUD7JlzPqglFld9sgWv2dRHpQ9VB/oyzDhq+pLZ4KweVMPr8Bqfl/qw5cyg== + dependencies: + "@graphql-tools/utils" "6.0.1" + "@graphql-tools/wrap" "6.0.1" + cross-fetch "3.0.4" + tslib "~2.0.0" + valid-url "1.0.9" + +"@graphql-tools/utils@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/utils/-/utils-6.0.1.tgz#2c65c15102ff59963d0c399c48616402c110bbc1" + integrity sha512-HqqJFYFG464ydL6XgUkwmYJLO/VzCsD86Bl25AX7aCLabPpn4O/pwCKSKRFsGQZvZbrth+urkHpyRU82Iqw2RQ== + dependencies: + camel-case "4.1.1" + +"@graphql-tools/wrap@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@graphql-tools/wrap/-/wrap-6.0.1.tgz#8ef2bb5bf83898331e8e69cd402828c08fd2d845" + integrity sha512-8D5TZalct+7yqXbkv6fdpLs81/60T3EjL1SP/xAjvRlKCy3nrGL31xLeJmch6sqH3yQvzhD9sISmkjs6xTNAqQ== + dependencies: + "@graphql-tools/delegate" "6.0.1" + "@graphql-tools/schema" "6.0.1" + "@graphql-tools/utils" "6.0.1" + tslib "~2.0.0" + +"@kwsites/exec-p@^0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@kwsites/exec-p/-/exec-p-0.4.0.tgz#ab3765d482849ba6e825721077c248cf9f3323b7" + integrity sha512-44DWNv5gDR9EwrCTVQ4ZC99yPqVS0VCWrYIBl45qNR8XQy+4lbl0IQG8kBDf6NHwj4Ib4c2z1Fq1IUJOCbkZcw== "@lerna/add@3.19.0": version "3.19.0" @@ -1923,11 +2545,32 @@ call-me-maybe "^1.0.1" glob-to-regexp "^0.3.0" +"@nodelib/fs.scandir@2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" + integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== + dependencies: + "@nodelib/fs.stat" "2.0.3" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" + integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== + "@nodelib/fs.stat@^1.1.2": version "1.1.3" resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@nodelib/fs.walk@^1.2.3": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" + integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== + dependencies: + "@nodelib/fs.scandir" "2.1.3" + fastq "^1.6.0" + "@octokit/endpoint@^5.5.0": version "5.5.1" resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.5.1.tgz#2eea81e110ca754ff2de11c79154ccab4ae16b3f" @@ -2121,6 +2764,56 @@ mkdirp "^0.5.1" webpack-virtual-modules "0.1.10" +"@rollup/plugin-babel@^5.0.2": + version "5.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.0.2.tgz#d9351b9545b0c586a193fc99830d4b1a25317ed5" + integrity sha512-GiL7jL+FGppzQ1Sn4y2ER4UYXlgXFFEt+sHm4WJEzQwI76Yf9oy2QDqIvcon6xApZWlik3L8fezRGC6Mj2vRXg== + dependencies: + "@babel/helper-module-imports" "^7.7.4" + "@rollup/pluginutils" "^3.0.8" + +"@rollup/plugin-commonjs@^12.0.0": + version "12.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-12.0.0.tgz#e2f308ae6057499e0f413f878fff7c3a0fdc02a1" + integrity sha512-8+mDQt1QUmN+4Y9D3yCG8AJNewuTSLYPJVzKKUZ+lGeQrI+bV12Tc5HCyt2WdlnG6ihIL/DPbKRJlB40DX40mw== + dependencies: + "@rollup/pluginutils" "^3.0.8" + commondir "^1.0.1" + estree-walker "^1.0.1" + glob "^7.1.2" + is-reference "^1.1.2" + magic-string "^0.25.2" + resolve "^1.11.0" + +"@rollup/plugin-node-resolve@^8.0.0": + version "8.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.0.0.tgz#47cc0775e31b6a531c88a40270377fe899a271cb" + integrity sha512-5poJCChrkVggXXND/sQ7yNqwjUNT4fP31gpRWCnSNnlXuUXTCMHT33xZrTGxgjm5Rl18MHj7iEzlCT8rYWwQSA== + dependencies: + "@rollup/pluginutils" "^3.0.8" + "@types/resolve" "0.0.8" + builtin-modules "^3.1.0" + deep-freeze "^0.0.1" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.14.2" + +"@rollup/pluginutils@^3.0.8": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.0.10.tgz#a659b9025920378494cd8f8c59fbf9b3a50d5f12" + integrity sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@samverschueren/stream-to-observable@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" + integrity sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg== + dependencies: + any-observable "^0.3.0" + "@types/codemirror@^0.0.91": version "0.0.91" resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-0.0.91.tgz#4cb9832388726e57e747f0e3a8ab69105ad02a66" @@ -2169,33 +2862,6 @@ dependencies: graphql "*" -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== - -"@types/istanbul-lib-report@*": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#e5471e7fa33c61358dd38426189c037a58433b8c" - integrity sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== - dependencies: - "@types/istanbul-lib-coverage" "*" - "@types/istanbul-lib-report" "*" - -"@types/jest@^24.0.23": - version "24.0.23" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-24.0.23.tgz#046f8e2ade026fe831623e361a36b6fb9a4463e4" - integrity sha512-L7MBvwfNpe7yVPTXLn32df/EK+AMBFAFvZrRuArGs7npEWnlziUXK+5GMIUTI4NIuwok3XibsjXCs5HxviYXjg== - dependencies: - jest-diff "^24.3.0" - "@types/json-schema@^7.0.3": version "7.0.3" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.3.tgz#bdfd69d61e464dcc81b25159c270d75a73c1a636" @@ -2216,6 +2882,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.17.tgz#191b71e7f4c325ee0fb23bc4a996477d92b8c39b" integrity sha512-Is+l3mcHvs47sKy+afn2O1rV4ldZFU7W8101cNlOd+MRbjM4Onida8jSZnJdTe/0Pcf25g9BNIUsuugmE6puHA== +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + "@types/prop-types@*": version "15.7.3" resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" @@ -2268,18 +2939,6 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-7.0.2.tgz#d680a9c596ef84abf5c4c07a32ffd66d582526f8" integrity sha512-8Ly3zIPTnT0/8RCU6Kg/G3uTICf9sRwYOpUzSIM3503tLIKcnJPRuinHhXngJUy2MntrEf6dlpOHXJju90Qh5w== -"@types/yargs-parser@*": - version "13.1.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-13.1.0.tgz#c563aa192f39350a1d18da36c5a8da382bbd8228" - integrity sha512-gCubfBUZ6KxzoibJ+SCUc/57Ms1jz5NjHe4+dI2krNmU5zCPAphyLJYyTOg06ueIyfj+SaCUqmzun7ImlxDcKg== - -"@types/yargs@^13.0.0": - version "13.0.3" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.3.tgz#76482af3981d4412d65371a318f992d33464a380" - integrity sha512-K8/LfZq2duW33XW/tFwEAfnZlqIfVsoyRB3kfXdPXYhl0nfM8mmh7GS0jg7WrX2Dgq/0Ha/pR1PaR+BvmWwjiQ== - dependencies: - "@types/yargs-parser" "*" - "@typescript-eslint/eslint-plugin@^2.5.0": version "2.11.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.11.0.tgz#4477c33491ccf0a9a3f4a30ef84978fa0ea0cad2" @@ -2291,15 +2950,6 @@ regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@1.13.0", "@typescript-eslint/experimental-utils@^1.13.0": - version "1.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz#b08c60d780c0067de2fb44b04b432f540138301e" - integrity sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg== - dependencies: - "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "1.13.0" - eslint-scope "^4.0.0" - "@typescript-eslint/experimental-utils@2.11.0": version "2.11.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.11.0.tgz#cef18e6b122706c65248a5d8984a9779ed1e52ac" @@ -2309,15 +2959,14 @@ "@typescript-eslint/typescript-estree" "2.11.0" eslint-scope "^5.0.0" -"@typescript-eslint/parser@^1.10.2": +"@typescript-eslint/experimental-utils@^1.13.0": version "1.13.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-1.13.0.tgz#61ac7811ea52791c47dc9fd4dd4a184fae9ac355" - integrity sha512-ITMBs52PCPgLb2nGPoeT4iU3HdQZHcPaZVw+7CsFagRJHUhyeTgorEwHXhFf3e7Evzi8oujKNpHc8TONth8AdQ== + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-1.13.0.tgz#b08c60d780c0067de2fb44b04b432f540138301e" + integrity sha512-zmpS6SyqG4ZF64ffaJ6uah6tWWWgZ8m+c54XXgwFtUv0jNz8aJAVx8chMCvnk7yl6xwn8d+d96+tWp7fXzTuDg== dependencies: - "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "1.13.0" + "@types/json-schema" "^7.0.3" "@typescript-eslint/typescript-estree" "1.13.0" - eslint-visitor-keys "^1.0.0" + eslint-scope "^4.0.0" "@typescript-eslint/parser@^2.8.0": version "2.11.0" @@ -2513,6 +3162,13 @@ "@webassemblyjs/wast-parser" "1.8.5" "@xtuc/long" "4.2.2" +"@wry/equality@^0.1.2": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790" + integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA== + dependencies: + tslib "^1.9.3" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -2553,29 +3209,12 @@ accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: mime-types "~2.1.24" negotiator "0.6.2" -acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= - dependencies: - acorn "^3.0.4" - -acorn-jsx@^5.0.0, acorn-jsx@^5.1.0: +acorn-jsx@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.1.0.tgz#294adb71b57398b0680015f0a38c563ee1db5384" integrity sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw== -acorn@^3.0.4: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= - -acorn@^5.5.0: - version "5.7.3" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" - integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== - -acorn@^6.0.7, acorn@^6.2.1: +acorn@^6.2.1: version "6.4.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== @@ -2585,15 +3224,15 @@ acorn@^7.1.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c" integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ== -ag-grid-community@^23.0.2: - version "23.0.2" - resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-23.0.2.tgz#81fc92ce9e47c75e854337a1e2d8ef950c3a1d51" - integrity sha512-UaD4lEVKKVCA2rrgMJJV328sCp5rdR9hgOh6oMUpZRXCke/3m/r2odjGjzvfT7yeLClj6ZdZuCkM4NmEuCZ8KA== +ag-grid-community@^23.1.1: + version "23.1.1" + resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-23.1.1.tgz#049ebbd2b521df4b1ad54ae68d98144cf9963e07" + integrity sha512-bWpilWkD7b19BNoycVfifAmXVZGI+s1m/G6ixx7tOcXTQEU+tA6dWiHn2kxt1iiLsixvEwi/6JQu1j9Iykrb7Q== -ag-grid-react@^23.0.3: - version "23.0.3" - resolved "https://registry.yarnpkg.com/ag-grid-react/-/ag-grid-react-23.0.3.tgz#2f632b877bd934b9d59c1590273a4487c71cd49f" - integrity sha512-zKhbD9vabBH1wRf/i7dwz1hCT2v0fE26Ss4dEXL3sZ492Abx18NjSXu/piOzLVWxLzmGErB1FmIPF2YYhY1SvA== +ag-grid-react@^23.1.1: + version "23.1.1" + resolved "https://registry.yarnpkg.com/ag-grid-react/-/ag-grid-react-23.1.1.tgz#0aa78c8d088a7535f7ae1612be88e70ed5f908be" + integrity sha512-zjQHgn7YjJsPO+vnEUPzM8d6IEX/8CvG8eL6F2w3+AE599hDEBwK1E8dggdkNOqQLlmNubI1q+yfvRT2gCsaBg== dependencies: prop-types "^15.6.2" @@ -2618,6 +3257,14 @@ agentkeepalive@^3.4.1: dependencies: humanize-ms "^1.2.1" +aggregate-error@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" + integrity sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" @@ -2628,7 +3275,17 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== -ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5, ajv@^6.9.1: +ajv@5: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5: version "6.10.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== @@ -2653,7 +3310,14 @@ ansi-colors@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== -ansi-escapes@^3.2.0: +ansi-escapes@4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61" + integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA== + dependencies: + type-fest "^0.11.0" + +ansi-escapes@^3.0.0, ansi-escapes@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== @@ -2680,7 +3344,7 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= -ansi-regex@^4.0.0, ansi-regex@^4.1.0: +ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== @@ -2718,6 +3382,11 @@ ansi-styles@^4.1.0: "@types/color-name" "^1.1.1" color-convert "^2.0.1" +any-observable@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b" + integrity sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog== + any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -2739,6 +3408,45 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +apollo-link-http-common@^0.2.14: + version "0.2.16" + resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc" + integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg== + dependencies: + apollo-link "^1.2.14" + ts-invariant "^0.4.0" + tslib "^1.9.3" + +apollo-link@^1.2.12, apollo-link@^1.2.14: + version "1.2.14" + resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9" + integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg== + dependencies: + apollo-utilities "^1.3.0" + ts-invariant "^0.4.0" + tslib "^1.9.3" + zen-observable-ts "^0.8.21" + +apollo-upload-client@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/apollo-upload-client/-/apollo-upload-client-13.0.0.tgz#146d1ddd85d711fcac8ca97a72d3ca6787f2b71b" + integrity sha512-lJ9/bk1BH1lD15WhWRha2J3+LrXrPIX5LP5EwiOUHv8PCORp4EUrcujrA3rI5hZeZygrTX8bshcuMdpqpSrvtA== + dependencies: + "@babel/runtime" "^7.9.2" + apollo-link "^1.2.12" + apollo-link-http-common "^0.2.14" + extract-files "^8.0.0" + +apollo-utilities@^1.3.0: + version "1.3.4" + resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf" + integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig== + dependencies: + "@wry/equality" "^0.1.2" + fast-json-stable-stringify "^2.0.0" + ts-invariant "^0.4.0" + tslib "^1.10.0" + aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -2827,6 +3535,11 @@ array-union@^1.0.1, array-union@^1.0.2: dependencies: array-uniq "^1.0.1" +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -2845,12 +3558,21 @@ array.prototype.flat@^1.2.1: define-properties "^1.1.3" es-abstract "^1.17.0-next.1" +array.prototype.flatmap@1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.2.3.tgz#1c13f84a178566042dd63de4414440db9222e443" + integrity sha512-OOEk+lkePcg+ODXIpvuU9PAryCikCJyo7GlDG1upleEpQRx6mzL9puEBkozQ5iAx20KV0l3DbyQwqciJtqe5Pg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + function-bind "^1.1.1" + arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= -asap@^2.0.0: +asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY= @@ -2931,6 +3653,11 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + atob-lite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" @@ -2941,6 +3668,11 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +auto-bind@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" + integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== + autoprefixer@^9.6.1: version "9.7.3" resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.3.tgz#fd42ed03f53de9beb4ca0d61fb4f7268a9bb50b4" @@ -2989,6 +3721,13 @@ babel-plugin-dynamic-import-node@^2.3.0: dependencies: object.assign "^4.1.0" +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== + dependencies: + object.assign "^4.1.0" + babel-plugin-macros@2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.5.1.tgz#4a119ac2c2e19b458c259b9accd7ee34fd57ec6f" @@ -3003,12 +3742,43 @@ babel-plugin-react-require@^3.1.1: resolved "https://registry.yarnpkg.com/babel-plugin-react-require/-/babel-plugin-react-require-3.1.1.tgz#5c3d2564fa16b1e45212ed52519db147b1596106" integrity sha512-XFz+B0dWx41fnGnugzCWn5rOgrDHb150N5gFhUfO3BgYDCT25o4sofRtd9uUfqUHoRu+t4/r5Cr2RMPIKuCt2g== -babel-plugin-transform-typescript-metadata@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-typescript-metadata/-/babel-plugin-transform-typescript-metadata-0.2.2.tgz#fc44611187409ed9d5cb372ca2f85939a359cada" - integrity sha512-wWRw1p3IDNZN8l3UOLgeScq9Nhh4lvxT7ZOvUzYi5sMw8lUWW+KdRlnBeQKehHAsgDs5TR6PvMJmsQ6e6NmKCg== +babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: + version "7.0.0-beta.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-7.0.0-beta.0.tgz#aa213c1435e2bffeb6fca842287ef534ad05d5cf" + integrity sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ== + +babel-preset-fbjs@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/babel-preset-fbjs/-/babel-preset-fbjs-3.3.0.tgz#a6024764ea86c8e06a22d794ca8b69534d263541" + integrity sha512-7QTLTCd2gwB2qGoi5epSULMHugSVgpcVt5YAeiFO9ABLrutDQzKfGwzxgZHLpugq8qMdg/DhRZDZ5CLKxBkEbw== dependencies: - "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-class-properties" "^7.0.0" + "@babel/plugin-proposal-object-rest-spread" "^7.0.0" + "@babel/plugin-syntax-class-properties" "^7.0.0" + "@babel/plugin-syntax-flow" "^7.0.0" + "@babel/plugin-syntax-jsx" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.0.0" + "@babel/plugin-transform-arrow-functions" "^7.0.0" + "@babel/plugin-transform-block-scoped-functions" "^7.0.0" + "@babel/plugin-transform-block-scoping" "^7.0.0" + "@babel/plugin-transform-classes" "^7.0.0" + "@babel/plugin-transform-computed-properties" "^7.0.0" + "@babel/plugin-transform-destructuring" "^7.0.0" + "@babel/plugin-transform-flow-strip-types" "^7.0.0" + "@babel/plugin-transform-for-of" "^7.0.0" + "@babel/plugin-transform-function-name" "^7.0.0" + "@babel/plugin-transform-literals" "^7.0.0" + "@babel/plugin-transform-member-expression-literals" "^7.0.0" + "@babel/plugin-transform-modules-commonjs" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.0.0" + "@babel/plugin-transform-parameters" "^7.0.0" + "@babel/plugin-transform-property-literals" "^7.0.0" + "@babel/plugin-transform-react-display-name" "^7.0.0" + "@babel/plugin-transform-react-jsx" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.0.0" + "@babel/plugin-transform-spread" "^7.0.0" + "@babel/plugin-transform-template-literals" "^7.0.0" + babel-plugin-syntax-trailing-function-commas "^7.0.0-beta.0" balanced-match@^1.0.0: version "1.0.0" @@ -3149,7 +3919,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@~3.0.2: +braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -3229,11 +3999,23 @@ browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.6.4, browserslist@^4.8 electron-to-chromium "^1.3.322" node-releases "^1.1.42" +bser@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + btoa-lite@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk= + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -3366,6 +4148,14 @@ camel-case@3.0.x: no-case "^2.2.0" upper-case "^1.1.1" +camel-case@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.1.tgz#1fc41c854f00e2f7d0139dfeba1542d6896fe547" + integrity sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q== + dependencies: + pascal-case "^3.1.1" + tslib "^1.10.0" + camelcase-css@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" @@ -3403,7 +4193,7 @@ camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -camelcase@^5.0.0, camelcase@^5.3.1: +camelcase@^5.0.0: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -3428,7 +4218,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: +chalk@2.4.2, chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3437,7 +4227,15 @@ chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.1, chalk@^2.4. escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^1.1.1, chalk@^1.1.3: +chalk@4.0.0, chalk@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" + integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= @@ -3448,10 +4246,10 @@ chalk@^1.1.1, chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz#6e98081ed2d17faab615eb52ac66ec1fe6209e72" - integrity sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A== +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== dependencies: ansi-styles "^4.1.0" supports-color "^7.1.0" @@ -3461,6 +4259,21 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +chokidar@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" + integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" + "chokidar@>=2.0.0 <4.0.0": version "3.3.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" @@ -3542,7 +4355,12 @@ clean-css@4.2.x: dependencies: source-map "~0.6.0" -cli-cursor@^2.1.0: +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cli-cursor@^2.0.0, cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= @@ -3556,6 +4374,14 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" +cli-truncate@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" + integrity sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ= + dependencies: + slice-ansi "0.0.4" + string-width "^1.0.1" + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -3611,6 +4437,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + coa@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz#43f6c21151b4ef2bf57187db0d73de229e3e7ec3" @@ -3686,7 +4517,7 @@ columnify@^1.5.4: strip-ansi "^3.0.0" wcwidth "^1.0.0" -combined-stream@^1.0.6, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -3698,6 +4529,11 @@ commander@2.17.x: resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== +commander@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + commander@^2.11.0, commander@^2.20.0, commander@~2.20.3: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" @@ -3713,7 +4549,7 @@ commander@~2.19.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== -common-tags@1.8.0, common-tags@^1.4.0: +common-tags@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" integrity sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw== @@ -3816,6 +4652,15 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= +constant-case@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.3.tgz#ac910a99caf3926ac5112f352e3af599d8c5fc0a" + integrity sha512-FXtsSnnrFYpzDmvwDGQW+l8XK3GV1coLyBN0eBz16ZUzGaZcT2ANVCJmLeuw2GQgxKHQIe9e0w2dzkSfaRlUmA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + upper-case "^2.0.1" + constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -3986,16 +4831,27 @@ core-js-pure@^3.0.0: resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.5.0.tgz#f63c7f2b245e7d678e73f87ad28505480554d70e" integrity sha512-wB0QtKAofWigiISuT1Tej3hKgq932fB//Lf1VoPbiLpTYlHY0nIDhgF+q1na0DAKFHH5wGCirkAknOmDN8ijXA== -core-js@^3.1.4: - version "3.5.0" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.5.0.tgz#66df8e49be4bd775e6f952a9d083b756ad41c1ed" - integrity sha512-Ifh3kj78gzQ7NAoJXeTu+XwzDld0QRIwjBLRqAMhuLhP3d2Av5wmgE9ycfnvK6NAEjTkQ1sDPeoEZAWO3Hx1Uw== +core-js@^2.4.1: + version "2.6.11" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" + integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= +cosmiconfig@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + cosmiconfig@^5.0.0, cosmiconfig@^5.1.0, cosmiconfig@^5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz#040f726809c591e77a17c0a3626ca45b4f168b1a" @@ -4045,6 +4901,14 @@ cross-fetch@2.2.2: node-fetch "2.1.2" whatwg-fetch "2.0.4" +cross-fetch@3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.4.tgz#7bef7020207e684a7638ef5f2f698e24d9eb283c" + integrity sha512-MSHgpjQqgbT/94D4CyADeNoYh52zMkCX4pcJvPP5WqPsLFMKjr2TCMg381ox5qI0ii2dPwaLx/00477knXqXVw== + dependencies: + node-fetch "2.6.0" + whatwg-fetch "3.0.0" + cross-spawn@6.0.5, cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" @@ -4118,24 +4982,6 @@ css-loader@^0.9.1: loader-utils "~0.2.2" source-map "~0.1.38" -css-loader@^3.2.1: - version "3.3.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.3.2.tgz#41b2086528aa4fbf8c0692e874bc14f081129b21" - integrity sha512-4XSiURS+YEK2fQhmSaM1onnUm0VKWNf6WWBYjkp9YbSDGCBTVZ5XOM6Gkxo8tLgQlzkZOBJvk9trHlDk4gjEYg== - dependencies: - camelcase "^5.3.1" - cssesc "^3.0.0" - icss-utils "^4.1.1" - loader-utils "^1.2.3" - normalize-path "^3.0.0" - postcss "^7.0.23" - postcss-modules-extract-imports "^2.0.0" - postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.1.1" - postcss-modules-values "^3.0.0" - postcss-value-parser "^4.0.2" - schema-utils "^2.6.0" - css-modules-loader-core@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz#5908668294a1becd261ae0a4ce21b0b551f21d16" @@ -4348,11 +5194,26 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" +date-fns@^1.27.2: + version "1.30.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== +de-indent@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" + integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= + +debounce@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/debounce/-/debounce-1.2.0.tgz#44a540abc0ea9943018dc0eaa95cce87f65cd131" + integrity sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg== + debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -4426,11 +5287,21 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== +deep-freeze@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deep-freeze/-/deep-freeze-0.0.1.tgz#3a0b0005de18672819dfd38cd31f91179c893e84" + integrity sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ= + deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deepmerge@4.2.2, deepmerge@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" + integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + default-gateway@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" @@ -4503,6 +5374,16 @@ depd@~1.1.2: resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= +dependency-graph@0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.9.0.tgz#11aed7e203bc8b00f48356d92db27b265c445318" + integrity sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w== + +deprecated-decorator@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" + integrity sha1-AJZjF7ehL+kvPMgx91g68ym4bDc= + deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -4526,6 +5407,11 @@ detect-file@^1.0.0: resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= +detect-indent@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" + integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== + detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" @@ -4549,11 +5435,6 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -diff-sequences@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5" - integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -4585,10 +5466,12 @@ dir-glob@^2.0.0, dir-glob@^2.2.2: dependencies: path-type "^3.0.0" -dlv@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/dlv/-/dlv-1.1.3.tgz#5c198a8a11453596e751494d49874bc7732f2e79" - integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" dns-equal@^1.0.0: version "1.0.0" @@ -4706,6 +5589,14 @@ domutils@^2.0.0: domelementtype "^2.0.1" domhandler "^3.0.0" +dot-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.3.tgz#21d3b52efaaba2ea5fda875bb1aa8124521cf4aa" + integrity sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + dot-prop@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" @@ -4720,6 +5611,11 @@ dot-prop@^4.1.1, dot-prop@^4.2.0: dependencies: is-obj "^1.0.0" +dotenv@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" + integrity sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0= + duplexer@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -4743,6 +5639,13 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +ecdsa-sig-formatter@1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf" + integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ== + dependencies: + safe-buffer "^5.0.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -4753,6 +5656,11 @@ electron-to-chromium@^1.3.322: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8" integrity sha512-Tc8JQEfGQ1MzfSzI/bTlSr7btJv/FFO7Yh6tanqVmIWOuNCu6/D1MilIEgLtmWqIrsv+o4IjpLAhgMBr/ncNAA== +elegant-spinner@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" + integrity sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4= + elliptic@^6.0.0: version "6.5.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" @@ -4878,6 +5786,11 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es6-promise@4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" + integrity sha1-eILzCt3lskDM+n99eMVIMwlRrkI= + es6-promise@^4.0.3: version "4.2.8" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" @@ -5018,14 +5931,6 @@ eslint-plugin-react@^7.16.0: prop-types "^15.7.2" resolve "^1.13.1" -eslint-scope@^3.7.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" - integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - eslint-scope@^4.0.0, eslint-scope@^4.0.3: version "4.0.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" @@ -5042,60 +5947,18 @@ eslint-scope@^5.0.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-utils@^1.3.1, eslint-utils@^1.4.3: +eslint-utils@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== dependencies: eslint-visitor-keys "^1.1.0" -eslint-visitor-keys@^1.0.0, eslint-visitor-keys@^1.1.0: +eslint-visitor-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2" integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A== -eslint@^5.0.0: - version "5.16.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.16.0.tgz#a1e3ac1aae4a3fbd8296fcf8f7ab7314cbb6abea" - integrity sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.9.1" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^4.0.3" - eslint-utils "^1.3.1" - eslint-visitor-keys "^1.0.0" - espree "^5.0.1" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob "^7.1.2" - globals "^11.7.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^6.2.2" - js-yaml "^3.13.0" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.11" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.2" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^5.5.1" - strip-ansi "^4.0.0" - strip-json-comments "^2.0.1" - table "^5.2.3" - text-table "^0.2.0" - eslint@^6.6.0: version "6.7.2" resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.7.2.tgz#c17707ca4ad7b2d8af986a33feba71e18a9fecd1" @@ -5139,23 +6002,6 @@ eslint@^6.6.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" -espree@^3.5.2: - version "3.5.4" - resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A== - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - -espree@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.1.tgz#5d6526fa4fc7f0788a5cf75b15f30323e2f81f7a" - integrity sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A== - dependencies: - acorn "^6.0.7" - acorn-jsx "^5.0.0" - eslint-visitor-keys "^1.0.0" - espree@^6.1.2: version "6.1.2" resolved "https://registry.yarnpkg.com/espree/-/espree-6.1.2.tgz#6c272650932b4f91c3714e5e7b5f5e2ecf47262d" @@ -5170,7 +6016,7 @@ esprima@^4.0.0: resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.0, esquery@^1.0.1: +esquery@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== @@ -5194,6 +6040,11 @@ estree-walker@^0.6.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + esutils@^2.0.0, esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -5357,6 +6208,11 @@ extract-css-chunks-webpack-plugin@^4.7.1: webpack-external-import "^0.3.0-beta.0" webpack-sources "^1.1.0" +extract-files@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/extract-files/-/extract-files-8.1.0.tgz#46a0690d0fe77411a2e3804852adeaa65cd59288" + integrity sha512-PTGtfthZK79WUMk+avLmwx3NGdU8+iVFXC2NMGxKsn0MnihOG2lvumj+AZo8CTwTrwjXDgZ5tztbRlEdRjBonQ== + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -5367,12 +6223,17 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + integrity sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ= + fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= -fast-glob@^2.0.2, fast-glob@^2.2.6: +fast-glob@^2.0.2, fast-glob@^2.2.2, fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" integrity sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw== @@ -5384,6 +6245,18 @@ fast-glob@^2.0.2, fast-glob@^2.2.6: merge2 "^1.2.3" micromatch "^3.1.10" +fast-glob@^3.1.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.2.tgz#ade1a9d91148965d4bf7c51f72e1ca662d32e63d" + integrity sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -5399,6 +6272,13 @@ fastparse@^1.1.1: resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== +fastq@^1.6.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" + integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== + dependencies: + reusify "^1.0.4" + faye-websocket@^0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" @@ -5413,11 +6293,45 @@ faye-websocket@~0.11.1: dependencies: websocket-driver ">=0.5.1" +fb-watchman@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" + integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== + dependencies: + bser "2.1.1" + +fbjs-css-vars@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" + integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== + +fbjs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-1.0.0.tgz#52c215e0883a3c86af2a7a776ed51525ae8e0a5a" + integrity sha512-MUgcMEJaFhCaF1QtWGnmq9ZDRAzECTCRAF7O6UZIlAlkTs1SasiX9aP0Iw7wfD2mJ7wDTNfg2w7u5fSCwJk1OA== + dependencies: + core-js "^2.4.1" + fbjs-css-vars "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.18" + figgy-pudding@^3.4.1, figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== +figures@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -5446,14 +6360,6 @@ file-loader@^0.8.1: dependencies: loader-utils "~0.2.5" -file-loader@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.0.2.tgz#7f3d8b4ac85a5e8df61338cfec95d7405f971caa" - integrity sha512-QMiQ+WBkGLejKe81HU8SZ9PovsU/5uaLo0JdTCEXOYv7i7jfAjHZi1tcwp9tSASJPOmmHZtbdCervFmXMH/Dcg== - dependencies: - loader-utils "^1.2.3" - schema-utils "^2.5.0" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -5604,6 +6510,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.0.tgz#31b7e39c85f1355b7139ee0c647cf0de7f83c682" + integrity sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -5647,6 +6562,25 @@ fs-extra@8.1.0, fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.0.0.tgz#b6afc31036e247b2466dc99c29ae797d5d4580a3" + integrity sha512-pmEYSk3vYsG/bF651KPUXZ+hvjpgWYw/Gc7W9NFUe3ZVLczKKWIij3IKpOrQcdw4TILtibFslZ0UmR8Vvzig4g== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^1.0.0" + +fs-extra@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.7" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" @@ -5740,6 +6674,11 @@ genfun@^5.0.0: resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== +gensync@^1.0.0-beta.1: + version "1.0.0-beta.1" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" + integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -5854,12 +6793,31 @@ glob-parent@^5.0.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" +glob-parent@^5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" + integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== + dependencies: + is-glob "^4.0.1" + glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.6, glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.1: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -5915,7 +6873,7 @@ global@^4.3.0: min-document "^2.19.0" process "^0.11.10" -globals@^11.1.0, globals@^11.7.0: +globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== @@ -5932,6 +6890,18 @@ globalyzer@^0.1.0: resolved "https://registry.yarnpkg.com/globalyzer/-/globalyzer-0.1.4.tgz#bc8e273afe1ac7c24eea8def5b802340c5cc534f" integrity sha512-LeguVWaxgHN0MNbWC6YljNMzHkrCny9fzjmEUdnF1kQ7wATFD1RHFRqA1qxaX2tgxGENlcxjOflopBwj3YZiXA== +globby@11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.0.tgz#56fd0e9f0d4f8fb0c456f1ab0dee96e1380bc154" + integrity sha512-iuehFnR3xu5wBBtm4xi0dMe92Ob87ufyu/dHwpDYfbcpYpIbrO5OnS8M1vWvrBhSGEJ3/Ecj7gnX76P8YxpPEg== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.1.1" + ignore "^5.1.4" + merge2 "^1.3.0" + slash "^3.0.0" + globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -6006,13 +6976,47 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== -graphql-request@^1.8.2: +graphql-config@3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/graphql-config/-/graphql-config-3.0.2.tgz#dfec1ff193dc3791457cb09a973887cf1e4aad50" + integrity sha512-efoimZ4F2wF2OwZJzPq2KdPjQs1K+UgJSfsHoHBBA0TwveGyQ/0kS3lUphhJg/JXIrZociuRkfjrk8JC4iPPJQ== + dependencies: + "@graphql-toolkit/common" "~0.10.6" + "@graphql-toolkit/core" "~0.10.6" + "@graphql-toolkit/graphql-file-loader" "~0.10.6" + "@graphql-toolkit/json-file-loader" "~0.10.6" + "@graphql-toolkit/schema-merging" "~0.10.6" + "@graphql-toolkit/url-loader" "~0.10.6" + cosmiconfig "6.0.0" + minimatch "3.0.4" + tslib "^1.11.1" + +graphql-request@^1.5.0, graphql-request@^1.8.2: version "1.8.2" resolved "https://registry.yarnpkg.com/graphql-request/-/graphql-request-1.8.2.tgz#398d10ae15c585676741bde3fc01d5ca948f8fbe" integrity sha512-dDX2M+VMsxXFCmUX0Vo0TopIZIX4ggzOtiCsThgtrKR4niiaagsGTDIHj3fsOMFETpa064vzovI+4YV4QnMbcg== dependencies: cross-fetch "2.2.2" +graphql-tag@2.10.3: + version "2.10.3" + resolved "https://registry.yarnpkg.com/graphql-tag/-/graphql-tag-2.10.3.tgz#ea1baba5eb8fc6339e4c4cf049dabe522b0edf03" + integrity sha512-4FOv3ZKfA4WdOKJeHdz6B3F/vxBLSgmBcGeAFPf4n1F64ltJUvOOerNj0rsJxONQGdhUMynQIvd6LzB+1J5oKA== + +graphql-tools@5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-5.0.0.tgz#67281c834a0e29f458adba8018f424816fa627e9" + integrity sha512-5zn3vtn//382b7G3Wzz3d5q/sh+f7tVrnxeuhTMTJ7pWJijNqLxH7VEzv8VwXCq19zAzHYEosFHfXiK7qzvk7w== + dependencies: + apollo-link "^1.2.14" + apollo-upload-client "^13.0.0" + deprecated-decorator "^0.1.6" + form-data "^3.0.0" + iterall "^1.3.0" + node-fetch "^2.6.0" + tslib "^1.11.1" + uuid "^7.0.3" + graphql@*, graphql@^14.5.8: version "14.5.8" resolved "https://registry.yarnpkg.com/graphql/-/graphql-14.5.8.tgz#504f3d3114cb9a0a3f359bbbcf38d9e5bf6a6b3c" @@ -6041,7 +7045,7 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.1.0: +har-validator@~5.1.0, har-validator@~5.1.3: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== @@ -6135,7 +7139,7 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -he@1.2.x: +he@1.2.x, he@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -6349,7 +7353,7 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= -https-proxy-agent@^2.2.3: +https-proxy-agent@^2.2.1, https-proxy-agent@^2.2.3: version "2.2.4" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== @@ -6410,6 +7414,16 @@ ignore@^4.0.3, ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +ignore@^5.1.4: + version "5.1.6" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.6.tgz#643194ad4bf2712f37852e386b6998eff0db2106" + integrity sha512-cgXgkypZBcCnOgSihyeqbo6gjIaIyDqPQB7Ra4vhE9m6kigdGoQDMHjviFhRZo3IMlRy6yElosoviMs5YxZXUA== + +immutable@~3.7.6: + version "3.7.6" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.7.6.tgz#13b4d3cb12befa15482a26fe1b2ebae640071e4b" + integrity sha1-E7TTyxK++hVIKib+Gy665kAHHks= + import-cwd@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz#aa6cf36e722761285cb371ec6519f53e2435b0a9" @@ -6432,7 +7446,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0: +import-fresh@^3.0.0, import-fresh@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== @@ -6440,6 +7454,13 @@ import-fresh@^3.0.0: parent-module "^1.0.0" resolve-from "^4.0.0" +import-from@3.0.0, import-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" + integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== + dependencies: + resolve-from "^5.0.0" + import-from@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz#335db7f2a7affd53aaa471d4b8021dee36b7f3b1" @@ -6447,13 +7468,6 @@ import-from@^2.1.0: dependencies: resolve-from "^3.0.0" -import-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/import-from/-/import-from-3.0.0.tgz#055cfec38cd5a27d8057ca51376d7d3bf0891966" - integrity sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ== - dependencies: - resolve-from "^5.0.0" - import-local@2.0.0, import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -6472,6 +7486,11 @@ in-publish@^2.0.0: resolved "https://registry.yarnpkg.com/in-publish/-/in-publish-2.0.0.tgz#e20ff5e3a2afc2690320b6dc552682a9c7fadf51" integrity sha1-4g/146KvwmkDILbcVSaCqcf631E= +indent-string@4.0.0, indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" @@ -6484,11 +7503,6 @@ indent-string@^3.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - indexes-of@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" @@ -6541,7 +7555,26 @@ init-package-json@^1.10.3: validate-npm-package-license "^3.0.1" validate-npm-package-name "^3.0.0" -inquirer@^6.2.0, inquirer@^6.2.2: +inquirer@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29" + integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg== + dependencies: + ansi-escapes "^4.2.1" + chalk "^3.0.0" + cli-cursor "^3.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^3.0.0" + lodash "^4.17.15" + mute-stream "0.0.8" + run-async "^2.4.0" + rxjs "^6.5.3" + string-width "^4.1.0" + strip-ansi "^6.0.0" + through "^2.3.6" + +inquirer@^6.2.0: version "6.5.2" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.5.2.tgz#ad50942375d036d327ff528c08bd5fab089928ca" integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== @@ -6644,6 +7677,14 @@ is-absolute-url@^3.0.3: resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -6799,6 +7840,13 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-glob@4.0.1, is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== + dependencies: + is-extglob "^2.1.1" + is-glob@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" @@ -6806,13 +7854,6 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - is-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" @@ -6835,6 +7876,13 @@ is-obj@^1.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= +is-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + integrity sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA== + dependencies: + symbol-observable "^1.1.0" + is-path-cwd@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" @@ -6892,6 +7940,13 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== + dependencies: + is-unc-path "^1.0.0" + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" @@ -6904,7 +7959,7 @@ is-ssh@^1.3.0: dependencies: protocols "^1.1.0" -is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -6935,6 +7990,13 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== + dependencies: + unc-path-regex "^0.1.2" + is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -6977,6 +8039,14 @@ isobject@^4.0.0: resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== +isomorphic-fetch@^2.1.1, isomorphic-fetch@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + integrity sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk= + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -6987,20 +8057,10 @@ iterall@^1.2.2: resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" integrity sha512-yynBb1g+RFUPY64fTrFv7nsjRrENBQJaX2UL+2Szc9REFrSNm1rpSXHGzhmAy7a9uv3vlvgBlXnf9RqmPH1/DA== -jest-diff@^24.3.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-24.9.0.tgz#931b7d0d5778a1baf7452cb816e325e3724055da" - integrity sha512-qMfrTs8AdJE2iqrTp0hzh7kTd2PQWrsFyj9tORoKmu32xjPjeE4NyjVRDz8ybYwqS2ik8N4hsIpiVTyFeo2lBQ== - dependencies: - chalk "^2.0.1" - diff-sequences "^24.9.0" - jest-get-type "^24.9.0" - pretty-format "^24.9.0" - -jest-get-type@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-24.9.0.tgz#1684a0c8a50f2e4901b6644ae861f579eed2ef0e" - integrity sha512-lUseMzAley4LhIcpSP9Jf+fTrQ4a1yHQwLNeeVa2cEmbCGeoZAtYPOIv8JaxLD/sUpKxetKGP+gsHl8f8TSj8Q== +iterall@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" + integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== js-base64@^2.1.8: version "2.5.1" @@ -7017,7 +8077,15 @@ js-levenshtein@^1.1.3: resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== -js-yaml@^3.13.0, js-yaml@^3.13.1: +js-yaml@^3.10.0: + version "3.14.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" + integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== @@ -7045,6 +8113,11 @@ json-parse-better-errors@^1.0.0, json-parse-better-errors@^1.0.1, json-parse-bet resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + integrity sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A= + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -7060,11 +8133,26 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= +json-to-pretty-yaml@1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/json-to-pretty-yaml/-/json-to-pretty-yaml-1.2.2.tgz#f4cd0bd0a5e8fe1df25aaf5ba118b099fd992d5b" + integrity sha1-9M0L0KXo/h3yWq9boRiwmf2ZLVs= + dependencies: + remedial "^1.0.7" + remove-trailing-spaces "^1.0.6" + json3@^3.3.2: version "3.3.3" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" @@ -7089,6 +8177,13 @@ json5@^2.1.0: dependencies: minimist "^1.2.0" +json5@^2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" + integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + dependencies: + minimist "^1.2.5" + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -7096,11 +8191,41 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" + integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== + dependencies: + universalify "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= +jsonwebtoken@^8.1.0: + version "8.5.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d" + integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w== + dependencies: + jws "^3.2.2" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^5.6.0" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -7119,6 +8244,23 @@ jsx-ast-utils@^2.2.1, jsx-ast-utils@^2.2.3: array-includes "^3.0.3" object.assign "^4.1.0" +jwa@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a" + integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA== + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" + +jws@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304" + integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA== + dependencies: + jwa "^1.4.1" + safe-buffer "^5.0.1" + killable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" @@ -7193,6 +8335,55 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + +listr-silent-renderer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" + integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= + +listr-update-renderer@0.5.0, listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== + dependencies: + chalk "^2.4.1" + cli-cursor "^2.1.0" + date-fns "^1.27.2" + figures "^2.0.0" + +listr@0.14.3: + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== + dependencies: + "@samverschueren/stream-to-observable" "^0.3.0" + is-observable "^1.1.0" + is-promise "^2.1.0" + is-stream "^1.1.0" + listr-silent-renderer "^1.1.1" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -7320,11 +8511,31 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8= + +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= + +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M= + lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w= + lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -7345,16 +8556,16 @@ lodash.memoize@^4.1.2: resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.merge@^4.6.0: - version "4.6.2" - resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - lodash.mergewith@^4.6.2: version "4.6.2" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz#617121f89ac55f59047c7aec1ccd6654c6590f55" integrity sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w= + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -7390,20 +8601,35 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.1, lodash@~4.17.10: +lodash@4.17.15, lodash@^4.0.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.1, lodash@~4.17.10: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -loglevel-colored-level-prefix@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz#6a40218fdc7ae15fc76c3d0f3e676c465388603e" - integrity sha1-akAhj9x64V/HbD0PPmdsRlOIYD4= +log-symbols@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920" + integrity sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA== dependencies: - chalk "^1.1.3" - loglevel "^1.4.1" + chalk "^4.0.0" -loglevel@^1.4.1, loglevel@^1.6.4: +log-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" + integrity sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg= + dependencies: + chalk "^1.0.0" + +log-update@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/log-update/-/log-update-2.3.0.tgz#88328fd7d1ce7938b29283746f0b1bc126b24708" + integrity sha1-iDKP19HOeTiykoN0bwsbwSayRwg= + dependencies: + ansi-escapes "^3.0.0" + cli-cursor "^2.0.0" + wrap-ansi "^3.0.1" + +loglevel@^1.6.4: version "1.6.6" resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.6.tgz#0ee6300cc058db6b3551fa1c4bf73b83bb771312" integrity sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ== @@ -7423,6 +8649,13 @@ loud-rejection@^1.0.0: currently-unhandled "^0.4.1" signal-exit "^3.0.0" +lower-case@2.0.1, lower-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" + integrity sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ== + dependencies: + tslib "^1.10.0" + lower-case@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" @@ -7513,7 +8746,7 @@ map-age-cleaner@^0.1.1: dependencies: p-defer "^1.0.0" -map-cache@^0.2.2: +map-cache@^0.2.0, map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= @@ -7630,7 +8863,15 @@ merge-descriptors@1.0.1: resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= -merge2@^1.2.3: +merge-jsons-webpack-plugin@^1.0.21: + version "1.0.21" + resolved "https://registry.yarnpkg.com/merge-jsons-webpack-plugin/-/merge-jsons-webpack-plugin-1.0.21.tgz#e0dec30fdf3ea67b6338290ab01288fbf1f12fbf" + integrity sha512-5Brw0DBi7tF48gm3BB21hu3qYWUMHuKWHKNqdZYmGTQlZQFTc63VFY/5LgonqusI/b0uvvjkpTdx1WrjInXreQ== + dependencies: + es6-promise "4.0.5" + glob "7.1.1" + +merge2@^1.2.3, merge2@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.3.0.tgz#5b366ee83b2f1582c48f87e47cf1a9352103ca81" integrity sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw== @@ -7659,6 +8900,14 @@ micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" +micromatch@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" + integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== + dependencies: + braces "^3.0.1" + picomatch "^2.0.5" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -7726,7 +8975,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.4, minimatch@~3.0.2: +minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -7751,6 +9000,11 @@ minimist@^1.1.3, minimist@^1.2.0: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== + minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" @@ -7809,6 +9063,11 @@ mkdirp@*, mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~ dependencies: minimist "0.0.8" +mkdirp@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mobx-react-lite@2: version "2.0.6" resolved "https://registry.yarnpkg.com/mobx-react-lite/-/mobx-react-lite-2.0.6.tgz#e1307a2b271c6a6016c8ad815a25014b7f95997d" @@ -7958,6 +9217,14 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +no-case@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.3.tgz#c21b434c1ffe48b39087e86cfb4d2582e9df18f8" + integrity sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw== + dependencies: + lower-case "^2.0.1" + tslib "^1.10.0" + node-fetch-npm@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" @@ -7972,11 +9239,19 @@ node-fetch@2.1.2: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= -node-fetch@^2.3.0, node-fetch@^2.5.0: +node-fetch@2.6.0, node-fetch@^2.3.0, node-fetch@^2.5.0, node-fetch@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-forge@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" @@ -8017,6 +9292,11 @@ node-gyp@^5.0.2: tar "^4.4.12" which "1" +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + node-libs-browser@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" @@ -8226,6 +9506,11 @@ nth-check@^1.0.2, nth-check@~1.0.1: dependencies: boolbase "~1.0.0" +nullthrows@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1" + integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== + num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" @@ -8395,7 +9680,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.2, optionator@^0.8.3: +optionator@^0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -8476,6 +9761,13 @@ p-is-promise@^2.0.0: resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== +p-limit@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + p-limit@^1.1.0: version "1.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" @@ -8600,6 +9892,14 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" +param-case@3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.3.tgz#4be41f8399eff621c56eebb829a5e451d9801238" + integrity sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA== + dependencies: + dot-case "^3.0.3" + tslib "^1.10.0" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -8619,6 +9919,15 @@ parse-asn1@^5.0.0: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-filepath@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + parse-github-repo-url@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz#9e7d8bb252a6cb6ba42595060b7bf6df3dbc1f50" @@ -8639,6 +9948,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" @@ -8667,6 +9986,14 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@3.1.1, pascal-case@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.1.tgz#5ac1975133ed619281e88920973d2cd1f279de5f" + integrity sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA== + dependencies: + no-case "^3.0.3" + tslib "^1.10.0" + pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" @@ -8719,6 +10046,26 @@ path-parse@^1.0.6: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parser@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/path-parser/-/path-parser-6.1.0.tgz#ee8a1dd7b1ffaf4069f2ddd1c20d1867c8fd3a08" + integrity sha512-nAB6J73z2rFcQP+870OHhpkHFj5kO4rPLc2Ol4Y3Ale7F6Hk1/cPKp7cQ8RznKF8FOSvu+YR9Xc6Gafk7DlpYA== + dependencies: + search-params "3.0.0" + tslib "^1.10.0" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= + dependencies: + path-root-regex "^0.1.0" + path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -8747,6 +10094,11 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + pbkdf2@^3.0.3: version "3.0.17" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" @@ -8768,6 +10120,11 @@ picomatch@^2.0.4: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.1.1.tgz#ecdfbea7704adb5fe6fb47f9866c4c0e15e905c5" integrity sha512-OYMyqkKzK7blWO/+XZYP6w8hH0LDvkBvdvKukti+7kqYFCiEAk+gI3DWnryapc0Dau05ugGTy0foQ6mqn4AHYA== +picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -9001,15 +10358,6 @@ postcss-env-function@^2.0.2: postcss "^7.0.2" postcss-values-parser "^2.0.0" -postcss-extend-rule@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-extend-rule/-/postcss-extend-rule-3.0.0.tgz#d6ee2fb24ab2b3d9b50acce1d055c1c137ab5f44" - integrity sha512-gMlRmW52Y86Lct+KTr+gMjxk0aUSuTyjtvelIH3a7UdaXONaKH6qSmj8KAXCW4+nhTlAsOw5JdkRjCdZ/Kjb3Q== - dependencies: - postcss "^7.0.17" - postcss-nesting "^7.0.1" - postcss-tape "^5.0.2" - postcss-focus-visible@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz#477d107113ade6024b14128317ade2bd1e17046e" @@ -9091,7 +10439,7 @@ postcss-lab-function@^2.0.1: postcss "^7.0.2" postcss-values-parser "^2.0.0" -postcss-load-config@^2.0.0, postcss-load-config@^2.1.0: +postcss-load-config@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz#c84d692b7bb7b41ddced94ee62e8ab31b417b003" integrity sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q== @@ -9099,16 +10447,6 @@ postcss-load-config@^2.0.0, postcss-load-config@^2.1.0: cosmiconfig "^5.0.0" import-cwd "^2.0.0" -postcss-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz#6b97943e47c72d845fa9e03f273773d4e8dd6c2d" - integrity sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA== - dependencies: - loader-utils "^1.1.0" - postcss "^7.0.0" - postcss-load-config "^2.0.0" - schema-utils "^1.0.0" - postcss-logical@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-logical/-/postcss-logical-3.0.0.tgz#2495d0f8b82e9f262725f75f9401b34e7b45d5b5" @@ -9236,7 +10574,7 @@ postcss-modules-scope@1.1.0: css-selector-tokenizer "^0.7.0" postcss "^6.0.1" -postcss-modules-scope@^2.0.1, postcss-modules-scope@^2.1.1: +postcss-modules-scope@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba" integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ== @@ -9271,7 +10609,7 @@ postcss-modules@^2.0.0: postcss "^7.0.1" string-hash "^1.1.1" -postcss-nesting@^7.0.0, postcss-nesting@^7.0.1: +postcss-nesting@^7.0.0: version "7.0.1" resolved "https://registry.yarnpkg.com/postcss-nesting/-/postcss-nesting-7.0.1.tgz#b50ad7b7f0173e5b5e3880c3501344703e04c052" integrity sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg== @@ -9468,13 +10806,6 @@ postcss-replace-overflow-wrap@^3.0.0: dependencies: postcss "^7.0.2" -postcss-scss@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/postcss-scss/-/postcss-scss-2.0.0.tgz#248b0a28af77ea7b32b1011aba0f738bda27dea1" - integrity sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug== - dependencies: - postcss "^7.0.0" - postcss-selector-matches@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz#71c8248f917ba2cc93037c9637ee09c64436fcff" @@ -9535,11 +10866,6 @@ postcss-svgo@^4.0.2: postcss-value-parser "^3.0.0" svgo "^1.0.0" -postcss-tape@^5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/postcss-tape/-/postcss-tape-5.0.2.tgz#7ae011050954fdc10b17d1f1551c9d9bf14e4bdf" - integrity sha512-e4770WnsUzczQp/pAIsz0s0MDLAQ7luyh1/hs8QBcdfXOMrz0siEqYNHAKJIoCvGtLoi2QUjWASvTbPfyTfIWg== - postcss-unique-selectors@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz#9446911f3289bfd64c6d680f073c03b1f9ee4bac" @@ -9614,17 +10940,12 @@ postcss@^7.0.27: supports-color "^6.1.0" preact-render-to-string@^5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.1.6.tgz#6e8f6c7d657743d8bb27c8ea3d5ac218354c87a4" - integrity sha512-/8mDzzfMrxx5tzJazKGdyYADrmjzBR3QJsvdZs03aV9VjeXpDrzDHs6dhzlMA1EsdCBq4cqioKjVKUs58uNckg== + version "5.1.8" + resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.1.8.tgz#5540f4c1b1fcf1e7c7dfb154d38053e717ca1fe4" + integrity sha512-9c2OFfOJ2Zi7ppMbHYC5lx1ebDFXpDGBMns9/YaKMgZGElUY90xTGmsKeNMqrNoDo7ImYPh715Ke6Ah/pdjW0g== dependencies: pretty-format "^3.8.0" -preact-ssr-prepass@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/preact-ssr-prepass/-/preact-ssr-prepass-1.0.1.tgz#15ce9306edacc1095fcefe3e6a4e461f3af805cc" - integrity sha512-pUCh/X/KJd45GVCfQAqmIdL6eLSj/EIrCPBU81s95wEYNM9f1omsZWrxusIwJP3oVKQyt29//9dLBjY2P6iyYg== - preact@^10.4.1: version "10.4.1" resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" @@ -9640,35 +10961,11 @@ prepend-http@^1.0.0: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -prettier-eslint@^9.0.0: - version "9.0.1" - resolved "https://registry.yarnpkg.com/prettier-eslint/-/prettier-eslint-9.0.1.tgz#fbf507cde7329141cd368c6aeb54a70715d02cf4" - integrity sha512-KZT65QTosSAqBBqmrC+RpXbsMRe7Os2YSR9cAfFbDlyPAopzA/S5bioiZ3rpziNQNSJaOxmtXSx07EQ+o2Dlug== - dependencies: - "@typescript-eslint/parser" "^1.10.2" - common-tags "^1.4.0" - core-js "^3.1.4" - dlv "^1.1.0" - eslint "^5.0.0" - indent-string "^4.0.0" - lodash.merge "^4.6.0" - loglevel-colored-level-prefix "^1.0.0" - prettier "^1.7.0" - pretty-format "^23.0.1" - require-relative "^0.8.7" - typescript "^3.2.1" - vue-eslint-parser "^2.0.2" - prettier@1.18.2: version "1.18.2" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== -prettier@^1.7.0: - version "1.19.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" - integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== - pretty-error@^2.0.2: version "2.1.1" resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz#5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3" @@ -9677,29 +10974,40 @@ pretty-error@^2.0.2: renderkid "^2.0.1" utila "~0.4" -pretty-format@^23.0.1: - version "23.6.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-23.6.0.tgz#5eaac8eeb6b33b987b7fe6097ea6a8a146ab5760" - integrity sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw== - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - -pretty-format@^24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-24.9.0.tgz#12fac31b37019a4eea3c11aa9a959eb7628aa7c9" - integrity sha512-00ZMZUiHaJrNfk33guavqgvfJS30sLYf0f8+Srklv0AMPodGGHcoHgksZ3OThYnIvOd+8yMCn0YiEOogjlgsnA== - dependencies: - "@jest/types" "^24.9.0" - ansi-regex "^4.0.0" - ansi-styles "^3.2.0" - react-is "^16.8.4" - pretty-format@^3.8.0: version "3.8.0" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385" integrity sha1-v77VbV6ad2ZF9LH/eqGjrE+jw4U= +prisma-json-schema@0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/prisma-json-schema/-/prisma-json-schema-0.1.3.tgz#6c302db8f464f8b92e8694d3f7dd3f41ac9afcbe" + integrity sha512-XZrf2080oR81mY8/OC8al68HiwBm0nXlFE727JIia0ZbNqwuV4MyRYk6E0+OIa6/9KEYxZrcAmoBs3EW1cCvnA== + +prisma-yml@1.34.10: + version "1.34.10" + resolved "https://registry.yarnpkg.com/prisma-yml/-/prisma-yml-1.34.10.tgz#0ef1ad3a125f54f200289cba56bdd9597f17f410" + integrity sha512-N9on+Cf/XQKFGUULk/681tnpfqiZ19UBTurFMm+/9rnml37mteDaFr2k8yz+K8Gt2xpEJ7kBu7ikG5PrXI1uoA== + dependencies: + ajv "5" + bluebird "^3.5.1" + chalk "^2.3.0" + debug "^3.1.0" + dotenv "^4.0.0" + fs-extra "^7.0.0" + graphql-request "^1.5.0" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + isomorphic-fetch "^2.2.1" + js-yaml "^3.10.0" + json-stable-stringify "^1.0.1" + jsonwebtoken "^8.1.0" + lodash "^4.17.4" + prisma-json-schema "0.1.3" + replaceall "^0.1.6" + scuid "^1.0.2" + yaml-ast-parser "^0.0.40" + private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -9738,6 +11046,13 @@ promise.series@^0.2.0: resolved "https://registry.yarnpkg.com/promise.series/-/promise.series-0.2.0.tgz#2cc7ebe959fc3a6619c04ab4dbdc9e452d864bbd" integrity sha1-LMfr6Vn8OmYZwEq029yeRS2GS70= +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== + dependencies: + asap "~2.0.3" + promzard@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" @@ -9794,6 +11109,11 @@ psl@^1.1.24: resolved "https://registry.yarnpkg.com/psl/-/psl-1.6.0.tgz#60557582ee23b6c43719d9890fb4170ecd91e110" integrity sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA== +psl@^1.1.28: + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== + public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -9841,7 +11161,7 @@ punycode@^1.2.4, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -9919,14 +11239,6 @@ raw-body@2.4.0: iconv-lite "0.4.24" unpipe "1.0.0" -raw-loader@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-3.1.0.tgz#5e9d399a5a222cc0de18f42c3bc5e49677532b3f" - integrity sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA== - dependencies: - loader-utils "^1.1.0" - schema-utils "^2.0.1" - rc@^1.2.7: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -9966,7 +11278,7 @@ react-hot-loader@^4.12.18: shallowequal "^1.1.0" source-map "^0.7.3" -react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4: +react-is@^16.7.0, react-is@^16.8.1: version "16.12.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== @@ -10131,6 +11443,13 @@ readdirp@~3.2.0: dependencies: picomatch "^2.0.4" +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== + dependencies: + picomatch "^2.2.1" + reakit-system@^0.6.8: version "0.6.8" resolved "https://registry.yarnpkg.com/reakit-system/-/reakit-system-0.6.8.tgz#c01697f61652f8df1c8022ebfbbae33f5a172bf9" @@ -10189,6 +11508,11 @@ regenerator-runtime@^0.13.2: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz#7cf6a77d8f5c6f60eb73c5fc1955b2ceb01e6bf5" integrity sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw== +regenerator-runtime@^0.13.4: + version "0.13.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697" + integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA== + regenerator-transform@^0.14.0: version "0.14.1" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.1.tgz#3b2fce4e1ab7732c08f665dfdb314749c7ddd2fb" @@ -10271,11 +11595,51 @@ relateurl@0.2.x: resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" integrity sha1-VNvzd+UUQKypCkzSdGANP/LYiKk= +relay-compiler@9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/relay-compiler/-/relay-compiler-9.1.0.tgz#e2975de85192e2470daad78e30052bf9614d22ed" + integrity sha512-jsJx0Ux5RoxM+JFm3M3xl7UfZAJ0kUTY/r6jqOpcYgVI3GLJthvNI4IoziFRlWbhizEzGFbpkdshZcu9IObJYA== + dependencies: + "@babel/core" "^7.0.0" + "@babel/generator" "^7.5.0" + "@babel/parser" "^7.0.0" + "@babel/runtime" "^7.0.0" + "@babel/traverse" "^7.0.0" + "@babel/types" "^7.0.0" + babel-preset-fbjs "^3.3.0" + chalk "^2.4.1" + fast-glob "^2.2.2" + fb-watchman "^2.0.0" + fbjs "^1.0.0" + immutable "~3.7.6" + nullthrows "^1.1.1" + relay-runtime "9.1.0" + signedsource "^1.0.0" + yargs "^14.2.0" + +relay-runtime@9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/relay-runtime/-/relay-runtime-9.1.0.tgz#d0534007d5c43e7b9653c6f5cc112ffac09c5020" + integrity sha512-6FE5YlZpR/b3R/HzGly85V+c4MdtLJhFY/outQARgxXonomrwqEik0Cr34LnPK4DmGS36cMLUliqhCs/DZyPVw== + dependencies: + "@babel/runtime" "^7.0.0" + fbjs "^1.0.0" + +remedial@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/remedial/-/remedial-1.0.8.tgz#a5e4fd52a0e4956adbaf62da63a5a46a78c578a0" + integrity sha512-/62tYiOe6DzS5BqVsNpH/nkGlX45C/Sp6V+NtiN6JQNS1Viay7cWkazmRkrQrdFj2eshDe96SIQNIoMxqhzBOg== + remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= +remove-trailing-spaces@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/remove-trailing-spaces/-/remove-trailing-spaces-1.0.7.tgz#491f04e11d98880714d12429b0d0938cbe030ae6" + integrity sha512-wjM17CJ2kk0SgoGyJ7ZMzRRCuTq+V8YhMwpZ5XEWX0uaked2OUq6utvHXGNBQrfkUzUUABFMyxlKn+85hMv4dg== + renderkid@^2.0.1: version "2.0.3" resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz#380179c2ff5ae1365c522bf2fcfcff01c5b74149" @@ -10304,6 +11668,37 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" +replaceall@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/replaceall/-/replaceall-0.1.6.tgz#81d81ac7aeb72d7f5c4942adf2697a3220688d8e" + integrity sha1-gdgax663LX9cSUKt8ml6MiBojY4= + +request@2.88.2: + version "2.88.2" + resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" @@ -10345,11 +11740,6 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== -require-relative@^0.8.7: - version "0.8.7" - resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" - integrity sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4= - requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -10386,6 +11776,11 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" +resolve-from@5.0.0, resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -10396,17 +11791,12 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@1.15.1, resolve@^1.11.0: +resolve@1.15.1: version "1.15.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== @@ -10420,7 +11810,7 @@ resolve@^1.1.7, resolve@^1.10.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13 dependencies: path-parse "^1.0.6" -resolve@^1.16.1, resolve@^1.17.0: +resolve@^1.11.0, resolve@^1.14.2, resolve@^1.16.1, resolve@^1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -10458,6 +11848,11 @@ retry@^0.12.0: resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + rewrite-imports@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/rewrite-imports/-/rewrite-imports-2.0.3.tgz#210fc05ebda6a6c6a2e396608b0146003d510dda" @@ -10502,41 +11897,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -rollup-plugin-babel@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-4.4.0.tgz#d15bd259466a9d1accbdb2fe2fff17c52d030acb" - integrity sha512-Lek/TYp1+7g7I+uMfJnnSJ7YWoD58ajo6Oarhlex7lvUce+RCKRuGRSgztDO3/MF/PuGKmUL5iTHKf208UNszw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - rollup-pluginutils "^2.8.1" - -rollup-plugin-commonjs@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz#417af3b54503878e084d127adf4d1caf8beb86fb" - integrity sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q== - dependencies: - estree-walker "^0.6.1" - is-reference "^1.1.2" - magic-string "^0.25.2" - resolve "^1.11.0" - rollup-pluginutils "^2.8.1" - rollup-plugin-includepaths@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/rollup-plugin-includepaths/-/rollup-plugin-includepaths-0.2.3.tgz#244d21b9669a0debe476d825e4a02ed08c06b258" integrity sha512-4QbSIZPDT+FL4SViEVCRi4cGCA64zQJu7u5qmCkO3ecHy+l9EQBsue15KfCpddfb6Br0q47V/v2+E2YUiqts9g== -rollup-plugin-node-resolve@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-5.2.0.tgz#730f93d10ed202473b1fb54a5997a7db8c6d8523" - integrity sha512-jUlyaDXts7TW2CqQ4GaO5VJ4PwwaV8VUGA7+km3n6k6xtOEacf61u0VXwN80phY/evMcaS+9eIeJ9MOyDxt5Zw== - dependencies: - "@types/resolve" "0.0.8" - builtin-modules "^3.1.0" - is-module "^1.0.0" - resolve "^1.11.1" - rollup-pluginutils "^2.8.1" - rollup-plugin-peer-deps-external@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/rollup-plugin-peer-deps-external/-/rollup-plugin-peer-deps-external-2.2.2.tgz#506cef67fb68f41cca3ec08ca6ff7936b190f568" @@ -10573,7 +11938,7 @@ rollup-plugin-typescript2@^0.26.0: rollup-pluginutils "2.8.2" tslib "1.10.0" -rollup-pluginutils@2.8.2, rollup-pluginutils@^2.8.1, rollup-pluginutils@^2.8.2: +rollup-pluginutils@2.8.2, rollup-pluginutils@^2.8.2: version "2.8.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== @@ -10587,6 +11952,34 @@ rollup@^2.0.6: optionalDependencies: fsevents "~2.1.2" +route-node@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/route-node/-/route-node-4.1.1.tgz#9006600160982db0b19d2f093d4271f9fd7548ea" + integrity sha512-bJVDVEQvXYqTC/LQ/2ohNZ2gPRO4+3ZvHeafuCyRZAd63qH17yspVfxOBzasE/t7SmSO30sT/yPSEMuPDGHhSQ== + dependencies: + path-parser "6.1.0" + search-params "3.0.0" + tslib "^1.10.0" + +router5-plugin-browser@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/router5-plugin-browser/-/router5-plugin-browser-8.0.1.tgz#30a15fc59ed4d59020587cfc5452b5443b1a3290" + integrity sha512-RuArnalkREtQj0ROD1RnITWwL+Fl8rbkFspDxRTt3aFG9k5bPOE0HfJRvGsd4TY9Je/kW3hvntvFXSx8Bl745w== + +router5-transition-path@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/router5-transition-path/-/router5-transition-path-8.0.1.tgz#51bfc8adcee3e3b2b6872ac8252d74b501ae3e96" + integrity sha512-l7MFEUmasEhe1emrO79t7BkCqQQRZdenz4c3qJmZpe8V6BCerZQR+SYbZL5zmQ3hazY7nR264jCWuNed+cMD2A== + +router5@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/router5/-/router5-8.0.1.tgz#8ef47dce54a3da2c05b222ba0dd0a5f35871e64d" + integrity sha512-LBLQAYd2ZI1FiiBqGf82oC+LRD0PUABrZqTzd6OmyK+t5N8wRs3hbIxeiy/9Zy+xI8Fdf/0WM68P41W6MH8pdQ== + dependencies: + route-node "4.1.1" + router5-transition-path "^8.0.1" + symbol-observable "1.2.0" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -10594,6 +11987,16 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-async@^2.4.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== + +run-parallel@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" + integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== + run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" @@ -10601,6 +12004,13 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rxjs@^6.3.3, rxjs@^6.5.3, rxjs@^6.5.5: + version "6.5.5" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" + integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== + dependencies: + tslib "^1.9.0" + rxjs@^6.4.0: version "6.5.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.3.tgz#510e26317f4db91a7eb1de77d9dd9ba0a4899a3a" @@ -10608,13 +12018,6 @@ rxjs@^6.4.0: dependencies: tslib "^1.9.0" -rxjs@^6.5.5: - version "6.5.5" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -10668,17 +12071,6 @@ sass-graph@^2.2.4: scss-tokenizer "^0.2.3" yargs "^7.0.0" -sass-loader@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.0.tgz#e7b07a3e357f965e6b03dd45b016b0a9746af797" - integrity sha512-+qeMu563PN7rPdit2+n5uuYVR0SSVwm0JsOUsaJXzgYcClWSlmX0iHDnmeOobPkf5kUglVot3QS6SyLyaQoJ4w== - dependencies: - clone-deep "^4.0.1" - loader-utils "^1.2.3" - neo-async "^2.6.1" - schema-utils "^2.1.0" - semver "^6.3.0" - sass@^1.16.1: version "1.23.7" resolved "https://registry.yarnpkg.com/sass/-/sass-1.23.7.tgz#090254e006af1219d442f1bff31e139d5e085dff" @@ -10708,14 +12100,6 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.0.1, schema-utils@^2.1.0, schema-utils@^2.5.0, schema-utils@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.1.tgz#eb78f0b945c7bcfa2082b3565e8db3548011dc4f" - integrity sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg== - dependencies: - ajv "^6.10.2" - ajv-keywords "^3.4.1" - schema-utils@^2.6.1: version "2.6.4" resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.4.tgz#a27efbf6e4e78689d91872ee3ccfa57d7bdd0f53" @@ -10732,6 +12116,16 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" +scuid@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/scuid/-/scuid-1.1.0.tgz#d3f9f920956e737a60f72d0e4ad280bf324d5dab" + integrity sha512-MuCAyrGZcTLfQoH2XoBlQ8C6bzwN88XT/0slOGz0pn8+gIP85BOAfYa44ZXQUTOwRwPU0QvgU+V+OSajl/59Xg== + +search-params@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/search-params/-/search-params-3.0.0.tgz#dbc7c243058e5a33ae1e9870be91f5aced4100d8" + integrity sha512-8CYNl/bjkEhXWbDTU/K7c2jQtrnqEffIPyOLMqygW/7/b+ym8UtQumcAZjOfMLjZKR6AxK5tOr9fChbQZCzPqg== + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -10826,7 +12220,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4: +setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -10878,6 +12272,19 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= +signedsource@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/signedsource/-/signedsource-1.0.0.tgz#1ddace4981798f93bd833973803d80d52e93ad6a" + integrity sha1-HdrOSYF5j5O9gzlzgD2A1S6TrWo= + +simple-git@2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-2.5.0.tgz#538b14b25f83916a56f30eca53f13796db6712f6" + integrity sha512-4gmtMqfIL9bsBNJDP/rDwZe3GsQL/tp85Qv5cmRc8iIDNOZJS4IX1oPfcqp9b7BGPc5bfuw4yd1i3lQacvuqDQ== + dependencies: + "@kwsites/exec-p" "^0.4.0" + debug "^4.0.1" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -10895,6 +12302,16 @@ slash@^2.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -11368,16 +12785,16 @@ strip-indent@^2.0.0: resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= -strip-json-comments@^2.0.1, strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - strip-json-comments@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + strong-log-transformer@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" @@ -11399,14 +12816,6 @@ style-loader@^0.8.3: dependencies: loader-utils "^0.2.5" -style-loader@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.0.1.tgz#aec6d4c61d0ed8d0a442faed741d4dfc6573888a" - integrity sha512-CnpEkSR1C+REjudiTWCv4+ssP7SCiuaQZJTZDWBRwTJoS90mdqkB8uOGMHKgVeUzpaU7IfLWoyQbvvs5Joj3Xw== - dependencies: - loader-utils "^1.2.3" - schema-utils "^2.0.1" - stylehacks@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5" @@ -11490,6 +12899,11 @@ svgo@^1.0.0: unquote "~1.1.1" util.promisify "~1.0.0" +symbol-observable@1.2.0, symbol-observable@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" + integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== + synchronous-promise@^2.0.9: version "2.0.10" resolved "https://registry.yarnpkg.com/synchronous-promise/-/synchronous-promise-2.0.10.tgz#e64c6fd3afd25f423963353043f4a68ebd397fd8" @@ -11709,6 +13123,14 @@ tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" +tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -11738,6 +13160,18 @@ trim-off-newlines@^1.0.0: dependencies: glob "^7.1.2" +ts-invariant@^0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86" + integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA== + dependencies: + tslib "^1.9.3" + +ts-log@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/ts-log/-/ts-log-2.1.4.tgz#063c5ad1cbab5d49d258d18015963489fb6fb59a" + integrity sha512-P1EJSoyV+N3bR/IWFeAqXzKPZwHpnLY6j7j58mAvewHRipo+BQM2Y1f9Y9BjEQznKwgqqZm7H8iuixmssU7tYQ== + tsconfig-paths@^3.9.0: version "3.9.0" resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" @@ -11753,6 +13187,21 @@ tslib@1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== +tslib@1.11.2: + version "1.11.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.2.tgz#9c79d83272c9a7aaf166f73915c9667ecdde3cc9" + integrity sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg== + +tslib@^1.10.0, tslib@^1.11.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== + +tslib@^2.0.0, tslib@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.0.tgz#18d13fc2dce04051e20f074cc8387fd8089ce4f3" + integrity sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g== + tsutils@^3.17.1: version "3.17.1" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759" @@ -11784,6 +13233,11 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-fest@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" + integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== + type-fest@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" @@ -11807,15 +13261,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.2.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.3.tgz#b36840668a16458a7025b9eabfad11b66ab85c69" - integrity sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw== +typescript@^3.9.3: + version "3.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.3.tgz#d3ac8883a97c26139e42df5e93eeece33d610b8a" + integrity sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ== -typescript@^3.8.3: - version "3.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" - integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== +ua-parser-js@^0.7.18: + version "0.7.21" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.21.tgz#853cf9ce93f642f67174273cc34565ae6f308777" + integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== uglify-js@3.4.x: version "3.4.10" @@ -11843,6 +13297,11 @@ umask@^1.1.0: resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= + unicode-canonical-property-names-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" @@ -11912,6 +13371,18 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" + integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== + +unixify@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unixify/-/unixify-1.0.0.tgz#3a641c8c2ffbce4da683a5c70f03a462940c2090" + integrity sha1-OmQcjC/7zk2mg6XHDwOkYpQMIJA= + dependencies: + normalize-path "^2.1.1" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -11935,6 +13406,13 @@ upath@^1.1.1: resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +upper-case@2.0.1, upper-case@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.1.tgz#6214d05e235dc817822464ccbae85822b3d8665f" + integrity sha512-laAsbea9SY5osxrv7S99vH9xAaJKrw5Qpdh4ENRLcaxipjKsiaBwiAsxfa8X5mObKNTQPsupSq0J/VIxsSJe3A== + dependencies: + tslib "^1.10.0" + upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" @@ -11952,15 +13430,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-loader@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-3.0.0.tgz#9f1f11b371acf6e51ed15a50db635e02eec18368" - integrity sha512-a84JJbIA5xTFTWyjjcPdnsu+41o/SNE8SpXMdUvXs6Q+LuhCD9E2+0VCiuDWqgo3GGXVlFHzArDmBpj9PgWn4A== - dependencies: - loader-utils "^1.2.3" - mime "^2.4.4" - schema-utils "^2.5.0" - url-parse@^1.4.3: version "1.4.7" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" @@ -12046,6 +13515,11 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== +valid-url@1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" + integrity sha1-HBRHm0DxOXp1eC8RXkCGRHQzogA= + validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" @@ -12085,17 +13559,13 @@ vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -vue-eslint-parser@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-2.0.3.tgz#c268c96c6d94cfe3d938a5f7593959b0ca3360d1" - integrity sha512-ZezcU71Owm84xVF6gfurBQUGg8WQ+WZGxgDEQu1IHFBZNx7BFZg3L1yHxrCBNNwbwFtE1GuvfJKMtb6Xuwc/Bw== +vue-template-compiler@^2.6.11: + version "2.6.11" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz#c04704ef8f498b153130018993e56309d4698080" + integrity sha512-KIq15bvQDrcCjpGjrAhx4mUlyyHfdmTaoNfeoATHLAiWB+MU3cx4lOzMwrnUh9cCxy0Lt1T11hAFY6TQgroUAA== dependencies: - debug "^3.1.0" - eslint-scope "^3.7.1" - eslint-visitor-keys "^1.0.0" - espree "^3.5.2" - esquery "^1.0.0" - lodash "^4.17.4" + de-indent "^1.0.2" + he "^1.1.0" watchpack@^1.6.0: version "1.6.0" @@ -12279,6 +13749,11 @@ whatwg-fetch@2.0.4: resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== +whatwg-fetch@3.0.0, whatwg-fetch@>=0.10.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz#fc804e458cc460009b1a2b966bc8817d2578aefb" + integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== + whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" @@ -12336,6 +13811,15 @@ worker-farm@^1.7.0: dependencies: errno "~0.1.7" +wrap-ansi@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -12344,6 +13828,14 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba" + integrity sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -12447,6 +13939,16 @@ yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== +yaml-ast-parser@^0.0.40: + version "0.0.40" + resolved "https://registry.yarnpkg.com/yaml-ast-parser/-/yaml-ast-parser-0.0.40.tgz#08536d4e73d322b1c9ce207ab8dd70e04d20ae6e" + integrity sha1-CFNtTnPTIrHJziB6uN1w4E0grm4= + +yaml@^1.7.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== + yargs-parser@^10.0.0: version "10.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" @@ -12478,6 +13980,14 @@ yargs-parser@^15.0.0: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^15.0.1: + version "15.0.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.1.tgz#54786af40b820dcb2fb8025b11b4d659d76323b3" + integrity sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^18.1.1: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -12528,6 +14038,23 @@ yargs@13.2.4: y18n "^4.0.0" yargs-parser "^13.1.0" +yargs@^14.2.0: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + yargs@^14.2.2: version "14.2.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.2.tgz#2769564379009ff8597cdd38fba09da9b493c4b5" @@ -12580,3 +14107,16 @@ yargs@^7.0.0: which-module "^1.0.0" y18n "^3.2.1" yargs-parser "^5.0.0" + +zen-observable-ts@^0.8.21: + version "0.8.21" + resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d" + integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg== + dependencies: + tslib "^1.9.3" + zen-observable "^0.8.0" + +zen-observable@^0.8.0: + version "0.8.15" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15" + integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==