diff --git a/src/main/java/org/dependencytrack/tasks/repositories/AbstractMetaAnalyzer.java b/src/main/java/org/dependencytrack/tasks/repositories/AbstractMetaAnalyzer.java index 3ff19a30b9..37b47202a8 100644 --- a/src/main/java/org/dependencytrack/tasks/repositories/AbstractMetaAnalyzer.java +++ b/src/main/java/org/dependencytrack/tasks/repositories/AbstractMetaAnalyzer.java @@ -18,9 +18,11 @@ */ package org.dependencytrack.tasks.repositories; -import alpine.common.logging.Logger; -import alpine.notification.Notification; -import alpine.notification.NotificationLevel; +import java.io.IOException; +import java.net.URISyntaxException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; + import org.apache.commons.lang3.StringUtils; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; @@ -33,25 +35,32 @@ import org.dependencytrack.notification.NotificationScope; import org.dependencytrack.util.HttpUtil; -import java.io.IOException; -import java.net.URISyntaxException; -import java.net.URLEncoder; -import java.nio.charset.StandardCharsets; +import alpine.common.logging.Logger; +import alpine.notification.Notification; +import alpine.notification.NotificationLevel; /** - * Base abstract class that all IMetaAnalyzer implementations should likely extend. + * Base abstract class that all IMetaAnalyzer implementations should likely + * extend. * * @author Steve Springett * @since 3.1.0 */ public abstract class AbstractMetaAnalyzer implements IMetaAnalyzer { + protected String repositoryId; protected String baseUrl; - protected String username; - protected String password; + + /** + * {@inheritDoc} + */ + public void setRepositoryId(String repositoryId) { + this.repositoryId = repositoryId.trim(); + } + /** * {@inheritDoc} */ @@ -75,7 +84,8 @@ protected String urlEncode(final String value) { return URLEncoder.encode(value, StandardCharsets.UTF_8).replace("+", "%20"); } - protected void handleUnexpectedHttpResponse(final Logger logger, String url, final int statusCode, final String statusText, final Component component) { + protected void handleUnexpectedHttpResponse(final Logger logger, String url, final int statusCode, + final String statusText, final Component component) { logger.debug("HTTP Status : " + statusCode + " " + statusText); logger.debug(" - RepositoryType URL : " + url); logger.debug(" - Package URL : " + component.getPurl().canonicalize()); @@ -83,20 +93,21 @@ protected void handleUnexpectedHttpResponse(final Logger logger, String url, fin .scope(NotificationScope.SYSTEM) .group(NotificationGroup.REPOSITORY) .title(NotificationConstants.Title.REPO_ERROR) - .content("An error occurred while communicating with an " + supportedRepositoryType().name() + " repository. URL: " + url + " HTTP Status: " + statusCode + ". Check log for details." ) - .level(NotificationLevel.ERROR) - ); + .content("An error occurred while communicating with an " + supportedRepositoryType().name() + + " repository. URL: " + url + " HTTP Status: " + statusCode + ". Check log for details.") + .level(NotificationLevel.ERROR)); } protected void handleRequestException(final Logger logger, final Exception e) { logger.error("Request failure", e); + e.printStackTrace(); Notification.dispatch(new Notification() .scope(NotificationScope.SYSTEM) .group(NotificationGroup.REPOSITORY) .title(NotificationConstants.Title.REPO_ERROR) - .content("An error occurred while communicating with an " + supportedRepositoryType().name() + " repository. Check log for details. " + e.getMessage()) - .level(NotificationLevel.ERROR) - ); + .content("An error occurred while communicating with an " + supportedRepositoryType().name() + + " repository. Check log for details. " + e.getMessage()) + .level(NotificationLevel.ERROR)); } protected CloseableHttpResponse processHttpRequest(String url) throws IOException { @@ -109,7 +120,7 @@ protected CloseableHttpResponse processHttpRequest(String url) throws IOExceptio request.addHeader("Authorization", HttpUtil.basicAuthHeaderValue(username, password)); } return HttpClientPool.getClient().execute(request); - }catch (URISyntaxException ex){ + } catch (URISyntaxException ex) { handleRequestException(logger, ex); return null; } diff --git a/src/main/java/org/dependencytrack/tasks/repositories/ComposerMetaAnalyzer.java b/src/main/java/org/dependencytrack/tasks/repositories/ComposerMetaAnalyzer.java index 7b16722af7..a144360249 100644 --- a/src/main/java/org/dependencytrack/tasks/repositories/ComposerMetaAnalyzer.java +++ b/src/main/java/org/dependencytrack/tasks/repositories/ComposerMetaAnalyzer.java @@ -18,21 +18,28 @@ */ package org.dependencytrack.tasks.repositories; -import alpine.common.logging.Logger; -import com.github.packageurl.PackageURL; -import org.dependencytrack.exception.MetaAnalyzerException; -import org.json.JSONObject; +import java.io.IOException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.concurrent.TimeUnit; + import org.apache.http.HttpStatus; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.util.EntityUtils; import org.apache.maven.artifact.versioning.ComparableVersion; +import org.dependencytrack.exception.MetaAnalyzerException; import org.dependencytrack.model.Component; import org.dependencytrack.model.RepositoryType; +import org.dependencytrack.util.JsonUtil; +import org.json.JSONArray; +import org.json.JSONObject; -import java.io.IOException; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.packageurl.PackageURL; + +import alpine.common.logging.Logger; +import jakarta.ws.rs.core.UriBuilder; /** * An IMetaAnalyzer implementation that supports Composer. @@ -46,9 +53,36 @@ public class ComposerMetaAnalyzer extends AbstractMetaAnalyzer { private static final String DEFAULT_BASE_URL = "https://repo.packagist.org"; /** - * @see Packagist's API doc for "Getting package data - Using the Composer v1 metadata (DEPRECATED)" + * @see Packagist's API + * doc for + * "Getting package data - Using the Composer v1 metadata (DEPRECATED)" + * Example: https://repo.packagist.org/p/monolog/monolog.json + */ + private static final String PACKAGE_META_DATA_PATH_PATTERN_V1 = "/p/%package%.json"; + + private static final Cache REPO_ROOT_CACHE = Caffeine.newBuilder() + .expireAfterWrite(1, TimeUnit.HOURS) + .build(); + + /** + * Some of the properties of the root package.json are documented at + * https://github.com/composer/composer/blob/main/doc/05-repositories.md + * Properties to investigate / implement: + * + * - security-advisories: very relevant, but only in a VulnerabilityAnalyzer (or + * mirrored VulnerabilitySource) context + * + * - providers-lazy-url: old v1 construct for which I haven't seen any example, + * in v2 the metadata-url is used for this. seems like it's not relevant for DT + * - list: returns only package names, seems like repo.packagist.org (and .com?) + * are the only ones implementing it + * - providers-api: not relevant + * - notify-batch: not relevant + * - providers-url and provider-includes: only relevant to check hashes, so not + * relevant for DT currently. Replaced by metadata-url in V2 repositories. + * - providers-api: not relevant + * - search: not relevant */ - private static final String API_URL = "/p/%s/%s.json"; ComposerMetaAnalyzer() { this.baseUrl = DEFAULT_BASE_URL; @@ -73,76 +107,299 @@ public RepositoryType supportedRepositoryType() { */ public MetaModel analyze(final Component component) { final MetaModel meta = new MetaModel(component); + final String composerPackageName = getComposerPackageName(component); if (component.getPurl() == null) { return meta; } - final String url = String.format(baseUrl + API_URL, urlEncode(component.getPurl().getNamespace()), urlEncode(component.getPurl().getName())); + final JSONObject repoRoot = getRepoRoot(); + if (repoRoot == null) { + // absence of packages.json shouldn't happen, but let's try to get metadata as + // we did in <=4.12.2 + return analyzeFromMetadataUrl(meta, component, PACKAGE_META_DATA_PATH_PATTERN_V1); + } + + // Available packages is finite, so we can use it to determine if the package + // exists in this repository + if (repoRoot.has("available-packages")) { + final JSONArray availablePackages = repoRoot.getJSONArray("available-packages"); + if (!availablePackages.toList().contains(getComposerPackageName(component)) && !repoRoot.has("available-package-patterns")) { + // According to https://github.com/composer/composer/blob/fb397acaa0648ba2668893e4b786af6465a41696/doc/05-repositories.md?plain=1#L197 + // available-packages should contain ALL the packages in the repo. + // But in the Composer implementation the patterns are consulted even if available-packages is present and doesn't contain the package + return meta; + } + } + + if (repoRoot.has("available-package-patterns")) { + final JSONArray availablePackagePatterns = repoRoot.getJSONArray("available-package-patterns"); + // handle regex same as Composer does in its code + boolean found = availablePackagePatterns.toList().stream() + .map(Object::toString) + .map(pattern -> "(?i)^%s$".formatted(pattern.replaceAll("\\*", ".*"))) + .anyMatch(pattern -> composerPackageName.matches(pattern)); + + if (!found) { + return meta; + } + } + + if (repoRoot.has("metadata-url")) { + // presence of metadata-url implies V2 repository, and takes precedence over + // included packages and other V1 features + final String packageMetaDataPathPattern = repoRoot.getString("metadata-url"); + return analyzeFromMetadataUrl(meta, component, packageMetaDataPathPattern); + } + + // initial batch of included pacakges is included in packages.json response + if (isMinified(repoRoot)) { + repoRoot.put("packages", expandPackages(repoRoot.getJSONObject("packages"))); + } + + loadIncludedPackages(repoRoot, repoRoot, true); + // included packages are considered finite, so we can use them for analysis + // without retrieving the package specific metadata + if (repoRoot.has("packages")) { + JSONObject packages = repoRoot.getJSONObject("packages"); + if (!packages.isEmpty()) { + if (!packages.has(getComposerPackageName(component))) { + return meta; + } + JSONObject packageVersions = packages.getJSONObject(getComposerPackageName(component)); + return analyzePackageVersions(meta, component, packageVersions); + } + } + + // V1 and no included packages, so we have to retrieve the package specific + // metadata + return analyzeFromMetadataUrl(meta, component, PACKAGE_META_DATA_PATH_PATTERN_V1); + } + + private JSONObject getRepoRoot() { + // Code mimicksed from + // https://github.com/composer/composer/blob/main/src/Composer/Repository/ComposerRepository.php + // Retrieve packages.json file, which must be present even for V1 repositories + String packageJsonUrl = UriBuilder.fromUri(baseUrl).path("packages.json").build().toString(); + return REPO_ROOT_CACHE.get(repositoryId + packageJsonUrl, key -> getRepoRootFromUrl(packageJsonUrl)); + } + + private JSONObject getRepoRootFromUrl(String packageJsonUrl) { + JSONObject repoRoot = new JSONObject("{}"); + try (final CloseableHttpResponse packageJsonResponse = processHttpRequest(packageJsonUrl)) { + // Make sure we also cache invalid / empty responses + if (packageJsonResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { + LOGGER.warn("Failed to retrieve packages.json from " + packageJsonUrl + " HTTP status code: " + + packageJsonResponse.getStatusLine().getStatusCode()); + } else if (packageJsonResponse.getEntity().getContent() == null) { + LOGGER.warn("Null packages.json from " + packageJsonUrl); + } else { + final String packageJsonString = EntityUtils.toString(packageJsonResponse.getEntity()); + if (JsonUtil.isBlankJson(packageJsonString)) { + LOGGER.warn("Empty packages.json from " + packageJsonUrl); + } else { + repoRoot = new JSONObject(packageJsonString); + } + } + } catch (IOException e) { + LOGGER.error("Error retrieving packages.json from " + packageJsonUrl, e); + handleRequestException(LOGGER, e); + } + return repoRoot; + } + + private void loadIncludedPackages(final JSONObject repoRoot, final JSONObject data, final boolean includesOnly) { + if (!repoRoot.has("packages") || repoRoot.get("packages") instanceof JSONArray) { + repoRoot.put("packages", new JSONObject()); + } + if (!includesOnly && data.has("packages")) { + boolean minified = isMinified(data); + JSONObject packages = data.getJSONObject("packages"); + if (minified) { + packages = expandPackages(packages); + } + + final JSONObject newPackages = packages; + newPackages.names().forEach(name -> { + String packageName = (String) name; + JSONObject packageVersions = newPackages.getJSONObject(packageName); + + if (!repoRoot.getJSONObject("packages").has(packageName)) { + repoRoot.getJSONObject("packages").put(packageName, new JSONObject()); + } + + JSONObject includedPackage = repoRoot.getJSONObject("packages").getJSONObject(packageName); + final JSONObject finalPackageVersions = packageVersions; + finalPackageVersions.names().forEach(version -> { + includedPackage.put((String) version, finalPackageVersions.getJSONObject((String) version)); + }); + }); + } + + if (data.has("includes")) { + JSONObject includes = data.getJSONObject("includes"); + includes.names().forEach(name -> { + String includeFilename = (String) name; + String includeUrl = UriBuilder.fromUri(baseUrl).path(includeFilename).build().toString(); + try (final CloseableHttpResponse includeResponse = processHttpRequest(includeUrl)) { + if (includeResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { + LOGGER.warn("Failed to retrieve include " + includeFilename + " HTTP status code: " + + includeResponse.getStatusLine().getStatusCode()); + } else if (includeResponse.getEntity().getContent() == null) { + LOGGER.warn("Null include from " + includeFilename); + } else { + final String nextDataString = EntityUtils.toString(includeResponse.getEntity()); + if (JsonUtil.isBlankJson(nextDataString)) { + LOGGER.warn("Empty include from " + includeFilename); + } else { + JSONObject nextData = new JSONObject(nextDataString); + + loadIncludedPackages(repoRoot, nextData, false); + } + } + } catch (IOException e) { + LOGGER.error("Error retrieving include from " + includeFilename, e); + handleRequestException(LOGGER, e); + } + }); + // remove processed includes as the repoRoot gets cached and we don't need to + // retrieve the includes again + data.remove("includes"); + } + } + + private MetaModel analyzeFromMetadataUrl(final MetaModel meta, final Component component, + final String packageMetaDataPathPattern) { + final String composerPackageMetadataFilename = packageMetaDataPathPattern.replaceAll("%package%", + getComposerPackageName(component)); + final String url = UriBuilder.fromUri(baseUrl).path(composerPackageMetadataFilename).build().toString(); try (final CloseableHttpResponse response = processHttpRequest(url)) { - if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { - handleUnexpectedHttpResponse(LOGGER, url, response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase(), component); + if (response.getStatusLine().getStatusCode() == HttpStatus.SC_NOT_FOUND) { + // 404s are valid responses, as the package might not exist in the repository return meta; } - if (response.getEntity().getContent() == null) { + + if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { + handleUnexpectedHttpResponse(LOGGER, url, response.getStatusLine().getStatusCode(), + response.getStatusLine().getReasonPhrase(), component); return meta; } - String jsonString = EntityUtils.toString(response.getEntity()); - if (jsonString.equalsIgnoreCase("")) { + if (response.getEntity().getContent() == null) { return meta; } - if (jsonString.equalsIgnoreCase("{}")) { + String metadataString = EntityUtils.toString(response.getEntity()); + if (JsonUtil.isBlankJson(metadataString)) { return meta; } - JSONObject jsonObject = new JSONObject(jsonString); - final String expectedResponsePackage = component.getPurl().getNamespace() + "/" + component.getPurl().getName(); - final JSONObject responsePackages = jsonObject - .getJSONObject("packages"); + JSONObject metadataJson = new JSONObject(metadataString); + final String expectedResponsePackage = getComposerPackageName(component); + final JSONObject responsePackages = metadataJson.getJSONObject("packages"); + if (!responsePackages.has(expectedResponsePackage)) { - // the package no longer exists - like this one: https://repo.packagist.org/p/magento/adobe-ims.json + // the package no longer exists - for v2 there's no example (yet), v1 example + // https://repo.packagist.org/p/magento/adobe-ims.json return meta; } - final JSONObject composerPackage = responsePackages.getJSONObject(expectedResponsePackage); - final ComparableVersion latestVersion = new ComparableVersion(stripLeadingV(component.getPurl().getVersion())); - final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); + if (isMinified(metadataJson)) { + return analyzePackageVersions(meta, component, + expandPackageVersions(responsePackages.getJSONArray(expectedResponsePackage))); + } else { + return analyzePackageVersions(meta, component, responsePackages.getJSONObject(expectedResponsePackage)); + } + } catch (IOException e) { + handleRequestException(LOGGER, e); + } catch (Exception e) { + throw new MetaAnalyzerException(e); + } + return meta; + } - composerPackage.names().forEach(key_ -> { - String key = (String) key_; - if (key.startsWith("dev-") || key.endsWith("-dev")) { - // dev versions are excluded, since they are not pinned but a VCS-branch. - return; - } + private String getComposerPackageName(final Component component) { + return component.getPurl().getNamespace() + "/" + component.getPurl().getName(); + } - final String version_normalized = composerPackage.getJSONObject(key).getString("version_normalized"); - ComparableVersion currentComparableVersion = new ComparableVersion(version_normalized); - if (currentComparableVersion.compareTo(latestVersion) < 0) { - // smaller version can be skipped - return; - } + private JSONObject expandPackageVersions(final JSONArray packageVersions) { + // Convert JSONArray to JSONObject with "version" as the key to align with + // existing v1 code (Composer does this as well) + final JSONObject finalVersionedPackages = new JSONObject(); + packageVersions.forEach(item -> { + JSONObject composerPackage = (JSONObject) item; + String version = composerPackage.getString("version"); + finalVersionedPackages.put(version, composerPackage); + }); + return finalVersionedPackages; + } + + private JSONObject expandPackages(JSONObject packages) { + JSONObject result = new JSONObject(); + packages.names().forEach(name -> { + String packageName = (String) name; + JSONArray packageVersionsMinified = packages.getJSONArray(packageName); + JSONObject packageVersions = expandPackageVersions(packageVersionsMinified); + result.put(packageName, packageVersions); + }); + return result; + } + + private MetaModel analyzePackageVersions(final MetaModel meta, Component component, JSONObject packageVersions) { + final ComparableVersion latestVersion = new ComparableVersion(stripLeadingV(component.getPurl().getVersion())); + final DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX"); - final String version = composerPackage.getJSONObject(key).getString("version"); - latestVersion.parseVersion(stripLeadingV(version_normalized)); - meta.setLatestVersion(version); + packageVersions.names().forEach(item -> { + JSONObject packageVersion = packageVersions.getJSONObject((String) item); + // Sometimes the JSON key differs from the the version inside the JSON value. The latter is leading. + String version = packageVersion.getString("version"); + if (version.startsWith("dev-") || version.endsWith("-dev")) { + // dev versions are excluded, since they are not pinned but a VCS-branch. + // this case doesn't seem to happen anymore with V2, as dev (untagged) releases + // are not part of the response anymore + return; + } - final String published = composerPackage.getJSONObject(key).getString("time"); + // Some (old?) repositories like composer.amasty.com/enterprise do not include a + // 'version_normalized' field + // TODO Should we attempt to normalize ourselves? The PHP code uses something + // that results in 4 parts instead of 3, i.e. 2.3.8.0 instead of 2.3.8. Not sure + // if that works with Semver4j + String version_normalized = packageVersion.getString("version"); + if (packageVersion.has("version_normalized")) { + version_normalized = packageVersion.getString("version_normalized"); + } + + ComparableVersion currentComparableVersion = new ComparableVersion(version_normalized); + if (currentComparableVersion.compareTo(latestVersion) < 0) { + // smaller version can be skipped + return; + } + + latestVersion.parseVersion(stripLeadingV(version_normalized)); + meta.setLatestVersion(version); + + if (packageVersion.has("time")) { + final String published = packageVersion.getString("time"); try { meta.setPublishedTimestamp(dateFormat.parse(published)); - } catch (ParseException e) { - LOGGER.warn("An error occurred while parsing upload time", e); + } catch (Exception e) { + LOGGER.warn("An error occurred while parsing time", e); } - }); - } catch (IOException ex) { - handleRequestException(LOGGER, ex); - } catch (Exception ex) { - throw new MetaAnalyzerException(ex); - } - + } else { + // TODO some repositories like packages.drupal.org include a 'dateStamp' field, + // example 1700068743 + // Some repositories like packages.drupal.org and composer.amasty.com/entprise + // do not include the name field for a version, so print purl + LOGGER.warn("Field 'time' not present in metadata for " + component.getPurl()); + } + }); return meta; } private static String stripLeadingV(String s) { - return s.startsWith("v") + return s.startsWith("v") || s.startsWith("V") ? s.substring(1) : s; } + + private static boolean isMinified(JSONObject data) { + return data.has("minified") && data.getString("minified").equals("composer/2.0"); + } } diff --git a/src/main/java/org/dependencytrack/tasks/repositories/IMetaAnalyzer.java b/src/main/java/org/dependencytrack/tasks/repositories/IMetaAnalyzer.java index 7afdc968db..cd6c2a80c1 100644 --- a/src/main/java/org/dependencytrack/tasks/repositories/IMetaAnalyzer.java +++ b/src/main/java/org/dependencytrack/tasks/repositories/IMetaAnalyzer.java @@ -21,6 +21,7 @@ import org.dependencytrack.exception.MetaAnalyzerException; import org.dependencytrack.model.Component; import org.dependencytrack.model.RepositoryType; + import com.github.packageurl.PackageURL; /** @@ -31,6 +32,12 @@ */ public interface IMetaAnalyzer { + /** + * Optionally set repositoryId that can be used in a cache key for example. + * @param repositoryId + */ + public void setRepositoryId(String repositoryId); + /** * Sets the base URL for the repository being used. If not specified, IMetaAnalyzer implementations * should fall back to a default value (if one is available). @@ -149,6 +156,9 @@ static IMetaAnalyzer build(Component component) { } return new IMetaAnalyzer() { + @Override + public void setRepositoryId(String repositoryId) {} + @Override public void setRepositoryBaseUrl(String baseUrl) { } diff --git a/src/main/java/org/dependencytrack/tasks/repositories/RepositoryMetaAnalyzerTask.java b/src/main/java/org/dependencytrack/tasks/repositories/RepositoryMetaAnalyzerTask.java index 3ee9019a91..dcb9548fcb 100644 --- a/src/main/java/org/dependencytrack/tasks/repositories/RepositoryMetaAnalyzerTask.java +++ b/src/main/java/org/dependencytrack/tasks/repositories/RepositoryMetaAnalyzerTask.java @@ -18,14 +18,19 @@ */ package org.dependencytrack.tasks.repositories; -import alpine.Config; -import alpine.common.logging.Logger; -import alpine.common.metrics.Metrics; -import alpine.event.framework.Event; -import alpine.event.framework.Subscriber; -import alpine.model.ConfigProperty; -import alpine.persistence.ScopedCustomization; -import io.micrometer.core.instrument.Timer; +import static org.dependencytrack.model.ConfigPropertyConstants.SCANNER_ANALYSIS_CACHE_VALIDITY_PERIOD; +import static org.dependencytrack.util.PersistenceUtil.isUniqueConstraintViolation; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; + +import javax.jdo.Query; + import org.apache.commons.lang3.StringUtils; import org.dependencytrack.common.ConfigKey; import org.dependencytrack.event.RepositoryMetaEvent; @@ -39,20 +44,17 @@ import org.dependencytrack.util.DebugDataEncryption; import org.dependencytrack.util.PurlUtil; +import alpine.Config; +import alpine.common.logging.Logger; +import alpine.common.metrics.Metrics; +import alpine.event.framework.Event; +import alpine.event.framework.Subscriber; +import alpine.model.ConfigProperty; +import alpine.persistence.ScopedCustomization; +import io.micrometer.core.instrument.Timer; import jakarta.json.Json; import jakarta.json.JsonObject; import jakarta.json.JsonObjectBuilder; -import javax.jdo.Query; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; - -import static org.dependencytrack.model.ConfigPropertyConstants.SCANNER_ANALYSIS_CACHE_VALIDITY_PERIOD; -import static org.dependencytrack.util.PersistenceUtil.isUniqueConstraintViolation; public class RepositoryMetaAnalyzerTask implements Subscriber { @@ -178,6 +180,7 @@ private void analyze(final QueryManager qm, final Component component, final IMe LOGGER.debug("Analyzing component: " + component.getUuid() + " using repository: " + repository.getIdentifier() + " (" + repository.getType() + ")"); + analyzer.setRepositoryId(repository.getIdentifier()); if (Boolean.TRUE.equals(repository.isAuthenticationRequired())) { try { String decryptedPassword = null; @@ -211,6 +214,7 @@ private void analyze(final QueryManager qm, final Component component, final IMe if (StringUtils.trimToNull(model.getLatestVersion()) != null) { // Resolution from repository was successful. Update meta model + //FIXME What happens if multiple repositories return a metamodel result with different lastPublishedTimestamps? final RepositoryMetaComponent metaComponent = new RepositoryMetaComponent(); metaComponent.setRepositoryType(repository.getType()); metaComponent.setNamespace(component.getPurl().getNamespace()); diff --git a/src/main/java/org/dependencytrack/util/ComponentVersion.java b/src/main/java/org/dependencytrack/util/ComponentVersion.java index 725e512001..80aafe308a 100644 --- a/src/main/java/org/dependencytrack/util/ComponentVersion.java +++ b/src/main/java/org/dependencytrack/util/ComponentVersion.java @@ -18,16 +18,17 @@ */ package org.dependencytrack.util; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.builder.HashCodeBuilder; - -import javax.annotation.concurrent.NotThreadSafe; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; +import javax.annotation.concurrent.NotThreadSafe; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.HashCodeBuilder; + /** *

* Simple object to track the parts of a version number. The parts are contained diff --git a/src/main/java/org/dependencytrack/util/JsonUtil.java b/src/main/java/org/dependencytrack/util/JsonUtil.java index 5bf7e3c370..6a6e688edd 100644 --- a/src/main/java/org/dependencytrack/util/JsonUtil.java +++ b/src/main/java/org/dependencytrack/util/JsonUtil.java @@ -23,6 +23,7 @@ import java.math.BigInteger; import java.time.ZonedDateTime; import java.time.format.DateTimeParseException; +import org.apache.commons.lang3.StringUtils; public final class JsonUtil { @@ -70,4 +71,11 @@ public static ZonedDateTime jsonStringToTimestamp(final String s) { } } + public static boolean isBlankJson(final String jsonString) { + if (StringUtils.isBlank(jsonString) || jsonString.equalsIgnoreCase("{}")) { + return true; + } + return false; + } + } diff --git a/src/test/java/org/dependencytrack/tasks/repositories/ComposerMetaAnalyzerTest.java b/src/test/java/org/dependencytrack/tasks/repositories/ComposerMetaAnalyzerTest.java index c247d2abdc..b071dd5896 100644 --- a/src/test/java/org/dependencytrack/tasks/repositories/ComposerMetaAnalyzerTest.java +++ b/src/test/java/org/dependencytrack/tasks/repositories/ComposerMetaAnalyzerTest.java @@ -18,129 +18,791 @@ */ package org.dependencytrack.tasks.repositories; -import com.github.packageurl.PackageURL; +import static org.mockserver.model.HttpRequest.request; +import static org.mockserver.model.HttpResponse.response; + +import java.io.File; +import java.io.FileInputStream; +import java.text.SimpleDateFormat; + import org.apache.http.HttpHeaders; import org.dependencytrack.model.Component; import org.dependencytrack.model.RepositoryType; import org.junit.AfterClass; import org.junit.Assert; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; import org.mockserver.client.MockServerClient; import org.mockserver.integration.ClientAndServer; -import java.io.File; -import java.io.FileInputStream; -import java.text.SimpleDateFormat; - -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.HttpResponse.response; +import com.github.packageurl.PackageURL; public class ComposerMetaAnalyzerTest { - private static ClientAndServer mockServer; - - @BeforeClass - public static void beforeClass() { - mockServer = ClientAndServer.startClientAndServer(1080); - } - - @AfterClass - public static void afterClass() { - mockServer.stop(); - } - - @Test - public void testAnalyzer() throws Exception { - Component component = new Component(); - component.setPurl(new PackageURL("pkg:composer/phpunit/phpunit@1.0.0")); - - ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); - Assert.assertTrue(analyzer.isApplicable(component)); - Assert.assertEquals(RepositoryType.COMPOSER, analyzer.supportedRepositoryType()); - MetaModel metaModel = analyzer.analyze(component); - Assert.assertNotNull(metaModel.getLatestVersion()); - Assert.assertNotNull(metaModel.getPublishedTimestamp()); - } - - @Test - public void testAnalyzerFindsVersionWithLeadingV() throws Exception { - Component component = new Component(); - ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); - - component.setPurl(new PackageURL("pkg:composer/typo3/class-alias-loader@v1.1.0")); - final File packagistFile = getResourceFile("typo3", "class-alias-loader"); - - analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d", mockServer.getPort())); - new MockServerClient("localhost", mockServer.getPort()) - .when( - request() - .withMethod("GET") - .withPath("/p/typo3/class-alias-loader.json") - ) - .respond( - response() - .withStatusCode(200) - .withHeader(HttpHeaders.CONTENT_TYPE, "application/json") - .withBody(getTestData(packagistFile)) - ); - - analyzer.analyze(component); - - MetaModel metaModel = analyzer.analyze(component); - - Assert.assertEquals("v1.1.3", metaModel.getLatestVersion()); - Assert.assertEquals( - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss XXX").parse("2020-05-24 13:03:22 Z"), - metaModel.getPublishedTimestamp() - ); - } - - @Test - public void testAnalyzerGetsUnexpectedResponseContentCausingLatestVersionBeingNull() throws Exception { - Component component = new Component(); - ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); - - component.setPurl(new PackageURL("pkg:composer/magento/adobe-ims@v1.0.0")); - final File packagistFile = getResourceFile("magento", "adobe-ims"); - - analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d", mockServer.getPort())); - new MockServerClient("localhost", mockServer.getPort()) - .when( - request() - .withMethod("GET") - .withPath("/p/magento/adobe-ims.json") + private static ClientAndServer mockServer; + + @BeforeClass + public static void beforeClass() { + mockServer = ClientAndServer.startClientAndServer(1080); + } + + @AfterClass + public static void afterClass() { + mockServer.stop(); + } + + @Before + public void setUp() { + mockServer.reset(); + } + + @Test + public void testAnalyzer() throws Exception { + Component component = new Component(); + component.setPurl(new PackageURL("pkg:composer/phpunit/phpunit@1.0.0")); + + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + Assert.assertTrue(analyzer.isApplicable(component)); + Assert.assertEquals(RepositoryType.COMPOSER, analyzer.supportedRepositoryType()); + MetaModel metaModel = analyzer.analyze(component); + Assert.assertNotNull(metaModel.getLatestVersion()); + Assert.assertNotNull(metaModel.getPublishedTimestamp()); + } + + @Test + public void testAnalyzerV1() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/monolog/monolog@v1.1.0")); + final File packagistFile = getPackageResourceFile("repo.packagist.org.v1", "monolog", "monolog"); + final File packagistRepoRootFile = getRepoResourceFile("repo.packagist.org.v1", "packages"); + + analyzer.setRepositoryId("1"); + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d", mockServer.getPort())); + @SuppressWarnings("resource") + MockServerClient mockClient = new MockServerClient("localhost", mockServer.getPort()); + mockClient.when( + request() + .withMethod("GET") + .withPath("/packages.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistRepoRootFile))); + + mockClient.when( + request() + .withMethod("GET") + .withPath("/p/monolog/monolog.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistFile))); + + MetaModel metaModel = analyzer.analyze(component); + + Assert.assertEquals("3.8.1", metaModel.getLatestVersion()); + Assert.assertEquals( + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss XXX").parse("2024-12-05 17:15:07 Z"), + metaModel.getPublishedTimestamp()); + } + + @Test + public void testAnalyzerFindsVersionWithLeadingVV2() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/typo3/class-alias-loader@v1.1.0")); + final File packagistFile = getPackageResourceFile("repo.packagist.org", "typo3", "class-alias-loader"); + final File packagistRepoRootFile = getRepoResourceFile("repo.packagist.org", "packages"); + + analyzer.setRepositoryId("2"); + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d", mockServer.getPort())); + @SuppressWarnings("resource") + MockServerClient mockClient = new MockServerClient("localhost", mockServer.getPort()); + mockClient.when( + request() + .withMethod("GET") + .withPath("/packages.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistRepoRootFile))); + + mockClient.when( + request() + .withMethod("GET") + .withPath("/p2/typo3/class-alias-loader.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistFile))); + + MetaModel metaModel = analyzer.analyze(component); + + Assert.assertEquals("v1.2.0", metaModel.getLatestVersion()); + Assert.assertEquals( + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss XXX").parse("2024-10-11 08:11:39 Z"), + metaModel.getPublishedTimestamp()); + } + + @Test + public void testAnalyzerInlinePackageAndRepoPath() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/dummyspace/base@v1.1.0")); + final File packagistRepoRootFile = getRepoResourceFile("composer.dummy.com.therepo", "packages"); + + analyzer.setRepositoryId("3"); + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d/therepo", mockServer.getPort())); + @SuppressWarnings("resource") + MockServerClient mockClient = new MockServerClient("localhost", mockServer.getPort()); + mockClient.when( + request() + .withMethod("GET") + .withPath("/therepo/packages.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistRepoRootFile))); + + mockClient.when( + request() + .withMethod("GET") + .withPath("/therepo/p2/dummyspace/base.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json")); + + MetaModel metaModel = analyzer.analyze(component); + + Assert.assertEquals("1.18.0", metaModel.getLatestVersion()); + Assert.assertNull(metaModel.getPublishedTimestamp()); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/therepo/packages.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/therepo/p2/dummyspace/base.json"), + org.mockserver.verify.VerificationTimes.exactly(0)); + + mockClient.verify( + request(), + org.mockserver.verify.VerificationTimes.exactly(1)); + + component.setPurl(new PackageURL("pkg:composer/something/something@v1.1.0")); + MetaModel metaModel2 = analyzer.analyze(component); + + Assert.assertNull(metaModel2.getLatestVersion()); + Assert.assertNull(metaModel2.getPublishedTimestamp()); + + // no extra calls should have been made + mockClient.verify( + request() + .withMethod("GET") + .withPath("/therepo/packages.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/therepo/p2/dummyspace/base.json"), + org.mockserver.verify.VerificationTimes.exactly(0)); + + mockClient.verify( + request(), + org.mockserver.verify.VerificationTimes.exactly(1)); + } + + @Test + public void testAnalyzerIncludesAndRepoPath() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/space/cowboy@v1.1.0")); + final File packagistRepoRootFile = getRepoResourceFile("composer.include.com.userpass", "packages"); + final File packagistFile = getPackageResourceFile("composer.include.com.userpass", "space", "cowboy"); + + analyzer.setRepositoryId("4"); + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d/user:pass/", mockServer.getPort())); + @SuppressWarnings("resource") + MockServerClient mockClient = new MockServerClient("localhost", mockServer.getPort()); + mockClient.when( + request() + .withMethod("GET") + .withPath("/user:pass/packages.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistRepoRootFile))); + + mockClient.when( + request() + .withMethod("GET") + .withPath("/user:pass/user:pass/include/all$10dbe443e5265bcae424f7fb60cd9d01b78a1b60.json") + + // .withPath("/user%3Apass/user%3Apass/include/all%2410dbe443e5265bcae424f7fb60cd9d01b78a1b60.json") ) - .respond( - response() - .withStatusCode(200) - .withHeader(HttpHeaders.CONTENT_TYPE, "application/json") - .withBody(getTestData(packagistFile)) - ); - - analyzer.analyze(component); - MetaModel metaModel = analyzer.analyze(component); - - Assert.assertNull(metaModel.getLatestVersion()); - } - - private static File getResourceFile(String namespace, String name) throws Exception{ - return new File( - Thread.currentThread().getContextClassLoader() - .getResource(String.format( - "unit/tasks/repositories/https---repo.packagist.org-p-%s-%s.json", + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistFile))); + + MetaModel metaModel = analyzer.analyze(component); + + Assert.assertEquals("2.3.8", metaModel.getLatestVersion()); + // Timestamps are in invalid format for this repo + Assert.assertNull(metaModel.getPublishedTimestamp()); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/user:pass/packages.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/user:pass/user:pass/include/all$10dbe443e5265bcae424f7fb60cd9d01b78a1b60.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request(), + org.mockserver.verify.VerificationTimes.exactly(2)); + + component.setPurl(new PackageURL("pkg:composer/something/something@v1.1.0")); + MetaModel metaModel2 = analyzer.analyze(component); + + Assert.assertNull(metaModel2.getLatestVersion()); + Assert.assertNull(metaModel2.getPublishedTimestamp()); + + // no extra calls should have been made + mockClient.verify( + request() + .withMethod("GET") + .withPath("/user:pass/packages.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/user:pass/user:pass/include/all$10dbe443e5265bcae424f7fb60cd9d01b78a1b60.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request(), + org.mockserver.verify.VerificationTimes.exactly(2)); + } + + @Test + public void testAnalyzerIncludesWithMetadataUrl() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/space/cowboy@v1.1.0")); + final File packagistRepoRootFile = getRepoResourceFile("composer.include.com.metadata", "packages"); + final File packagistFile = getPackageResourceFile("composer.include.com.metadata", "space", "cowboy"); + + analyzer.setRepositoryId("5"); + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d/user:pass/", mockServer.getPort())); + @SuppressWarnings("resource") + MockServerClient mockClient = new MockServerClient("localhost", mockServer.getPort()); + mockClient.when( + request() + .withMethod("GET") + .withPath("/user:pass/packages.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistRepoRootFile))); + + mockClient.when( + request() + .withMethod("GET") + .withPath("/user:pass/user:pass/include/all$10dbe443e5265bcae424f7fb60cd9d01b78a1b60.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json")); + + mockClient.when( + request() + .withMethod("GET") + .withPath("/user:pass/p2/space/cowboy.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistFile))); + + MetaModel metaModel = analyzer.analyze(component); + + Assert.assertEquals("6.6.6", metaModel.getLatestVersion()); + Assert.assertNull(metaModel.getPublishedTimestamp()); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/user:pass/packages.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/user:pass/user:pass/include/all$10dbe443e5265bcae424f7fb60cd9d01b78a1b60.json"), + org.mockserver.verify.VerificationTimes.exactly(0)); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/user:pass/p2/space/cowboy.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request(), + org.mockserver.verify.VerificationTimes.exactly(2)); + + component.setPurl(new PackageURL("pkg:composer/something/something@v1.1.0")); + MetaModel metaModel2 = analyzer.analyze(component); + + Assert.assertNull(metaModel2.getLatestVersion()); + Assert.assertNull(metaModel2.getPublishedTimestamp()); + + // no extra calls should have been made, only a metadata call as those are not + // cached + mockClient.verify( + request() + .withMethod("GET") + .withPath("/user:pass/packages.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/user:pass/user:pass/include/all$10dbe443e5265bcae424f7fb60cd9d01b78a1b60.json"), + org.mockserver.verify.VerificationTimes.exactly(0)); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/user:pass/p2/space/cowboy.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request(), + org.mockserver.verify.VerificationTimes.exactly(3)); + } + + @Test + public void testAnalyzerCacheOfRoot() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/typo3/class-alias-loader@v1.1.0")); + final File packagistFile = getPackageResourceFile("repo.packagist.org", "typo3", "class-alias-loader"); + final File packagistRepoRootFile = getRepoResourceFile("repo.packagist.org", "packages"); + + analyzer.setRepositoryId("6"); + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d", mockServer.getPort())); + @SuppressWarnings("resource") + MockServerClient mockClient = new MockServerClient("localhost", mockServer.getPort()); + mockClient.when( + request() + .withMethod("GET") + .withPath("/packages.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistRepoRootFile))); + + mockClient.when( + request() + .withMethod("GET") + .withPath("/p2/typo3/class-alias-loader.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistFile))); + + MetaModel metaModel = analyzer.analyze(component); + + Assert.assertEquals("v1.2.0", metaModel.getLatestVersion()); + Assert.assertEquals( + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss XXX").parse("2024-10-11 08:11:39 Z"), + metaModel.getPublishedTimestamp()); + mockClient.verify( + request() + .withMethod("GET") + .withPath("/packages.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/p2/typo3/class-alias-loader.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + analyzer.analyze(component); + mockClient.verify( + request() + .withMethod("GET") + .withPath("/packages.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/p2/typo3/class-alias-loader.json"), + org.mockserver.verify.VerificationTimes.exactly(2)); + + } + + @Test + public void testAnalyzerEmptyRoot() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/empty/root@v1.1.0")); + final File packagistRepoRootFile = getRepoResourceFile("repo.empty.org", "packages"); + + analyzer.setRepositoryId("7"); + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d", mockServer.getPort())); + @SuppressWarnings("resource") + MockServerClient mockClient = new MockServerClient("localhost", mockServer.getPort()); + mockClient.when( + request() + .withMethod("GET") + .withPath("/packages.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistRepoRootFile))); + + MetaModel metaModel = analyzer.analyze(component); + Assert.assertNull(metaModel.getLatestVersion()); + Assert.assertNull(metaModel.getPublishedTimestamp()); + + mockClient.verify( + request() + .withMethod("GET") + .withPath("/packages.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + MetaModel metaModel2 = analyzer.analyze(component); + Assert.assertNull(metaModel2.getLatestVersion()); + Assert.assertNull(metaModel2.getPublishedTimestamp()); + mockClient.verify( + request() + .withMethod("GET") + .withPath("/packages.json"), + org.mockserver.verify.VerificationTimes.exactly(1)); + + } + + @Test + public void testAnalyzerDrupalV2NoTimeWithAvailablePackagePatterns() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/drupal/mollie@v2.0.0")); + final File packagistFile = getPackageResourceFile("packages.drupal.org", "drupal", "mollie"); + final File packagistRepoRootFile = getRepoResourceFile("packages.drupal.org", "packages"); + + analyzer.setRepositoryId("8"); + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d", mockServer.getPort())); + @SuppressWarnings("resource") + MockServerClient mockClient = new MockServerClient("localhost", mockServer.getPort()); + mockClient.when( + request() + .withMethod("GET") + .withPath("/packages.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistRepoRootFile))); + + mockClient.when( + request() + .withMethod("GET") + .withPath("/files/packages/8/p2/drupal/mollie.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistFile))); + + MetaModel metaModel = analyzer.analyze(component); + + Assert.assertEquals("2.2.1", metaModel.getLatestVersion()); + Assert.assertEquals(null, metaModel.getPublishedTimestamp()); + + component.setPurl(new PackageURL("pkg:composer/phpunit/phpunit@v2.0.0")); + MetaModel metaModel2 = analyzer.analyze(component); + + Assert.assertNull(metaModel2.getLatestVersion()); + Assert.assertNull(metaModel2.getPublishedTimestamp()); + + // no calls should have been made for non-matching package + mockClient.verify( + request() + .withMethod("GET"), + org.mockserver.verify.VerificationTimes.exactly(2)); + } + + @Test + public void testAnalyzerAvailablePackages() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/io/captain-hook@v0.0.0")); + final File packagistFile = getPackageResourceFile("composer.available.com", "io", "captain-hook"); + final File packagistRepoRootFile = getRepoResourceFile("composer.available.com", "packages"); + + analyzer.setRepositoryId("9"); + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d", mockServer.getPort())); + @SuppressWarnings("resource") + MockServerClient mockClient = new MockServerClient("localhost", mockServer.getPort()); + mockClient.when( + request() + .withMethod("GET") + .withPath("/packages.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistRepoRootFile))); + + mockClient.when( + request() + .withMethod("GET") + .withPath("/repository/p2/io/captain-hook.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistFile))); + + MetaModel metaModel = analyzer.analyze(component); + + Assert.assertEquals("v1.2.0", metaModel.getLatestVersion()); + Assert.assertEquals( + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss XXX").parse("2024-10-11 08:11:39 Z"), + metaModel.getPublishedTimestamp()); + + component.setPurl(new PackageURL("pkg:composer/phpunit/phpunit@v0.0.0")); + MetaModel metaModel2 = analyzer.analyze(component); + + Assert.assertNull(metaModel2.getLatestVersion()); + Assert.assertNull(metaModel2.getPublishedTimestamp()); + + // no calls should have been made for non-matching package + mockClient.verify( + request() + .withMethod("GET"), + org.mockserver.verify.VerificationTimes.exactly(2)); + } + + @Test + public void testAnalyzerNotInAvailablePackagesAndMatchingLogic() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/io/captain-hook@v0.0.0")); + final File packagistFile = getPackageResourceFile("composer.available.com.matches", "io", "captain-hook"); + final File packagistRepoRootFile = getRepoResourceFile("composer.available.com.matches", "packages"); + + analyzer.setRepositoryId("11"); + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d", mockServer.getPort())); + @SuppressWarnings("resource") + MockServerClient mockClient = new MockServerClient("localhost", mockServer.getPort()); + mockClient.when( + request() + .withMethod("GET") + .withPath("/packages.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistRepoRootFile))); + + mockClient.when( + request() + .withMethod("GET") + .withPath("/repository/p2/io/captain-hook.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistFile))); + + MetaModel metaModel = analyzer.analyze(component); + + Assert.assertEquals("v1.2.0", metaModel.getLatestVersion()); + Assert.assertEquals( + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss XXX").parse("2024-10-11 08:11:39 Z"), + metaModel.getPublishedTimestamp()); + + component.setPurl(new PackageURL("pkg:composer/io2/phpunit@v0.0.0")); + MetaModel metaModel2 = analyzer.analyze(component); + + Assert.assertNull(metaModel2.getLatestVersion()); + Assert.assertNull(metaModel2.getPublishedTimestamp()); + + // no calls should have been made for non-matching package + mockClient.verify( + request() + .withMethod("GET"), + org.mockserver.verify.VerificationTimes.exactly(2)); + } + + + /* + * This case no longer happens in the composer v2 repositories. It now returns a + * 404 for all examples from #2134 + * - adobe-ims.json + * - adobe-stock-integration.json + * - composter-root-update-plugin.json + * - module-aws-s3.json + * Leaving it here in case we find a different package triggering this + * behaviour. + */ + @Test + public void testAnalyzerGetsUnexpectedResponseContentCausingLatestVersionBeingNull() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/magento/adobe-ims@v1.0.0")); + final File packagistFile = getPackageResourceFile("repo.packagist.org.v1", "magento", "adobe-ims"); + final File packagistRepoRootFile = getRepoResourceFile("repo.packagist.org.v1", "packages"); + + analyzer.setRepositoryId("10"); + @SuppressWarnings("resource") + MockServerClient mockClient = new MockServerClient("localhost", mockServer.getPort()); + mockClient.when( + request() + .withMethod("GET") + .withPath("/packages.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistRepoRootFile))); + + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d", mockServer.getPort())); + mockClient.when( + request() + .withMethod("GET") + .withPath("/p/magento/adobe-ims.json")) + .respond( + response() + .withStatusCode(200) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json") + .withBody(getTestData(packagistFile))); + + analyzer.analyze(component); + MetaModel metaModel = analyzer.analyze(component); + + Assert.assertNull(metaModel.getLatestVersion()); + } + + @Test + public void testAnalyzerGetsUnexpectedResponseContent404() throws Exception { + Component component = new Component(); + ComposerMetaAnalyzer analyzer = new ComposerMetaAnalyzer(); + + component.setPurl(new PackageURL("pkg:composer/magento/adobe-ims@v1.0.0")); + + analyzer.setRepositoryId("12"); + analyzer.setRepositoryBaseUrl(String.format("http://localhost:%d", mockServer.getPort())); + new MockServerClient("localhost", mockServer.getPort()) + .when( + request() + .withMethod("GET") + .withPath("/p2/magento/adobe-ims.json")) + .respond( + response() + .withStatusCode(404) + .withHeader(HttpHeaders.CONTENT_TYPE, + "application/json")); + + analyzer.analyze(component); + MetaModel metaModel = analyzer.analyze(component); + + Assert.assertNull(metaModel.getLatestVersion()); + } + + private static File getRepoResourceFile(String repo, String filename) throws Exception { + String filenameResource = String.format( + "unit/tasks/repositories/https---%s-%s.json", + repo, + filename); + return getFileResource(filenameResource); + } + + private static File getPackageResourceFile(String repo, String namespace, String name) throws Exception { + String filename = String.format( + "unit/tasks/repositories/https---%s-%s-%s.json", + repo, namespace, - name - )) - .toURI() - ); - } - - private static byte[] getTestData(File file) throws Exception { - final FileInputStream fileStream = new FileInputStream(file); - byte[] data = new byte[(int) file.length()]; - fileStream.read(data); - fileStream.close(); - return data; - } + name); + return getFileResource(filename); + } + + private static File getFileResource(String filename) throws Exception { + return new File( + Thread.currentThread().getContextClassLoader() + .getResource(filename) + .toURI()); + } + + private static byte[] getTestData(File file) throws Exception { + final FileInputStream fileStream = new FileInputStream(file); + byte[] data = new byte[(int) file.length()]; + fileStream.read(data); + fileStream.close(); + return data; + } } diff --git a/src/test/resources/unit/tasks/repositories/https---composer.available.com-io-captain-hook.json b/src/test/resources/unit/tasks/repositories/https---composer.available.com-io-captain-hook.json new file mode 100644 index 0000000000..e3d79f6d23 --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---composer.available.com-io-captain-hook.json @@ -0,0 +1,266 @@ +{ + "minified": "composer/2.0", + "packages": { + "io/captain-hook": [ + { + "authors": [ + { + "email": "info@helhum.io", + "name": "Helmut Hummel" + } + ], + "autoload": { + "psr-4": { + "io\\ClassAliasLoader\\": "src/" + } + }, + "description": "Amends the composer class loader to support class aliases to provide backwards compatibility for packages", + "dist": { + "reference": "cf2aebabe1886474da7194e1531900039263b3e0", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/cf2aebabe1886474da7194e1531900039263b3e0" + }, + "extra": { + "branch-alias": { + "dev-main": "1.1.x-dev" + }, + "class": "io\\ClassAliasLoader\\Plugin" + }, + "funding": [ + ], + "homepage": "http://github.com/io/captain-hook", + "keywords": [ + "autoloader", + "composer", + "classloader", + "alias" + ], + "license": [ + "MIT" + ], + "name": "io/captain-hook", + "replace": { + "helhum/captain-hook": "*" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=7.1" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": ">4.8 <9" + }, + "source": { + "reference": "cf2aebabe1886474da7194e1531900039263b3e0", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.2.0" + }, + "time": "2024-10-11T08:11:39+00:00", + "type": "composer-plugin", + "version": "v1.2.0", + "version_normalized": "1.2.0.0" + }, + { + "dist": { + "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/f6fc1f5fb04c42195e8e663b43aced4919ef318f" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3.7" + }, + "source": { + "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.1.4" + }, + "time": "2022-08-07T14:48:42+00:00", + "version": "v1.1.4", + "version_normalized": "1.1.4.0" + }, + { + "dist": { + "reference": "575f59581541f299f3a86a95b1db001ee6e1d2e0", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/575f59581541f299f3a86a95b1db001ee6e1d2e0" + }, + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + }, + "class": "io\\ClassAliasLoader\\Plugin" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": ">4.8 <8" + }, + "source": { + "reference": "575f59581541f299f3a86a95b1db001ee6e1d2e0", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.1.3" + }, + "time": "2020-05-24T13:03:22+00:00", + "version": "v1.1.3", + "version_normalized": "1.1.3.0" + }, + { + "dist": { + "reference": "ead04a4d7bc215ca1faa895977c5ea349f0b7383", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/ead04a4d7bc215ca1faa895977c5ea349f0b7383" + }, + "source": { + "reference": "ead04a4d7bc215ca1faa895977c5ea349f0b7383", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.1.2" + }, + "time": "2020-05-07T12:46:20+00:00", + "version": "v1.1.2", + "version_normalized": "1.1.2.0" + }, + { + "dist": { + "reference": "ee417366a289871460910ae1703976e9903a5e80", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/ee417366a289871460910ae1703976e9903a5e80" + }, + "source": { + "reference": "ee417366a289871460910ae1703976e9903a5e80", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.1.1" + }, + "time": "2020-04-30T10:13:10+00:00", + "version": "v1.1.1", + "version_normalized": "1.1.1.0" + }, + { + "dist": { + "reference": "282b56758ee542b9bc9f2c3cd12da22b76ddba3f", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/282b56758ee542b9bc9f2c3cd12da22b76ddba3f" + }, + "source": { + "reference": "282b56758ee542b9bc9f2c3cd12da22b76ddba3f", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.1.0" + }, + "time": "2020-04-29T19:51:20+00:00", + "version": "v1.1.0", + "version_normalized": "1.1.0.0" + }, + { + "dist": { + "reference": "994ee9bebe847da862d0edc6f075df4693dfa8e2", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/994ee9bebe847da862d0edc6f075df4693dfa8e2" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": "^4.8" + }, + "source": { + "reference": "994ee9bebe847da862d0edc6f075df4693dfa8e2", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/master" + }, + "time": "2020-03-29T16:12:26+00:00", + "version": "v1.0.2", + "version_normalized": "1.0.2.0" + }, + { + "dist": { + "reference": "4972f9f6c2bad07ab1620b5c9717fa626e9b03b0", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/4972f9f6c2bad07ab1620b5c9717fa626e9b03b0" + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + }, + "class": "io\\ClassAliasLoader\\Plugin" + }, + "funding": "__unset", + "require": { + "composer-plugin-api": "^1.0", + "php": ">=5.3.7" + }, + "require-dev": { + "composer/composer": "dev-master", + "mikey179/vfsstream": "1.4.*@dev", + "phpunit/phpunit": "^4.8" + }, + "source": { + "reference": "4972f9f6c2bad07ab1620b5c9717fa626e9b03b0", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "time": "2018-10-03T12:49:56+00:00", + "version": "1.0.1", + "version_normalized": "1.0.1.0" + }, + { + "dist": { + "reference": "a9dd295c81ed0b51455644be420ab9210cad688f", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/a9dd295c81ed0b51455644be420ab9210cad688f" + }, + "require-dev": { + "composer/composer": "dev-master", + "mikey179/vfsstream": "1.4.*@dev", + "phpunit/phpunit": "~4.7.0" + }, + "source": { + "reference": "a9dd295c81ed0b51455644be420ab9210cad688f", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "time": "2015-10-06T10:25:44+00:00", + "version": "1.0.0", + "version_normalized": "1.0.0.0" + } + ] + }, + "security-advisories": [ + ] +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---composer.available.com-packages.json b/src/test/resources/unit/tasks/repositories/https---composer.available.com-packages.json new file mode 100644 index 0000000000..c13172372c --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---composer.available.com-packages.json @@ -0,0 +1,14 @@ +{ + "packages": [], + "includes": { + "include\/all$375c50aec65940bda6dd478ca38dc2062f755dd5.json": { + "sha1": "375c50aec65940bda6dd478ca38dc2062f755dd5" + } + }, + "metadata-url": "\/repository\/p2\/%package%.json", + "available-packages": [ + "io\/captain-hook", + "io\/composer-git-hooks-standard", + "io\/composer-patches" + ] +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---composer.available.com.matches-io-captain-hook.json b/src/test/resources/unit/tasks/repositories/https---composer.available.com.matches-io-captain-hook.json new file mode 100644 index 0000000000..e3d79f6d23 --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---composer.available.com.matches-io-captain-hook.json @@ -0,0 +1,266 @@ +{ + "minified": "composer/2.0", + "packages": { + "io/captain-hook": [ + { + "authors": [ + { + "email": "info@helhum.io", + "name": "Helmut Hummel" + } + ], + "autoload": { + "psr-4": { + "io\\ClassAliasLoader\\": "src/" + } + }, + "description": "Amends the composer class loader to support class aliases to provide backwards compatibility for packages", + "dist": { + "reference": "cf2aebabe1886474da7194e1531900039263b3e0", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/cf2aebabe1886474da7194e1531900039263b3e0" + }, + "extra": { + "branch-alias": { + "dev-main": "1.1.x-dev" + }, + "class": "io\\ClassAliasLoader\\Plugin" + }, + "funding": [ + ], + "homepage": "http://github.com/io/captain-hook", + "keywords": [ + "autoloader", + "composer", + "classloader", + "alias" + ], + "license": [ + "MIT" + ], + "name": "io/captain-hook", + "replace": { + "helhum/captain-hook": "*" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=7.1" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": ">4.8 <9" + }, + "source": { + "reference": "cf2aebabe1886474da7194e1531900039263b3e0", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.2.0" + }, + "time": "2024-10-11T08:11:39+00:00", + "type": "composer-plugin", + "version": "v1.2.0", + "version_normalized": "1.2.0.0" + }, + { + "dist": { + "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/f6fc1f5fb04c42195e8e663b43aced4919ef318f" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3.7" + }, + "source": { + "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.1.4" + }, + "time": "2022-08-07T14:48:42+00:00", + "version": "v1.1.4", + "version_normalized": "1.1.4.0" + }, + { + "dist": { + "reference": "575f59581541f299f3a86a95b1db001ee6e1d2e0", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/575f59581541f299f3a86a95b1db001ee6e1d2e0" + }, + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + }, + "class": "io\\ClassAliasLoader\\Plugin" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": ">4.8 <8" + }, + "source": { + "reference": "575f59581541f299f3a86a95b1db001ee6e1d2e0", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.1.3" + }, + "time": "2020-05-24T13:03:22+00:00", + "version": "v1.1.3", + "version_normalized": "1.1.3.0" + }, + { + "dist": { + "reference": "ead04a4d7bc215ca1faa895977c5ea349f0b7383", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/ead04a4d7bc215ca1faa895977c5ea349f0b7383" + }, + "source": { + "reference": "ead04a4d7bc215ca1faa895977c5ea349f0b7383", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.1.2" + }, + "time": "2020-05-07T12:46:20+00:00", + "version": "v1.1.2", + "version_normalized": "1.1.2.0" + }, + { + "dist": { + "reference": "ee417366a289871460910ae1703976e9903a5e80", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/ee417366a289871460910ae1703976e9903a5e80" + }, + "source": { + "reference": "ee417366a289871460910ae1703976e9903a5e80", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.1.1" + }, + "time": "2020-04-30T10:13:10+00:00", + "version": "v1.1.1", + "version_normalized": "1.1.1.0" + }, + { + "dist": { + "reference": "282b56758ee542b9bc9f2c3cd12da22b76ddba3f", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/282b56758ee542b9bc9f2c3cd12da22b76ddba3f" + }, + "source": { + "reference": "282b56758ee542b9bc9f2c3cd12da22b76ddba3f", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/v1.1.0" + }, + "time": "2020-04-29T19:51:20+00:00", + "version": "v1.1.0", + "version_normalized": "1.1.0.0" + }, + { + "dist": { + "reference": "994ee9bebe847da862d0edc6f075df4693dfa8e2", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/994ee9bebe847da862d0edc6f075df4693dfa8e2" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": "^4.8" + }, + "source": { + "reference": "994ee9bebe847da862d0edc6f075df4693dfa8e2", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "support": { + "issues": "https://github.com/io/captain-hook/issues", + "source": "https://github.com/io/captain-hook/tree/master" + }, + "time": "2020-03-29T16:12:26+00:00", + "version": "v1.0.2", + "version_normalized": "1.0.2.0" + }, + { + "dist": { + "reference": "4972f9f6c2bad07ab1620b5c9717fa626e9b03b0", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/4972f9f6c2bad07ab1620b5c9717fa626e9b03b0" + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + }, + "class": "io\\ClassAliasLoader\\Plugin" + }, + "funding": "__unset", + "require": { + "composer-plugin-api": "^1.0", + "php": ">=5.3.7" + }, + "require-dev": { + "composer/composer": "dev-master", + "mikey179/vfsstream": "1.4.*@dev", + "phpunit/phpunit": "^4.8" + }, + "source": { + "reference": "4972f9f6c2bad07ab1620b5c9717fa626e9b03b0", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "time": "2018-10-03T12:49:56+00:00", + "version": "1.0.1", + "version_normalized": "1.0.1.0" + }, + { + "dist": { + "reference": "a9dd295c81ed0b51455644be420ab9210cad688f", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/io/captain-hook/zipball/a9dd295c81ed0b51455644be420ab9210cad688f" + }, + "require-dev": { + "composer/composer": "dev-master", + "mikey179/vfsstream": "1.4.*@dev", + "phpunit/phpunit": "~4.7.0" + }, + "source": { + "reference": "a9dd295c81ed0b51455644be420ab9210cad688f", + "type": "git", + "url": "https://github.com/io/captain-hook.git" + }, + "time": "2015-10-06T10:25:44+00:00", + "version": "1.0.0", + "version_normalized": "1.0.0.0" + } + ] + }, + "security-advisories": [ + ] +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---composer.available.com.matches-packages.json b/src/test/resources/unit/tasks/repositories/https---composer.available.com.matches-packages.json new file mode 100644 index 0000000000..6ec68ab029 --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---composer.available.com.matches-packages.json @@ -0,0 +1,17 @@ +{ + "packages": [], + "includes": { + "include\/all$375c50aec65940bda6dd478ca38dc2062f755dd5.json": { + "sha1": "375c50aec65940bda6dd478ca38dc2062f755dd5" + } + }, + "metadata-url": "\/repository\/p2\/%package%.json", + "available-packages": [ + "io2\/captain-hook", + "io2\/composer-git-hooks-standard", + "io2\/composer-patches" + ], + "available-package-patterns": [ + "io\/captain-hook" + ] +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---composer.dummy.com.therepo-packages.json b/src/test/resources/unit/tasks/repositories/https---composer.dummy.com.therepo-packages.json new file mode 100644 index 0000000000..e774c29d71 --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---composer.dummy.com.therepo-packages.json @@ -0,0 +1,256 @@ +{ + "packages": { + "dummyspace\/base": { + "1.1.0": { + "name": "dummyspace\/base", + "description": "dummyspace Base", + "require": { + "php": "~5.6.5|7.0.2|7.0.4|~7.0.6|~7.1.0" + }, + "type": "magento2-module", + "version": "1.1.0", + "license": [ + "Commercial" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "dummyspace\\Base\\": "" + } + }, + "dist": { + "url": "https:\/\/composer.dummyspace.com\/therepo\/packages\/dummyspace\/base-1.1.0-ee.zip", + "type": "zip" + } + }, + "1.0.1": { + "name": "dummyspace\/base", + "description": "dummyspace Base", + "require": { + "php": "~5.5.0|~5.6.0|~7.0.0" + }, + "type": "magento2-module", + "version": "1.0.1", + "license": [ + "Commercial" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "dummyspace\\Base\\": "" + } + }, + "dist": { + "url": "https:\/\/composer.dummyspace.com\/therepo\/packages\/dummyspace\/base-1.0.1-ee.zip", + "type": "zip" + } + }, + "1.1.1": { + "name": "dummyspace\/base", + "description": "dummyspace Base", + "require": { + "php": "~5.6.5|7.0.2|7.0.4|~7.0.6|~7.1.0" + }, + "type": "magento2-module", + "version": "1.1.1", + "license": [ + "Commercial" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "dummyspace\\Base\\": "" + } + }, + "dist": { + "url": "https:\/\/composer.dummyspace.com\/therepo\/packages\/dummyspace\/base-1.1.1-ee.zip", + "type": "zip" + } + }, + "1.1.2": { + "name": "dummyspace\/base", + "description": "dummyspace Base", + "require": { + "php": "~5.6.5|7.0.2|7.0.4|~7.0.6|~7.1.0" + }, + "type": "magento2-module", + "version": "1.1.2", + "license": [ + "Commercial" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "dummyspace\\Base\\": "" + } + }, + "dist": { + "url": "https:\/\/composer.dummyspace.com\/therepo\/packages\/dummyspace\/base-1.1.2-ee.zip", + "type": "zip" + } + }, + "1.2.0": { + "name": "dummyspace\/base", + "description": "dummyspace Base", + "require": { + "php": "~5.6.5|7.0.2|7.0.4|~7.0.6|~7.1.0" + }, + "type": "magento2-module", + "version": "1.2.0", + "license": [ + "Commercial" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "dummyspace\\Base\\": "" + } + }, + "dist": { + "url": "https:\/\/composer.dummyspace.com\/therepo\/packages\/dummyspace\/base-1.2.0-ee.zip", + "type": "zip" + } + }, + "1.18.0": { + "name": "dummyspace\/base", + "description": "dummyspace Base", + "require": { + "php": ">=7.3", + "ext-dom": "*", + "monolog\/monolog": ">=1.17" + }, + "type": "magento2-module", + "version": "1.18.0", + "license": [ + "proprietary" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "dummyspace\\Base\\": "" + } + }, + "dist": { + "type": "zip", + "url": "https:\/\/composer.dummyspace.com\/therepo\/packages\/dummyspace\/base-1.18.0.zip" + } + }, + "master": { + "name": "dummyspace\/base", + "description": "dummyspace Base", + "require": { + "php": ">=7.3", + "ext-dom": "*", + "monolog\/monolog": ">=1.17" + }, + "type": "magento2-module", + "version": "1.18.0", + "license": [ + "proprietary" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "dummyspace\\Base\\": "" + } + }, + "dist": { + "type": "zip", + "url": "https:\/\/composer.dummyspace.com\/therepo\/packages\/dummyspace\/base-1.18.0.zip" + } + } + }, + "dummyspace\/fb": { + "1.0.0": { + "name": "dummyspace\/fb", + "description": "dummyspace Facebook Review", + "require": { + "php": "~5.6.5|7.0.2|7.0.4|~7.0.6|~7.1.0", + "dummyspace\/base": "*" + }, + "type": "magento2-module", + "version": "1.0.0", + "license": [ + "Commercial" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "dummyspace\\fb\\": "" + } + }, + "dist": { + "url": "https:\/\/composer.dummyspace.com\/therepo\/packages\/dummyspace\/fb-1.0.0-ee.zip", + "type": "zip" + } + }, + "1.0.6": { + "name": "dummyspace\/fb", + "description": "dummyspace Facebook Review", + "require": { + "php": ">=7.3", + "dummyspace\/base": ">=1.14.7" + }, + "type": "magento2-module", + "version": "1.0.6", + "license": [ + "proprietary" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "dummyspace\\fb\\": "" + } + }, + "dist": { + "type": "zip", + "url": "https:\/\/composer.dummyspace.com\/therepo\/packages\/dummyspace\/fb-1.0.6.zip" + } + }, + "master": { + "name": "dummyspace\/fb", + "description": "dummyspace Facebook Review", + "require": { + "php": ">=7.3", + "dummyspace\/base": ">=1.14.7" + }, + "type": "magento2-module", + "version": "1.0.6", + "license": [ + "proprietary" + ], + "autoload": { + "files": [ + "registration.php" + ], + "psr-4": { + "dummyspace\\fb\\": "" + } + }, + "dist": { + "type": "zip", + "url": "https:\/\/composer.dummyspace.com\/therepo\/packages\/dummyspace\/fb-1.0.6.zip" + } + } + } + } + } +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---composer.include.com.metadata-packages.json b/src/test/resources/unit/tasks/repositories/https---composer.include.com.metadata-packages.json new file mode 100644 index 0000000000..db131bf632 --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---composer.include.com.metadata-packages.json @@ -0,0 +1,9 @@ +{ + "packages": [], + "includes": { + "user:pass/include/all$10dbe443e5265bcae424f7fb60cd9d01b78a1b60.json": { + "sha1": "10dbe443e5265bcae424f7fb60cd9d01b78a1b60" + } + }, + "metadata-url": "p2\/%package%.json" +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---composer.include.com.metadata-space-cowboy.json b/src/test/resources/unit/tasks/repositories/https---composer.include.com.metadata-space-cowboy.json new file mode 100644 index 0000000000..212fa8b138 --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---composer.include.com.metadata-space-cowboy.json @@ -0,0 +1,211 @@ +{ + "packages": { + "space\/module-core": { + "1.4.9": { + "name": "space\/module-core", + "version": "1.4.9", + "version_normalized": "1.4.9.0", + "dist": { + "type": "tar" + }, + "require": { + "magento\/framework": "102.0.*|103.0.*", + "php": "^7.1|^8.0" + }, + "conflict": { + "space\/module-helpdesk": "<1.1.83", + "space\/module-rma": "<2.0.39" + }, + "time": "2023-01-17 12:40:35", + "type": "magento2-module", + "autoload": { + "files": [ + "src\/Core\/registration.php" + ], + "psr-4": { + "space\\Core\\": "src\/Core" + } + }, + "license": [ + "proprietary" + ], + "description": "space Core" + } + }, + "space\/toy": { + "1.1.0": { + "name": "space\/toy", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "dist": { + "type": "tar" + }, + "require": { + "space\/module-misspell": "1.0.*", + "space\/module-search-autocomplete": "1.1.*", + "space\/module-search-elastic": "1.2.*", + "space\/module-search-landing": "1.0.*", + "space\/module-search-report": "1.0.*" + }, + "time": "2018-04-05 09:56:42", + "type": "magento2-module", + "license": [ + "proprietary" + ], + "description": "Elastic Search Ultimate" + }, + "1.1.1": { + "name": "space\/toy", + "version": "1.1.1", + "version_normalized": "1.1.1.0", + "dist": { + "type": "tar" + }, + "require": { + "space\/module-misspell": "1.0.*", + "space\/module-search-autocomplete": "1.1.*|1.2.*", + "space\/module-search-elastic": "1.2.*", + "space\/module-search-landing": "1.0.*", + "space\/module-search-report": "1.0.*" + }, + "time": "2020-05-15 10:50:32", + "type": "magento2-module", + "autoload": { + "files": [ + "src\/SearchElasticUltimate\/registration.php" + ], + "psr-4": { + "space\\SearchElasticUltimate\\": "src\/SearchElasticUltimate" + } + }, + "license": [ + "proprietary" + ], + "description": "Elastic Search Ultimate" + } + }, + "space\/cowboy": { + "1.0.1": { + "name": "space\/cowboy", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "dist": { + "type": "tar" + }, + "require": { + "space\/module-misspell": "1.0.*", + "space\/module-search-autocomplete": "1.0.*", + "space\/module-search-sphinx": "1.0.*" + }, + "time": "2016-03-09 09:06:41", + "type": "magento2-module", + "autoload": { + "files": [], + "psr-4": [] + }, + "license": [ + "proprietary" + ], + "description": "Sphinx Search Ultimate" + }, + "2.3.7": { + "name": "space\/cowboy", + "version": "2.3.7", + "version_normalized": "2.3.7.0", + "dist": { + "type": "tar" + }, + "require": { + "magento\/framework": "103.0.*", + "space\/module-core": "dev-master|^1.4.39", + "space\/module-report": "dev-master|*" + }, + "conflict": { + "hyva-themes\/magento2-space-search-autocomplete": "*", + "space\/module-blog-mx": "<2.0.0" + }, + "time": "2024-12-10 12:14:27", + "type": "magento2-module", + "autoload": { + "files": [ + "src\/SearchUltimate\/registration.php", + "src\/Misspell\/registration.php", + "src\/Search\/registration.php", + "src\/SearchAutocomplete\/registration.php", + "src\/SearchElastic\/registration.php", + "src\/SearchLanding\/registration.php", + "src\/SearchMysql\/registration.php", + "src\/SearchReport\/registration.php", + "src\/SearchSphinx\/registration.php", + "src\/SearchGraphQl\/registration.php" + ], + "psr-4": { + "space\\SearchUltimate\\": "src\/SearchUltimate", + "space\\Misspell\\": "src\/Misspell", + "space\\Search\\": "src\/Search", + "space\\SearchAutocomplete\\": "src\/SearchAutocomplete", + "space\\SearchElastic\\": "src\/SearchElastic", + "space\\SearchLanding\\": "src\/SearchLanding", + "space\\SearchMysql\\": "src\/SearchMysql", + "space\\SearchReport\\": "src\/SearchReport", + "space\\SearchSphinx\\": "src\/SearchSphinx", + "space\\SearchGraphQl\\": "src\/SearchGraphQl" + } + }, + "license": [ + "proprietary" + ], + "description": "Search Ultimate" + }, + "6.6.6": { + "name": "space\/cowboy", + "version": "6.6.6", + "version_normalized": "6.6.6.0", + "dist": { + "type": "tar" + }, + "require": { + "magento\/framework": "103.0.*", + "space\/module-core": "dev-master|^1.4.39", + "space\/module-report": "dev-master|*" + }, + "conflict": { + "hyva-themes\/magento2-space-search-autocomplete": "*", + "space\/module-blog-mx": "<2.0.0" + }, + "time": "2024-12-20 06:16:51", + "type": "magento2-module", + "autoload": { + "files": [ + "src\/SearchUltimate\/registration.php", + "src\/Misspell\/registration.php", + "src\/Search\/registration.php", + "src\/SearchAutocomplete\/registration.php", + "src\/SearchElastic\/registration.php", + "src\/SearchLanding\/registration.php", + "src\/SearchMysql\/registration.php", + "src\/SearchReport\/registration.php", + "src\/SearchSphinx\/registration.php", + "src\/SearchGraphQl\/registration.php" + ], + "psr-4": { + "space\\SearchUltimate\\": "src\/SearchUltimate", + "space\\Misspell\\": "src\/Misspell", + "space\\Search\\": "src\/Search", + "space\\SearchAutocomplete\\": "src\/SearchAutocomplete", + "space\\SearchElastic\\": "src\/SearchElastic", + "space\\SearchLanding\\": "src\/SearchLanding", + "space\\SearchMysql\\": "src\/SearchMysql", + "space\\SearchReport\\": "src\/SearchReport", + "space\\SearchSphinx\\": "src\/SearchSphinx", + "space\\SearchGraphQl\\": "src\/SearchGraphQl" + } + }, + "license": [ + "proprietary" + ], + "description": "Search Ultimate" + } + } + } +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---composer.include.com.userpass-packages.json b/src/test/resources/unit/tasks/repositories/https---composer.include.com.userpass-packages.json new file mode 100644 index 0000000000..25fa7c3282 --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---composer.include.com.userpass-packages.json @@ -0,0 +1,8 @@ +{ + "packages": [], + "includes": { + "user:pass/include/all$10dbe443e5265bcae424f7fb60cd9d01b78a1b60.json": { + "sha1": "10dbe443e5265bcae424f7fb60cd9d01b78a1b60" + } + } +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---composer.include.com.userpass-space-cowboy.json b/src/test/resources/unit/tasks/repositories/https---composer.include.com.userpass-space-cowboy.json new file mode 100644 index 0000000000..965552f3bd --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---composer.include.com.userpass-space-cowboy.json @@ -0,0 +1,211 @@ +{ + "packages": { + "space\/module-core": { + "1.4.9": { + "name": "space\/module-core", + "version": "1.4.9", + "version_normalized": "1.4.9.0", + "dist": { + "type": "tar" + }, + "require": { + "magento\/framework": "102.0.*|103.0.*", + "php": "^7.1|^8.0" + }, + "conflict": { + "space\/module-helpdesk": "<1.1.83", + "space\/module-rma": "<2.0.39" + }, + "time": "2023-01-17 12:40:35", + "type": "magento2-module", + "autoload": { + "files": [ + "src\/Core\/registration.php" + ], + "psr-4": { + "space\\Core\\": "src\/Core" + } + }, + "license": [ + "proprietary" + ], + "description": "space Core" + } + }, + "space\/toy": { + "1.1.0": { + "name": "space\/toy", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "dist": { + "type": "tar" + }, + "require": { + "space\/module-misspell": "1.0.*", + "space\/module-search-autocomplete": "1.1.*", + "space\/module-search-elastic": "1.2.*", + "space\/module-search-landing": "1.0.*", + "space\/module-search-report": "1.0.*" + }, + "time": "2018-04-05 09:56:42", + "type": "magento2-module", + "license": [ + "proprietary" + ], + "description": "Elastic Search Ultimate" + }, + "1.1.1": { + "name": "space\/toy", + "version": "1.1.1", + "version_normalized": "1.1.1.0", + "dist": { + "type": "tar" + }, + "require": { + "space\/module-misspell": "1.0.*", + "space\/module-search-autocomplete": "1.1.*|1.2.*", + "space\/module-search-elastic": "1.2.*", + "space\/module-search-landing": "1.0.*", + "space\/module-search-report": "1.0.*" + }, + "time": "2020-05-15 10:50:32", + "type": "magento2-module", + "autoload": { + "files": [ + "src\/SearchElasticUltimate\/registration.php" + ], + "psr-4": { + "space\\SearchElasticUltimate\\": "src\/SearchElasticUltimate" + } + }, + "license": [ + "proprietary" + ], + "description": "Elastic Search Ultimate" + } + }, + "space\/cowboy": { + "1.0.1": { + "name": "space\/cowboy", + "version": "1.0.1", + "version_normalized": "1.0.1.0", + "dist": { + "type": "tar" + }, + "require": { + "space\/module-misspell": "1.0.*", + "space\/module-search-autocomplete": "1.0.*", + "space\/module-search-sphinx": "1.0.*" + }, + "time": "2016-03-09 09:06:41", + "type": "magento2-module", + "autoload": { + "files": [], + "psr-4": [] + }, + "license": [ + "proprietary" + ], + "description": "Sphinx Search Ultimate" + }, + "2.3.7": { + "name": "space\/cowboy", + "version": "2.3.7", + "version_normalized": "2.3.7.0", + "dist": { + "type": "tar" + }, + "require": { + "magento\/framework": "103.0.*", + "space\/module-core": "dev-master|^1.4.39", + "space\/module-report": "dev-master|*" + }, + "conflict": { + "hyva-themes\/magento2-space-search-autocomplete": "*", + "space\/module-blog-mx": "<2.0.0" + }, + "time": "2024-12-10 12:14:27", + "type": "magento2-module", + "autoload": { + "files": [ + "src\/SearchUltimate\/registration.php", + "src\/Misspell\/registration.php", + "src\/Search\/registration.php", + "src\/SearchAutocomplete\/registration.php", + "src\/SearchElastic\/registration.php", + "src\/SearchLanding\/registration.php", + "src\/SearchMysql\/registration.php", + "src\/SearchReport\/registration.php", + "src\/SearchSphinx\/registration.php", + "src\/SearchGraphQl\/registration.php" + ], + "psr-4": { + "space\\SearchUltimate\\": "src\/SearchUltimate", + "space\\Misspell\\": "src\/Misspell", + "space\\Search\\": "src\/Search", + "space\\SearchAutocomplete\\": "src\/SearchAutocomplete", + "space\\SearchElastic\\": "src\/SearchElastic", + "space\\SearchLanding\\": "src\/SearchLanding", + "space\\SearchMysql\\": "src\/SearchMysql", + "space\\SearchReport\\": "src\/SearchReport", + "space\\SearchSphinx\\": "src\/SearchSphinx", + "space\\SearchGraphQl\\": "src\/SearchGraphQl" + } + }, + "license": [ + "proprietary" + ], + "description": "Search Ultimate" + }, + "2.3.8": { + "name": "space\/cowboy", + "version": "2.3.8", + "version_normalized": "2.3.8.0", + "dist": { + "type": "tar" + }, + "require": { + "magento\/framework": "103.0.*", + "space\/module-core": "dev-master|^1.4.39", + "space\/module-report": "dev-master|*" + }, + "conflict": { + "hyva-themes\/magento2-space-search-autocomplete": "*", + "space\/module-blog-mx": "<2.0.0" + }, + "time": "2024-12-20 06:16:51", + "type": "magento2-module", + "autoload": { + "files": [ + "src\/SearchUltimate\/registration.php", + "src\/Misspell\/registration.php", + "src\/Search\/registration.php", + "src\/SearchAutocomplete\/registration.php", + "src\/SearchElastic\/registration.php", + "src\/SearchLanding\/registration.php", + "src\/SearchMysql\/registration.php", + "src\/SearchReport\/registration.php", + "src\/SearchSphinx\/registration.php", + "src\/SearchGraphQl\/registration.php" + ], + "psr-4": { + "space\\SearchUltimate\\": "src\/SearchUltimate", + "space\\Misspell\\": "src\/Misspell", + "space\\Search\\": "src\/Search", + "space\\SearchAutocomplete\\": "src\/SearchAutocomplete", + "space\\SearchElastic\\": "src\/SearchElastic", + "space\\SearchLanding\\": "src\/SearchLanding", + "space\\SearchMysql\\": "src\/SearchMysql", + "space\\SearchReport\\": "src\/SearchReport", + "space\\SearchSphinx\\": "src\/SearchSphinx", + "space\\SearchGraphQl\\": "src\/SearchGraphQl" + } + }, + "license": [ + "proprietary" + ], + "description": "Search Ultimate" + } + } + } +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---packages.drupal.org-drupal-mollie.json b/src/test/resources/unit/tasks/repositories/https---packages.drupal.org-drupal-mollie.json new file mode 100644 index 0000000000..c861576e3e --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---packages.drupal.org-drupal-mollie.json @@ -0,0 +1,374 @@ +{ + "packages": { + "drupal/mollie": [ + { + "keywords": "Actively maintained,Developer", + "homepage": "https://www.drupal.org/project/mollie", + "version": "2.2.1", + "version_normalized": "2.2.1.0", + "license": "GPL-2.0-or-later", + "authors": [ + { + "name": "Rico van de Vin (ricovandevin)", + "homepage": "https://www.drupal.org/u/ricovandevin", + "role": "Maintainer" + } + ], + "support": { + "source": "https://cgit.drupalcode.org/mollie", + "issues": "https://www.drupal.org/project/issues/mollie" + }, + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/mollie.git", + "reference": "2.2.1" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/mollie-2.2.1.zip", + "reference": "2.2.1", + "shasum": "ae2903586021ba361919184308601c733fa542f6" + }, + "type": "drupal-module", + "uid": "mollie-3401860", + "name": "drupal/mollie", + "extra": { + "drupal": { + "version": "2.2.1", + "datestamp": "1700068743", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "require-dev": { + "drupal/webform": "^6", + "drupal/uc_payment": "*", + "drupal/commerce_payment": "*" + }, + "require": { + "drupal/core": "^9.5 || ^10", + "php": "\u003E=8.1", + "mollie/mollie-api-php": "^2.52" + }, + "description": "Enables online payments in Drupal through Mollie.", + "minimum-stability": "dev", + "suggest": { + "webform/webform": "Webform should be installed for using the Mollie for Drupal Webform submodule (mollie_webform)." + }, + "conflict": { + "webform/webform": "\u003C6.0" + } + }, + { + "version": "2.2.0", + "version_normalized": "2.2.0.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/mollie.git", + "reference": "2.2.0" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/mollie-2.2.0.zip", + "reference": "2.2.0", + "shasum": "5edfe868a1c9c66b20dbd3554a84206f374666b2" + }, + "uid": "mollie-3400823", + "extra": { + "drupal": { + "version": "2.2.0", + "datestamp": "1699622085", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + } + }, + { + "version": "2.1.4", + "version_normalized": "2.1.4.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/mollie.git", + "reference": "2.1.4" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/mollie-2.1.4.zip", + "reference": "2.1.4", + "shasum": "ead8957d3a5c33ee10faccbb4dec3d374008dfb9" + }, + "uid": "mollie-3232168", + "extra": { + "drupal": { + "version": "2.1.4", + "datestamp": "1631201996", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + }, + "require": { + "drupal/core": "^8.8 || ^9", + "php": "\u003E=7.3", + "mollie/mollie-api-php": "^2.29.0" + } + }, + { + "version": "2.1.3", + "version_normalized": "2.1.3.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/mollie.git", + "reference": "2.1.3" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/mollie-2.1.3.zip", + "reference": "2.1.3", + "shasum": "01383b7ffcd3463141a15720e4367c100cb7d1b9" + }, + "uid": "mollie-3231988", + "extra": { + "drupal": { + "version": "2.1.3", + "datestamp": "1631124341", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + } + }, + { + "version": "2.1.2", + "version_normalized": "2.1.2.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/mollie.git", + "reference": "2.1.2" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/mollie-2.1.2.zip", + "reference": "2.1.2", + "shasum": "b22b6e1210d3026c34149cb667e9b127cab15db0" + }, + "uid": "mollie-3227899", + "extra": { + "drupal": { + "version": "2.1.2", + "datestamp": "1628782185", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + } + }, + { + "version": "2.1.1", + "version_normalized": "2.1.1.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/mollie.git", + "reference": "2.1.1" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/mollie-2.1.1.zip", + "reference": "2.1.1", + "shasum": "47bcc40819b3880d942c4b02284bcd2b287c403f" + }, + "uid": "mollie-3226406", + "extra": { + "drupal": { + "version": "2.1.1", + "datestamp": "1628782217", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + } + }, + { + "version": "2.1.0", + "version_normalized": "2.1.0.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/mollie.git", + "reference": "2.1.0" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/mollie-2.1.0.zip", + "reference": "2.1.0", + "shasum": "2ecb1d32d0524071ca9df92b2a64f2ea957d512f" + }, + "uid": "mollie-3225628", + "extra": { + "drupal": { + "version": "2.1.0", + "datestamp": "1627464377", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + } + }, + { + "version": "2.0.0", + "version_normalized": "2.0.0.0", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/mollie.git", + "reference": "2.0.0" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/mollie-2.0.0.zip", + "reference": "2.0.0", + "shasum": "9ad2099d07aeb940d397867c43065ed7ee622219" + }, + "uid": "mollie-3206665", + "extra": { + "drupal": { + "version": "2.0.0", + "datestamp": "1617221948", + "security-coverage": { + "status": "covered", + "message": "Covered by Drupal's security advisory policy" + } + } + } + }, + { + "version": "1.0.0-rc1", + "version_normalized": "1.0.0.0-RC1", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/mollie.git", + "reference": "8.x-1.0-rc1" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/mollie-8.x-1.0-rc1.zip", + "reference": "8.x-1.0-rc1", + "shasum": "e088b834c796cf1aa142b5ee24b1cf8aa098b236" + }, + "uid": "mollie-3195582", + "extra": { + "drupal": { + "version": "8.x-1.0-rc1", + "datestamp": "1612017294", + "security-coverage": { + "status": "not-covered", + "message": "RC releases are not covered by Drupal security advisories." + } + } + }, + "require-dev": { + "drupal/webform": "*", + "drupal/uc_payment": "*", + "drupal/commerce_payment": "*" + }, + "require": { + "drupal/core": "^8.8 || ^9", + "php": "\u003E=7.2", + "mollie/mollie-api-php": "^2.29.0" + }, + "suggest": "__unset", + "conflict": "__unset" + }, + { + "version": "1.0.0-beta1", + "version_normalized": "1.0.0.0-beta1", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/mollie.git", + "reference": "8.x-1.0-beta1" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/mollie-8.x-1.0-beta1.zip", + "reference": "8.x-1.0-beta1", + "shasum": "7eb22ab8c541940995c6a9ff002fe044564ea50a" + }, + "uid": "mollie-3085503", + "extra": { + "drupal": { + "version": "8.x-1.0-beta1", + "datestamp": "1570111683", + "security-coverage": { + "status": "not-covered", + "message": "Beta releases are not covered by Drupal security advisories." + } + } + }, + "require-dev": { + "drupal/uc_payment": "*", + "drupal/commerce_payment": "*" + }, + "require": { + "php": "\u003E=7.2", + "mollie/mollie-api-php": "^2.6", + "drupal/core": "~8.0" + } + }, + { + "version": "1.0.0-alpha1", + "version_normalized": "1.0.0.0-alpha1", + "source": { + "type": "git", + "url": "https://git.drupalcode.org/project/mollie.git", + "reference": "8.x-1.0-alpha1" + }, + "dist": { + "type": "zip", + "url": "https://ftp.drupal.org/files/projects/mollie-8.x-1.0-alpha1.zip", + "reference": "8.x-1.0-alpha1", + "shasum": "7a6d9894bcb37f54f660ed831495701b9312d9f5" + }, + "uid": "mollie-3084735", + "extra": { + "drupal": { + "version": "8.x-1.0-alpha1", + "datestamp": "1570111683", + "security-coverage": { + "status": "not-covered", + "message": "Alpha releases are not covered by Drupal security advisories." + } + } + }, + "require-dev": { + "drupal/commerce_payment": "*" + } + } + ] + }, + "minified": "composer/2.0", + "security-advisories": [ + { + "advisoryId": "SA-CONTRIB-2023-052", + "packageName": "drupal/mollie", + "title": "Mollie for Drupal - Moderately critical - Faulty payment confirmation logic - SA-CONTRIB-2023-052", + "link": "https://www.drupal.org/sa-contrib-2023-052", + "cve": null, + "affectedVersions": "\u003C2.2.1", + "reportedAt": "2023-11-15 14:24:12", + "composerRepository": "http://packages.drupal.org/8/", + "sources": [ + { + "name": "Mollie for Drupal - Moderately critical - Faulty payment confirmation logic - SA-CONTRIB-2023-052", + "remoteId": "SA-CONTRIB-2023-052" + } + ] + } + ] + } diff --git a/src/test/resources/unit/tasks/repositories/https---packages.drupal.org-packages.json b/src/test/resources/unit/tasks/repositories/https---packages.drupal.org-packages.json new file mode 100644 index 0000000000..24f42a21bb --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---packages.drupal.org-packages.json @@ -0,0 +1,14 @@ +{ + "notify-batch": "/8/downloads", + "metadata-url": "/files/packages/8/p2/%package%.json", + "available-package-patterns": [ + "drupal/*" + ], + "search": "/8/search.json?s=%query%", + "warning": "Drupal.org packages ARE NO LONGER AVAILABLE FOR COMPOSER 1!!! Composer 1 is NOT supported. You should upgrade to Composer 2 now! See https://www.drupal.org/drupalorg/blog/ending-packagesdrupalorg-support-for-composer-1", + "warning-versions": "\u003C1.99", + "security-advisories": { + "metadata": true, + "api-url": "https://packages.drupal.org/8/security-advisories" + } + } \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---repo.empty.org-packages.json b/src/test/resources/unit/tasks/repositories/https---repo.empty.org-packages.json new file mode 100644 index 0000000000..a5ccdb4ba5 --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---repo.empty.org-packages.json @@ -0,0 +1,69 @@ +{ + "packages": [], + "notify-batch": "https:\/\/packagist.org\/downloads\/", + "providers-url": "\/p\/%package%$%hash%.json", + "metadata-url": "\/p2\/%package%.json", + "metadata-changes-url": "https:\/\/packagist.org\/metadata\/changes.json", + "search": "https:\/\/packagist.org\/search.json?q=%query%&type=%type%", + "list": "https:\/\/packagist.org\/packages\/list.json", + "security-advisories": { + "metadata": true, + "api-url": "https:\/\/packagist.org\/api\/security-advisories\/" + }, + "providers-api": "https:\/\/packagist.org\/providers\/%package%.json", + "warning": "Support for Composer 1 will be shutdown on August 1st 2025. You should upgrade to Composer 2. See https:\/\/blog.packagist.com\/shutting-down-packagist-org-support-for-composer-1-x\/", + "warning-versions": "<1.99", + "provider-includes": { + "p\/provider-2013$%hash%.json": { + "sha256": "c8f66b919e1bc413cf539ae5e1c3641aaa7201bb35236028083b6a29db54819f" + }, + "p\/provider-2014$%hash%.json": { + "sha256": "94ebaab6c9615b692bcd554dc13706cc5031b9a9627638bab9946fcbc9bf08a1" + }, + "p\/provider-2015$%hash%.json": { + "sha256": "2b1532a5da804f7436f2b3149e48dd759749d9f22ac96e3eefba8937a8b107b5" + }, + "p\/provider-2016$%hash%.json": { + "sha256": "5dc2ed83294c0276fb6fb5a8b4c54b352a2c2b47d6fbfb23aa1b4aa609582008" + }, + "p\/provider-2017$%hash%.json": { + "sha256": "ff924ce644237ec99649173d2c4837302c592a55d60da597c73ed242918be50d" + }, + "p\/provider-2018$%hash%.json": { + "sha256": "56e61c2baea4a692b533dba5b6886f654a3c3545e96463c6e4133073a829e7fa" + }, + "p\/provider-2019$%hash%.json": { + "sha256": "c262cdac424514f851f81246c8e0903ef7186ab6512bb4839b65a7ac8652d0b9" + }, + "p\/provider-2020$%hash%.json": { + "sha256": "3a86d50c668a7d53edffcdef112844a35436e914f8a7753a3e5f8d6c7b1dce4e" + }, + "p\/provider-2021$%hash%.json": { + "sha256": "b692808b8deebd71a240b47a75cc7e574dcb4c12716576cdb5d747341cc334af" + }, + "p\/provider-2022$%hash%.json": { + "sha256": "0accffd503220a2214fa75043b0a05dc50faea35dd8fe49a6bcf78abfa2a7c30" + }, + "p\/provider-2023$%hash%.json": { + "sha256": "fe0ecb56d5a8115fc2e1458d1b98a3b4d51d04f9e865919783e0be6651b7b251" + }, + "p\/provider-2024-01$%hash%.json": { + "sha256": "b38bb9babb5f7cdc083fe8e37bbef94742af7e9781f3ab9e576de08c5f605f84" + }, + "p\/provider-2024-04$%hash%.json": { + "sha256": "cabad2053691f922e76c894efac5ea6088afb58bd4ea648e71773d48260e51b1" + }, + "p\/provider-2024-07$%hash%.json": { + "sha256": "af17a240b260e3e701f5e6a1f5f90f2f492c8bc48105eaac4fc2a56e77fd2701" + }, + "p\/provider-2024-10$%hash%.json": { + "sha256": "7d947c5ebdcf0d5344611c49735ae7ca4a7e695526a85360a63273c83f8cc06f" + }, + "p\/provider-archived$%hash%.json": { + "sha256": "0c2739922be632b3788c5bddb8f33e90de9697641fe11f888a43afbad106457c" + }, + "p\/provider-latest$%hash%.json": { + "sha256": "6fe454899c10d7cc91d7aef76fb2f0c50dcc59f81882caa38b8be00c6b8717b8" + } + } +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-p-magento-adobe-ims.json b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-p-magento-adobe-ims.json deleted file mode 100644 index 788f1dc424..0000000000 --- a/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-p-magento-adobe-ims.json +++ /dev/null @@ -1 +0,0 @@ -{"packages":{"outeredge/edge-magento-module-base":{"3.0.1":{"name":"outeredge/edge-magento-module-base","description":"Magento Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.1","version_normalized":"3.0.1.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"b247ecca6426758e7c9a959c3762fa3e0c5d314d"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/b247ecca6426758e7c9a959c3762fa3e0c5d314d","type":"zip","shasum":"","reference":"b247ecca6426758e7c9a959c3762fa3e0c5d314d"},"type":"magento2-module","time":"2022-05-23T09:23:56+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0.0","outeredge/magento-layout-module":"^3.2.0","outeredge/googlecloudstorage":"^1.2.0.17","outeredge/magento-bulk-actions":"^1.0.0"},"require-dev":{"magento-ecg/coding-standard":"~3.0","outeredge/coding-standards":"~1.0.0","squizlabs/php_codesniffer":"^3.0","elgentos/masquerade":"^0.3.5"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-marketplace":"*","magento/module-multishipping":"*","magento/module-new-relic-reporting":"*","magento/module-payment-graph-ql":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6270246},"3.0.10":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.10","version_normalized":"3.0.10.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"fc5ccb58e835ff623a9f2644f261c7f493e759a3"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/fc5ccb58e835ff623a9f2644f261c7f493e759a3","type":"zip","shasum":"","reference":"fc5ccb58e835ff623a9f2644f261c7f493e759a3"},"type":"magento2-module","time":"2022-07-13T14:56:53+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":"~2.4.3","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6416589},"3.0.11":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.11","version_normalized":"3.0.11.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"b4c4973ad7e3ef9cff19e9427e8ff19eba8a4198"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/b4c4973ad7e3ef9cff19e9427e8ff19eba8a4198","type":"zip","shasum":"","reference":"b4c4973ad7e3ef9cff19e9427e8ff19eba8a4198"},"type":"magento2-module","time":"2022-07-14T23:53:38+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6420651},"3.0.12":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.12","version_normalized":"3.0.12.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"529df544708e5f8cfcd93a70a769b0b5b103e4b0"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/529df544708e5f8cfcd93a70a769b0b5b103e4b0","type":"zip","shasum":"","reference":"529df544708e5f8cfcd93a70a769b0b5b103e4b0"},"type":"magento2-module","time":"2022-07-14T23:56:33+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0","magento/product-community-edition":">=2.4.2 <2.4.4"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6420656},"3.0.13":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.13","version_normalized":"3.0.13.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"8d148f58a80ec46929470065c450d1e4bd26c031"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/8d148f58a80ec46929470065c450d1e4bd26c031","type":"zip","shasum":"","reference":"8d148f58a80ec46929470065c450d1e4bd26c031"},"type":"magento2-module","time":"2022-07-28T18:25:02+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6454430},"3.0.14":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.14","version_normalized":"3.0.14.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"83827bf396122785f9eef145d56242fe5b94e9a4"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/83827bf396122785f9eef145d56242fe5b94e9a4","type":"zip","shasum":"","reference":"83827bf396122785f9eef145d56242fe5b94e9a4"},"type":"magento2-module","time":"2022-08-03T16:23:13+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6468835},"3.0.15":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.15","version_normalized":"3.0.15.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"1570189ee9ad3349e0e066792d794b5d4b8aeba0"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/1570189ee9ad3349e0e066792d794b5d4b8aeba0","type":"zip","shasum":"","reference":"1570189ee9ad3349e0e066792d794b5d4b8aeba0"},"type":"magento2-module","time":"2022-09-01T09:41:45+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6531998},"3.0.16":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.16","version_normalized":"3.0.16.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"0c9176061b32dd236356309d1285e2d8c811f59b"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/0c9176061b32dd236356309d1285e2d8c811f59b","type":"zip","shasum":"","reference":"0c9176061b32dd236356309d1285e2d8c811f59b"},"type":"magento2-module","time":"2022-09-01T09:53:20+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6532064},"3.0.17":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.17","version_normalized":"3.0.17.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"945a1c0d5a662e8f0185c5dbb89b30592981b78f"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/945a1c0d5a662e8f0185c5dbb89b30592981b78f","type":"zip","shasum":"","reference":"945a1c0d5a662e8f0185c5dbb89b30592981b78f"},"type":"magento2-module","time":"2022-10-12T11:19:19+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6625027},"3.0.2":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.2","version_normalized":"3.0.2.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"4581a8be23e987156b6635d1ca36194f43d7f9ef"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/4581a8be23e987156b6635d1ca36194f43d7f9ef","type":"zip","shasum":"","reference":"4581a8be23e987156b6635d1ca36194f43d7f9ef"},"type":"magento2-module","time":"2022-05-23T09:47:34+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0.0","outeredge/magento-layout-module":"^3.2.0","outeredge/googlecloudstorage":"^1.2.0.17","outeredge/magento-bulk-actions":"^1.0.0","community-engineering/language-en_gb":"~0.0.10"},"require-dev":{"magento-ecg/coding-standard":"~3.0","outeredge/coding-standards":"~1.0.0","squizlabs/php_codesniffer":"^3.0","elgentos/masquerade":"^0.3.5"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-marketplace":"*","magento/module-multishipping":"*","magento/module-new-relic-reporting":"*","magento/module-payment-graph-ql":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6270403},"3.0.3":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.3","version_normalized":"3.0.3.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"c05f0ae56f16349b8aa5172a0c8adb0f2bc4ba53"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/c05f0ae56f16349b8aa5172a0c8adb0f2bc4ba53","type":"zip","shasum":"","reference":"c05f0ae56f16349b8aa5172a0c8adb0f2bc4ba53"},"type":"magento2-module","time":"2022-05-23T17:24:09+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0.0","outeredge/magento-layout-module":"^3.2.0","outeredge/googlecloudstorage":"^1.2.0.17","outeredge/magento-bulk-actions":"^1.0.0","community-engineering/language-en_gb":"~0.0.10"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-payment-graph-ql":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6271730},"3.0.4":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.4","version_normalized":"3.0.4.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"b30fb3bbf9ae006f5915701df4f0532633f8c1ca"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/b30fb3bbf9ae006f5915701df4f0532633f8c1ca","type":"zip","shasum":"","reference":"b30fb3bbf9ae006f5915701df4f0532633f8c1ca"},"type":"magento2-module","time":"2022-05-23T18:00:12+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","community-engineering/language-en_gb":"~0.0.10"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6271773},"3.0.5":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.5","version_normalized":"3.0.5.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"01406e373149ac0125d18baa30cee479d34f7a76"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/01406e373149ac0125d18baa30cee479d34f7a76","type":"zip","shasum":"","reference":"01406e373149ac0125d18baa30cee479d34f7a76"},"type":"magento2-module","time":"2022-05-23T18:31:47+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","community-engineering/language-en_gb":"~0.0.10"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6271872},"3.0.6":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.6","version_normalized":"3.0.6.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"8fba889eeb0021412d63d2fc5a475a9eace53f36"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/8fba889eeb0021412d63d2fc5a475a9eace53f36","type":"zip","shasum":"","reference":"8fba889eeb0021412d63d2fc5a475a9eace53f36"},"type":"magento2-module","time":"2022-05-24T14:33:10+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6275005},"3.0.7":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.7","version_normalized":"3.0.7.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"13a8e6563f594bbe77ad25a3faef2f846296c24a"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/13a8e6563f594bbe77ad25a3faef2f846296c24a","type":"zip","shasum":"","reference":"13a8e6563f594bbe77ad25a3faef2f846296c24a"},"type":"magento2-module","time":"2022-05-24T14:39:52+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6275188},"3.0.8":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.8","version_normalized":"3.0.8.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"52e532b103542ab4df9a3b16a3e7ec963e5338cd"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/52e532b103542ab4df9a3b16a3e7ec963e5338cd","type":"zip","shasum":"","reference":"52e532b103542ab4df9a3b16a3e7ec963e5338cd"},"type":"magento2-module","time":"2022-05-25T10:37:31+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6277639},"3.0.9":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.9","version_normalized":"3.0.9.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"8572773d6c8a3a7b242f3472c8a2725e407cbbe2"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/8572773d6c8a3a7b242f3472c8a2725e407cbbe2","type":"zip","shasum":"","reference":"8572773d6c8a3a7b242f3472c8a2725e407cbbe2"},"type":"magento2-module","time":"2022-06-22T14:07:13+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":"~2.4.3","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6362285},"3.1.0":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.0","version_normalized":"3.1.0.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"c0a332fff55035fe69e5feab7d82d9a0fedb90f3"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/c0a332fff55035fe69e5feab7d82d9a0fedb90f3","type":"zip","shasum":"","reference":"c0a332fff55035fe69e5feab7d82d9a0fedb90f3"},"type":"magento2-module","time":"2022-09-21T10:07:38+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6575743},"3.1.1":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.1","version_normalized":"3.1.1.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"070deb2403a863084126f4b63e4e9cba46ec78d5"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/070deb2403a863084126f4b63e4e9cba46ec78d5","type":"zip","shasum":"","reference":"070deb2403a863084126f4b63e4e9cba46ec78d5"},"type":"magento2-module","time":"2022-10-12T11:18:49+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6625030},"3.1.2":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.2","version_normalized":"3.1.2.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f22909ca09345a6d3ec74ec53686e91c028fa15b"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f22909ca09345a6d3ec74ec53686e91c028fa15b","type":"zip","shasum":"","reference":"f22909ca09345a6d3ec74ec53686e91c028fa15b"},"type":"magento2-module","time":"2022-10-12T12:06:31+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6625108},"3.1.3":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.3","version_normalized":"3.1.3.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"cf8d843104d803b9ff0f9a7b122ffa6d58bbc5d1"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/cf8d843104d803b9ff0f9a7b122ffa6d58bbc5d1","type":"zip","shasum":"","reference":"cf8d843104d803b9ff0f9a7b122ffa6d58bbc5d1"},"type":"magento2-module","time":"2022-10-13T09:35:28+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6627778},"3.1.4":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.4","version_normalized":"3.1.4.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f94b7997e82547979208ac2a75331562d25de0f2"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f94b7997e82547979208ac2a75331562d25de0f2","type":"zip","shasum":"","reference":"f94b7997e82547979208ac2a75331562d25de0f2"},"type":"magento2-module","time":"2022-10-17T09:58:11+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6636004},"3.1.x-dev":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.x-dev","version_normalized":"3.1.9999999.9999999-dev","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f94b7997e82547979208ac2a75331562d25de0f2"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f94b7997e82547979208ac2a75331562d25de0f2","type":"zip","shasum":"","reference":"f94b7997e82547979208ac2a75331562d25de0f2"},"type":"magento2-module","time":"2022-10-17T09:58:11+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6625018},"4.0.0":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.0","version_normalized":"4.0.0.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"94856cf2471bb223e7cfc48d45e39704936ca129"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/94856cf2471bb223e7cfc48d45e39704936ca129","type":"zip","shasum":"","reference":"94856cf2471bb223e7cfc48d45e39704936ca129"},"type":"magento2-module","time":"2022-05-27T18:16:32+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6287716},"4.0.1":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.1","version_normalized":"4.0.1.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f0f88bfb4a1f5982dd7015652f6e79001525b4d8"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f0f88bfb4a1f5982dd7015652f6e79001525b4d8","type":"zip","shasum":"","reference":"f0f88bfb4a1f5982dd7015652f6e79001525b4d8"},"type":"magento2-module","time":"2022-06-16T17:01:14+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6345375},"4.0.10":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.10","version_normalized":"4.0.10.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"adf2b9a0b72a57821ac847459ff2e9266b15240d"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/adf2b9a0b72a57821ac847459ff2e9266b15240d","type":"zip","shasum":"","reference":"adf2b9a0b72a57821ac847459ff2e9266b15240d"},"type":"magento2-module","time":"2022-10-12T11:08:14+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6625032},"4.0.11":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.11","version_normalized":"4.0.11.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"05f0e8d59fab66b229eb58bedd598e6a9f20ce96"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/05f0e8d59fab66b229eb58bedd598e6a9f20ce96","type":"zip","shasum":"","reference":"05f0e8d59fab66b229eb58bedd598e6a9f20ce96"},"type":"magento2-module","time":"2022-10-12T12:05:45+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6625111},"4.0.12":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.12","version_normalized":"4.0.12.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"05f05c3a0d666040b5f37cbd6f6dedc228a56575"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/05f05c3a0d666040b5f37cbd6f6dedc228a56575","type":"zip","shasum":"","reference":"05f05c3a0d666040b5f37cbd6f6dedc228a56575"},"type":"magento2-module","time":"2022-10-13T08:35:40+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6627780},"4.0.13":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.13","version_normalized":"4.0.13.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f775216245795130287645e8115f12570369e204"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f775216245795130287645e8115f12570369e204","type":"zip","shasum":"","reference":"f775216245795130287645e8115f12570369e204"},"type":"magento2-module","time":"2022-10-18T11:46:29+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6639444},"4.0.14":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.14","version_normalized":"4.0.14.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"cc929eb890e8281021d1dcdb013e3fb9645e1f04"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/cc929eb890e8281021d1dcdb013e3fb9645e1f04","type":"zip","shasum":"","reference":"cc929eb890e8281021d1dcdb013e3fb9645e1f04"},"type":"magento2-module","time":"2022-11-30T11:03:08+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6747953},"4.0.2":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.2","version_normalized":"4.0.2.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"07e20b4e2a8f41ffd82d7e8b706f7d5993eb9690"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/07e20b4e2a8f41ffd82d7e8b706f7d5993eb9690","type":"zip","shasum":"","reference":"07e20b4e2a8f41ffd82d7e8b706f7d5993eb9690"},"type":"magento2-module","time":"2022-06-17T13:46:22+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6347669},"4.0.3":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.3","version_normalized":"4.0.3.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"ee4a00632b20ce1e1c0250a5198bed5837595d2a"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/ee4a00632b20ce1e1c0250a5198bed5837595d2a","type":"zip","shasum":"","reference":"ee4a00632b20ce1e1c0250a5198bed5837595d2a"},"type":"magento2-module","time":"2022-06-22T14:05:24+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6362280},"4.0.4":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.4","version_normalized":"4.0.4.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f44f19e59d4c1c4be4786e236e31d8697a1ee37c"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f44f19e59d4c1c4be4786e236e31d8697a1ee37c","type":"zip","shasum":"","reference":"f44f19e59d4c1c4be4786e236e31d8697a1ee37c"},"type":"magento2-module","time":"2022-07-13T14:56:22+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6416591},"4.0.5":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.5","version_normalized":"4.0.5.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"75b19b4ff96678a6877402783022d776bfb1bb81"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/75b19b4ff96678a6877402783022d776bfb1bb81","type":"zip","shasum":"","reference":"75b19b4ff96678a6877402783022d776bfb1bb81"},"type":"magento2-module","time":"2022-07-14T19:23:28+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6420653},"4.0.6":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.6","version_normalized":"4.0.6.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"fd977a9c5ea20bcdd6ad5635a09bba18ac5a24b8"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/fd977a9c5ea20bcdd6ad5635a09bba18ac5a24b8","type":"zip","shasum":"","reference":"fd977a9c5ea20bcdd6ad5635a09bba18ac5a24b8"},"type":"magento2-module","time":"2022-07-28T18:24:15+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6454432},"4.0.7":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.7","version_normalized":"4.0.7.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"a93c843c17108e7980053394a94546baac070ed4"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/a93c843c17108e7980053394a94546baac070ed4","type":"zip","shasum":"","reference":"a93c843c17108e7980053394a94546baac070ed4"},"type":"magento2-module","time":"2022-08-03T16:19:07+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6508061},"4.0.8":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.8","version_normalized":"4.0.8.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"779e035494ae41c3f33a2fcc10b293283f006a58"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/779e035494ae41c3f33a2fcc10b293283f006a58","type":"zip","shasum":"","reference":"779e035494ae41c3f33a2fcc10b293283f006a58"},"type":"magento2-module","time":"2022-09-01T09:39:15+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6532003},"4.0.9":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.9","version_normalized":"4.0.9.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"924818d0bf7a67f2f690aa6704e3898d54885a65"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/924818d0bf7a67f2f690aa6704e3898d54885a65","type":"zip","shasum":"","reference":"924818d0bf7a67f2f690aa6704e3898d54885a65"},"type":"magento2-module","time":"2022-09-01T09:52:27+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"abandoned":"outeredge/magento-base-module","uid":6532070},"dev-fix-order-email-issue":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"dev-fix-order-email-issue","version_normalized":"dev-fix-order-email-issue","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"1bad8088c309a926d11e40ac97ccc0d69410d579"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/1bad8088c309a926d11e40ac97ccc0d69410d579","type":"zip","shasum":"","reference":"1bad8088c309a926d11e40ac97ccc0d69410d579"},"type":"magento2-module","time":"2022-11-30T10:59:32+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6747935},"dev-master":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"dev-master","version_normalized":"9999999-dev","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"cc929eb890e8281021d1dcdb013e3fb9645e1f04"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/cc929eb890e8281021d1dcdb013e3fb9645e1f04","type":"zip","shasum":"","reference":"cc929eb890e8281021d1dcdb013e3fb9645e1f04"},"type":"magento2-module","time":"2022-11-30T11:03:08+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"default-branch":true,"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0","magento/product-community-edition":">=2.4.4"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-send-friend-graph-ql":"*","magento/module-page-builder-admin-analytics":"*","magento/module-catalog-page-builder-analytics":"*"},"abandoned":"outeredge/magento-base-module","uid":5362905},"dev-mute-migrate":{"name":"outeredge/edge-magento-module-base","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"dev-mute-migrate","version_normalized":"dev-mute-migrate","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"551872daf8fcbb4c3d32d4ec3f12d31e1c1407bc"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/551872daf8fcbb4c3d32d4ec3f12d31e1c1407bc","type":"zip","shasum":"","reference":"551872daf8fcbb4c3d32d4ec3f12d31e1c1407bc"},"type":"magento2-module","time":"2022-10-18T11:42:11+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"abandoned":"outeredge/magento-base-module","uid":6639425}},"outeredge/magento-base-module":{"3.0.1":{"name":"outeredge/magento-base-module","description":"Magento Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.1","version_normalized":"3.0.1.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"b247ecca6426758e7c9a959c3762fa3e0c5d314d"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/b247ecca6426758e7c9a959c3762fa3e0c5d314d","type":"zip","shasum":"","reference":"b247ecca6426758e7c9a959c3762fa3e0c5d314d"},"type":"magento2-module","time":"2022-05-23T09:23:56+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0.0","outeredge/magento-layout-module":"^3.2.0","outeredge/googlecloudstorage":"^1.2.0.17","outeredge/magento-bulk-actions":"^1.0.0"},"require-dev":{"magento-ecg/coding-standard":"~3.0","outeredge/coding-standards":"~1.0.0","squizlabs/php_codesniffer":"^3.0","elgentos/masquerade":"^0.3.5"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-marketplace":"*","magento/module-multishipping":"*","magento/module-new-relic-reporting":"*","magento/module-payment-graph-ql":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6270247},"3.0.10":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.10","version_normalized":"3.0.10.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"fc5ccb58e835ff623a9f2644f261c7f493e759a3"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/fc5ccb58e835ff623a9f2644f261c7f493e759a3","type":"zip","shasum":"","reference":"fc5ccb58e835ff623a9f2644f261c7f493e759a3"},"type":"magento2-module","time":"2022-07-13T14:56:53+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":"~2.4.3","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6416588},"3.0.11":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.11","version_normalized":"3.0.11.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"b4c4973ad7e3ef9cff19e9427e8ff19eba8a4198"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/b4c4973ad7e3ef9cff19e9427e8ff19eba8a4198","type":"zip","shasum":"","reference":"b4c4973ad7e3ef9cff19e9427e8ff19eba8a4198"},"type":"magento2-module","time":"2022-07-14T23:53:38+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6420650},"3.0.12":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.12","version_normalized":"3.0.12.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"529df544708e5f8cfcd93a70a769b0b5b103e4b0"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/529df544708e5f8cfcd93a70a769b0b5b103e4b0","type":"zip","shasum":"","reference":"529df544708e5f8cfcd93a70a769b0b5b103e4b0"},"type":"magento2-module","time":"2022-07-14T23:56:33+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0","magento/product-community-edition":">=2.4.2 <2.4.4"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6420657},"3.0.13":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.13","version_normalized":"3.0.13.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"8d148f58a80ec46929470065c450d1e4bd26c031"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/8d148f58a80ec46929470065c450d1e4bd26c031","type":"zip","shasum":"","reference":"8d148f58a80ec46929470065c450d1e4bd26c031"},"type":"magento2-module","time":"2022-07-28T18:25:02+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6454431},"3.0.14":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.14","version_normalized":"3.0.14.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"83827bf396122785f9eef145d56242fe5b94e9a4"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/83827bf396122785f9eef145d56242fe5b94e9a4","type":"zip","shasum":"","reference":"83827bf396122785f9eef145d56242fe5b94e9a4"},"type":"magento2-module","time":"2022-08-03T16:23:13+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6468834},"3.0.15":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.15","version_normalized":"3.0.15.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"1570189ee9ad3349e0e066792d794b5d4b8aeba0"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/1570189ee9ad3349e0e066792d794b5d4b8aeba0","type":"zip","shasum":"","reference":"1570189ee9ad3349e0e066792d794b5d4b8aeba0"},"type":"magento2-module","time":"2022-09-01T09:41:45+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6531997},"3.0.16":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.16","version_normalized":"3.0.16.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"0c9176061b32dd236356309d1285e2d8c811f59b"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/0c9176061b32dd236356309d1285e2d8c811f59b","type":"zip","shasum":"","reference":"0c9176061b32dd236356309d1285e2d8c811f59b"},"type":"magento2-module","time":"2022-09-01T09:53:20+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6532065},"3.0.17":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.17","version_normalized":"3.0.17.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"945a1c0d5a662e8f0185c5dbb89b30592981b78f"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/945a1c0d5a662e8f0185c5dbb89b30592981b78f","type":"zip","shasum":"","reference":"945a1c0d5a662e8f0185c5dbb89b30592981b78f"},"type":"magento2-module","time":"2022-10-12T11:19:19+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6625028},"3.0.2":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.2","version_normalized":"3.0.2.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"4581a8be23e987156b6635d1ca36194f43d7f9ef"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/4581a8be23e987156b6635d1ca36194f43d7f9ef","type":"zip","shasum":"","reference":"4581a8be23e987156b6635d1ca36194f43d7f9ef"},"type":"magento2-module","time":"2022-05-23T09:47:34+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0.0","outeredge/magento-layout-module":"^3.2.0","outeredge/googlecloudstorage":"^1.2.0.17","outeredge/magento-bulk-actions":"^1.0.0","community-engineering/language-en_gb":"~0.0.10"},"require-dev":{"magento-ecg/coding-standard":"~3.0","outeredge/coding-standards":"~1.0.0","squizlabs/php_codesniffer":"^3.0","elgentos/masquerade":"^0.3.5"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-marketplace":"*","magento/module-multishipping":"*","magento/module-new-relic-reporting":"*","magento/module-payment-graph-ql":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6270402},"3.0.3":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.3","version_normalized":"3.0.3.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"c05f0ae56f16349b8aa5172a0c8adb0f2bc4ba53"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/c05f0ae56f16349b8aa5172a0c8adb0f2bc4ba53","type":"zip","shasum":"","reference":"c05f0ae56f16349b8aa5172a0c8adb0f2bc4ba53"},"type":"magento2-module","time":"2022-05-23T17:24:09+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0.0","outeredge/magento-layout-module":"^3.2.0","outeredge/googlecloudstorage":"^1.2.0.17","outeredge/magento-bulk-actions":"^1.0.0","community-engineering/language-en_gb":"~0.0.10"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-payment-graph-ql":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6271729},"3.0.4":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.4","version_normalized":"3.0.4.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"b30fb3bbf9ae006f5915701df4f0532633f8c1ca"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/b30fb3bbf9ae006f5915701df4f0532633f8c1ca","type":"zip","shasum":"","reference":"b30fb3bbf9ae006f5915701df4f0532633f8c1ca"},"type":"magento2-module","time":"2022-05-23T18:00:12+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","community-engineering/language-en_gb":"~0.0.10"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6271772},"3.0.5":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.5","version_normalized":"3.0.5.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"01406e373149ac0125d18baa30cee479d34f7a76"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/01406e373149ac0125d18baa30cee479d34f7a76","type":"zip","shasum":"","reference":"01406e373149ac0125d18baa30cee479d34f7a76"},"type":"magento2-module","time":"2022-05-23T18:31:47+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","community-engineering/language-en_gb":"~0.0.10"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6271871},"3.0.6":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.6","version_normalized":"3.0.6.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"8fba889eeb0021412d63d2fc5a475a9eace53f36"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/8fba889eeb0021412d63d2fc5a475a9eace53f36","type":"zip","shasum":"","reference":"8fba889eeb0021412d63d2fc5a475a9eace53f36"},"type":"magento2-module","time":"2022-05-24T14:33:10+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6275006},"3.0.7":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.7","version_normalized":"3.0.7.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"13a8e6563f594bbe77ad25a3faef2f846296c24a"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/13a8e6563f594bbe77ad25a3faef2f846296c24a","type":"zip","shasum":"","reference":"13a8e6563f594bbe77ad25a3faef2f846296c24a"},"type":"magento2-module","time":"2022-05-24T14:39:52+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"yireo/magento2-replace-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-dhl":"*","magento/module-fedex":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-ups":"*","magento/module-usps":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6275187},"3.0.8":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.8","version_normalized":"3.0.8.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"52e532b103542ab4df9a3b16a3e7ec963e5338cd"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/52e532b103542ab4df9a3b16a3e7ec963e5338cd","type":"zip","shasum":"","reference":"52e532b103542ab4df9a3b16a3e7ec963e5338cd"},"type":"magento2-module","time":"2022-05-25T10:37:31+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6277638},"3.0.9":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.0.9","version_normalized":"3.0.9.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"8572773d6c8a3a7b242f3472c8a2725e407cbbe2"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/8572773d6c8a3a7b242f3472c8a2725e407cbbe2","type":"zip","shasum":"","reference":"8572773d6c8a3a7b242f3472c8a2725e407cbbe2"},"type":"magento2-module","time":"2022-06-22T14:07:13+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":"~2.4.3","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6362286},"3.1.0":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.0","version_normalized":"3.1.0.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"c0a332fff55035fe69e5feab7d82d9a0fedb90f3"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/c0a332fff55035fe69e5feab7d82d9a0fedb90f3","type":"zip","shasum":"","reference":"c0a332fff55035fe69e5feab7d82d9a0fedb90f3"},"type":"magento2-module","time":"2022-09-21T10:07:38+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6575742},"3.1.1":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.1","version_normalized":"3.1.1.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"070deb2403a863084126f4b63e4e9cba46ec78d5"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/070deb2403a863084126f4b63e4e9cba46ec78d5","type":"zip","shasum":"","reference":"070deb2403a863084126f4b63e4e9cba46ec78d5"},"type":"magento2-module","time":"2022-10-12T11:18:49+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6625029},"3.1.2":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.2","version_normalized":"3.1.2.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f22909ca09345a6d3ec74ec53686e91c028fa15b"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f22909ca09345a6d3ec74ec53686e91c028fa15b","type":"zip","shasum":"","reference":"f22909ca09345a6d3ec74ec53686e91c028fa15b"},"type":"magento2-module","time":"2022-10-12T12:06:31+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6625109},"3.1.3":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.3","version_normalized":"3.1.3.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"cf8d843104d803b9ff0f9a7b122ffa6d58bbc5d1"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/cf8d843104d803b9ff0f9a7b122ffa6d58bbc5d1","type":"zip","shasum":"","reference":"cf8d843104d803b9ff0f9a7b122ffa6d58bbc5d1"},"type":"magento2-module","time":"2022-10-13T09:35:28+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6627777},"3.1.4":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.4","version_normalized":"3.1.4.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f94b7997e82547979208ac2a75331562d25de0f2"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f94b7997e82547979208ac2a75331562d25de0f2","type":"zip","shasum":"","reference":"f94b7997e82547979208ac2a75331562d25de0f2"},"type":"magento2-module","time":"2022-10-17T09:58:11+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6636003},"3.1.x-dev":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"3.1.x-dev","version_normalized":"3.1.9999999.9999999-dev","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f94b7997e82547979208ac2a75331562d25de0f2"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f94b7997e82547979208ac2a75331562d25de0f2","type":"zip","shasum":"","reference":"f94b7997e82547979208ac2a75331562d25de0f2"},"type":"magento2-module","time":"2022-10-17T09:58:11+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.2 <2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6625019},"4.0.0":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.0","version_normalized":"4.0.0.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"94856cf2471bb223e7cfc48d45e39704936ca129"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/94856cf2471bb223e7cfc48d45e39704936ca129","type":"zip","shasum":"","reference":"94856cf2471bb223e7cfc48d45e39704936ca129"},"type":"magento2-module","time":"2022-05-27T18:16:32+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6287715},"4.0.1":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.1","version_normalized":"4.0.1.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f0f88bfb4a1f5982dd7015652f6e79001525b4d8"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f0f88bfb4a1f5982dd7015652f6e79001525b4d8","type":"zip","shasum":"","reference":"f0f88bfb4a1f5982dd7015652f6e79001525b4d8"},"type":"magento2-module","time":"2022-06-16T17:01:14+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-new-relic-reporting":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6345374},"4.0.10":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.10","version_normalized":"4.0.10.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"adf2b9a0b72a57821ac847459ff2e9266b15240d"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/adf2b9a0b72a57821ac847459ff2e9266b15240d","type":"zip","shasum":"","reference":"adf2b9a0b72a57821ac847459ff2e9266b15240d"},"type":"magento2-module","time":"2022-10-12T11:08:14+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6625033},"4.0.11":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.11","version_normalized":"4.0.11.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"05f0e8d59fab66b229eb58bedd598e6a9f20ce96"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/05f0e8d59fab66b229eb58bedd598e6a9f20ce96","type":"zip","shasum":"","reference":"05f0e8d59fab66b229eb58bedd598e6a9f20ce96"},"type":"magento2-module","time":"2022-10-12T12:05:45+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6625112},"4.0.12":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.12","version_normalized":"4.0.12.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"05f05c3a0d666040b5f37cbd6f6dedc228a56575"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/05f05c3a0d666040b5f37cbd6f6dedc228a56575","type":"zip","shasum":"","reference":"05f05c3a0d666040b5f37cbd6f6dedc228a56575"},"type":"magento2-module","time":"2022-10-13T08:35:40+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6627779},"4.0.13":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.13","version_normalized":"4.0.13.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f775216245795130287645e8115f12570369e204"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f775216245795130287645e8115f12570369e204","type":"zip","shasum":"","reference":"f775216245795130287645e8115f12570369e204"},"type":"magento2-module","time":"2022-10-18T11:46:29+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6639445},"4.0.14":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.14","version_normalized":"4.0.14.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"cc929eb890e8281021d1dcdb013e3fb9645e1f04"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/cc929eb890e8281021d1dcdb013e3fb9645e1f04","type":"zip","shasum":"","reference":"cc929eb890e8281021d1dcdb013e3fb9645e1f04"},"type":"magento2-module","time":"2022-11-30T11:03:08+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6747954},"4.0.2":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.2","version_normalized":"4.0.2.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"07e20b4e2a8f41ffd82d7e8b706f7d5993eb9690"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/07e20b4e2a8f41ffd82d7e8b706f7d5993eb9690","type":"zip","shasum":"","reference":"07e20b4e2a8f41ffd82d7e8b706f7d5993eb9690"},"type":"magento2-module","time":"2022-06-17T13:46:22+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6347668},"4.0.3":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.3","version_normalized":"4.0.3.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"ee4a00632b20ce1e1c0250a5198bed5837595d2a"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/ee4a00632b20ce1e1c0250a5198bed5837595d2a","type":"zip","shasum":"","reference":"ee4a00632b20ce1e1c0250a5198bed5837595d2a"},"type":"magento2-module","time":"2022-06-22T14:05:24+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-robots":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6362281},"4.0.4":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.4","version_normalized":"4.0.4.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"f44f19e59d4c1c4be4786e236e31d8697a1ee37c"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/f44f19e59d4c1c4be4786e236e31d8697a1ee37c","type":"zip","shasum":"","reference":"f44f19e59d4c1c4be4786e236e31d8697a1ee37c"},"type":"magento2-module","time":"2022-07-13T14:56:22+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6416590},"4.0.5":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.5","version_normalized":"4.0.5.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"75b19b4ff96678a6877402783022d776bfb1bb81"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/75b19b4ff96678a6877402783022d776bfb1bb81","type":"zip","shasum":"","reference":"75b19b4ff96678a6877402783022d776bfb1bb81"},"type":"magento2-module","time":"2022-07-14T19:23:28+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6420652},"4.0.6":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.6","version_normalized":"4.0.6.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"fd977a9c5ea20bcdd6ad5635a09bba18ac5a24b8"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/fd977a9c5ea20bcdd6ad5635a09bba18ac5a24b8","type":"zip","shasum":"","reference":"fd977a9c5ea20bcdd6ad5635a09bba18ac5a24b8"},"type":"magento2-module","time":"2022-07-28T18:24:15+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6454433},"4.0.7":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.7","version_normalized":"4.0.7.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"a93c843c17108e7980053394a94546baac070ed4"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/a93c843c17108e7980053394a94546baac070ed4","type":"zip","shasum":"","reference":"a93c843c17108e7980053394a94546baac070ed4"},"type":"magento2-module","time":"2022-08-03T16:19:07+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6508060},"4.0.8":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.8","version_normalized":"4.0.8.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"779e035494ae41c3f33a2fcc10b293283f006a58"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/779e035494ae41c3f33a2fcc10b293283f006a58","type":"zip","shasum":"","reference":"779e035494ae41c3f33a2fcc10b293283f006a58"},"type":"magento2-module","time":"2022-09-01T09:39:15+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6532002},"4.0.9":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"4.0.9","version_normalized":"4.0.9.0","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"924818d0bf7a67f2f690aa6704e3898d54885a65"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/924818d0bf7a67f2f690aa6704e3898d54885a65","type":"zip","shasum":"","reference":"924818d0bf7a67f2f690aa6704e3898d54885a65"},"type":"magento2-module","time":"2022-09-01T09:52:27+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","yotpo/magento2-module-yotpo-reviews":"*"},"uid":6532071},"dev-fix-order-email-issue":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"dev-fix-order-email-issue","version_normalized":"dev-fix-order-email-issue","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"1bad8088c309a926d11e40ac97ccc0d69410d579"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/1bad8088c309a926d11e40ac97ccc0d69410d579","type":"zip","shasum":"","reference":"1bad8088c309a926d11e40ac97ccc0d69410d579"},"type":"magento2-module","time":"2022-11-30T10:59:32+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6747936},"dev-master":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"dev-master","version_normalized":"9999999-dev","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"cc929eb890e8281021d1dcdb013e3fb9645e1f04"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/cc929eb890e8281021d1dcdb013e3fb9645e1f04","type":"zip","shasum":"","reference":"cc929eb890e8281021d1dcdb013e3fb9645e1f04"},"type":"magento2-module","time":"2022-11-30T11:03:08+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"default-branch":true,"require":{"outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0","magento/product-community-edition":">=2.4.4"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-send-friend-graph-ql":"*","magento/module-page-builder-admin-analytics":"*","magento/module-catalog-page-builder-analytics":"*"},"uid":4031880},"dev-mute-migrate":{"name":"outeredge/magento-base-module","description":"Magento 2 Base Module by outer/edge","keywords":[],"homepage":"","version":"dev-mute-migrate","version_normalized":"dev-mute-migrate","license":["MIT"],"authors":[{"name":"outer/edge","email":"support@outeredge.agency","homepage":"https://outeredge.agency/","role":"Developer"}],"source":{"url":"https://github.com/outeredge/magento-base-module.git","type":"git","reference":"551872daf8fcbb4c3d32d4ec3f12d31e1c1407bc"},"dist":{"url":"https://api.github.com/repos/outeredge/magento-base-module/zipball/551872daf8fcbb4c3d32d4ec3f12d31e1c1407bc","type":"zip","shasum":"","reference":"551872daf8fcbb4c3d32d4ec3f12d31e1c1407bc"},"type":"magento2-module","time":"2022-10-18T11:42:11+00:00","autoload":{"files":["registration.php"],"psr-4":{"OuterEdge\\Base\\":""}},"require":{"magento/product-community-edition":">=2.4.4","outeredge/magento-limitrole-module":"^1.0","outeredge/magento-layout-module":"^3.2","outeredge/googlecloudstorage":"^2.0","outeredge/magento-bulk-actions":"^1.0","outeredge/magento-language-en_gb-module":"^1.0"},"require-dev":{"outeredge/coding-standards":"^2.0"},"suggest":{"outeredge/magento-disable-graphql":"To remove GraphQL modules when not in use"},"replace":{"magento/adobe-ims":"*","magento/adobe-stock-integration":"*","magento/framework-amqp":"*","magento/google-shopping-ads":"*","magento/language-zh_hans_cn":"*","magento/module-admin-analytics":"*","magento/module-amqp":"*","magento/module-amqp-store":"*","magento/module-analytics":"*","magento/module-catalog-analytics":"*","magento/module-catalog-page-builder-analytics":"*","magento/module-customer-analytics":"*","magento/module-page-builder-admin-analytics":"*","magento/module-page-builder-analytics":"*","magento/module-quote-analytics":"*","magento/module-review-analytics":"*","magento/module-sales-analytics":"*","magento/module-wishlist-analytics":"*","magento/module-google-optimizer":"*","magento/module-inventory-in-store-pickup":"*","magento/module-inventory-in-store-pickup-admin-ui":"*","magento/module-inventory-in-store-pickup-api":"*","magento/module-inventory-in-store-pickup-frontend":"*","magento/module-inventory-in-store-pickup-multishipping":"*","magento/module-inventory-in-store-pickup-quote":"*","magento/module-inventory-in-store-pickup-sales":"*","magento/module-inventory-in-store-pickup-sales-admin-ui":"*","magento/module-inventory-in-store-pickup-sales-api":"*","magento/module-inventory-in-store-pickup-shipping":"*","magento/module-inventory-in-store-pickup-shipping-admin-ui":"*","magento/module-inventory-in-store-pickup-shipping-api":"*","magento/module-inventory-in-store-pickup-webapi-extension":"*","magento/module-inventory-in-store-pickup-graph-ql":"*","magento/module-inventory-in-store-pickup-quote-graph-ql":"*","magento/module-marketplace":"*","magento/module-re-captcha-store-pickup":"*","magento/module-sample-data":"*","magento/module-send-friend":"*","magento/module-send-friend-graph-ql":"*","magento/module-swagger":"*","magento/module-swagger-webapi":"*","magento/module-swagger-webapi-async":"*","magento/module-version":"*","temando/module-shipping-remover":"*"},"uid":6639426}}}} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-p-typo3-class-alias-loader.json b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-p-typo3-class-alias-loader.json deleted file mode 100644 index 357541e169..0000000000 --- a/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-p-typo3-class-alias-loader.json +++ /dev/null @@ -1 +0,0 @@ -{"packages":{"typo3/class-alias-loader":{"1.0.0":{"name":"typo3/class-alias-loader","description":"Amends the composer class loader to support class aliases to provide backwards compatibility for packages","keywords":["autoloader","composer","classloader","alias"],"homepage":"http://github.com/TYPO3/class-alias-loader","version":"1.0.0","version_normalized":"1.0.0.0","license":["MIT"],"authors":[{"name":"Helmut Hummel","email":"info@helhum.io"}],"source":{"type":"git","url":"https://github.com/TYPO3/class-alias-loader.git","reference":"a9dd295c81ed0b51455644be420ab9210cad688f"},"dist":{"type":"zip","url":"https://api.github.com/repos/TYPO3/class-alias-loader/zipball/a9dd295c81ed0b51455644be420ab9210cad688f","reference":"a9dd295c81ed0b51455644be420ab9210cad688f","shasum":""},"type":"composer-plugin","time":"2015-10-06T10:25:44+00:00","autoload":{"psr-4":{"TYPO3\\ClassAliasLoader\\":"src/"}},"extra":{"class":"TYPO3\\ClassAliasLoader\\Plugin","branch-alias":{"dev-master":"1.0.x-dev"}},"require":{"php":">=5.3.7","composer-plugin-api":"^1.0"},"require-dev":{"composer/composer":"dev-master","mikey179/vfsstream":"1.4.*@dev","phpunit/phpunit":"~4.7.0"},"replace":{"helhum/class-alias-loader":"*"},"uid":542554},"1.0.1":{"name":"typo3/class-alias-loader","description":"Amends the composer class loader to support class aliases to provide backwards compatibility for packages","keywords":["autoloader","composer","classloader","alias"],"homepage":"http://github.com/TYPO3/class-alias-loader","version":"1.0.1","version_normalized":"1.0.1.0","license":["MIT"],"authors":[{"name":"Helmut Hummel","email":"info@helhum.io"}],"source":{"type":"git","url":"https://github.com/TYPO3/class-alias-loader.git","reference":"4972f9f6c2bad07ab1620b5c9717fa626e9b03b0"},"dist":{"type":"zip","url":"https://api.github.com/repos/TYPO3/class-alias-loader/zipball/4972f9f6c2bad07ab1620b5c9717fa626e9b03b0","reference":"4972f9f6c2bad07ab1620b5c9717fa626e9b03b0","shasum":""},"type":"composer-plugin","time":"2018-10-03T12:49:56+00:00","autoload":{"psr-4":{"TYPO3\\ClassAliasLoader\\":"src/"}},"extra":{"class":"TYPO3\\ClassAliasLoader\\Plugin","branch-alias":{"dev-master":"1.0.x-dev"}},"require":{"php":">=5.3.7","composer-plugin-api":"^1.0"},"require-dev":{"composer/composer":"dev-master","mikey179/vfsstream":"1.4.*@dev","phpunit/phpunit":"^4.8"},"replace":{"helhum/class-alias-loader":"*"},"uid":2499118},"dev-main":{"name":"typo3/class-alias-loader","description":"Amends the composer class loader to support class aliases to provide backwards compatibility for packages","keywords":["autoloader","composer","classloader","alias"],"homepage":"http://github.com/TYPO3/class-alias-loader","version":"dev-main","version_normalized":"dev-main","license":["MIT"],"authors":[{"name":"Helmut Hummel","email":"info@helhum.io"}],"source":{"type":"git","url":"https://github.com/TYPO3/class-alias-loader.git","reference":"b2a62cf9d474ea4dea8c2e7363fe2aa11959ee9a"},"dist":{"type":"zip","url":"https://api.github.com/repos/TYPO3/class-alias-loader/zipball/b2a62cf9d474ea4dea8c2e7363fe2aa11959ee9a","reference":"b2a62cf9d474ea4dea8c2e7363fe2aa11959ee9a","shasum":""},"type":"composer-plugin","time":"2021-10-24T20:02:39+00:00","autoload":{"psr-4":{"TYPO3\\ClassAliasLoader\\":"src/"}},"extra":{"class":"TYPO3\\ClassAliasLoader\\Plugin","branch-alias":{"dev-main":"1.1.x-dev"}},"default-branch":true,"require":{"php":">=5.3.7","composer-plugin-api":"^1.0 || ^2.0"},"require-dev":{"composer/composer":"^1.1@dev || ^2.0@dev","mikey179/vfsstream":"~1.4.0@dev","phpunit/phpunit":">4.8 <9"},"replace":{"helhum/class-alias-loader":"*"},"uid":5630211},"v1.0.2":{"name":"typo3/class-alias-loader","description":"Amends the composer class loader to support class aliases to provide backwards compatibility for packages","keywords":["autoloader","composer","classloader","alias"],"homepage":"http://github.com/TYPO3/class-alias-loader","version":"v1.0.2","version_normalized":"1.0.2.0","license":["MIT"],"authors":[{"name":"Helmut Hummel","email":"info@helhum.io"}],"source":{"type":"git","url":"https://github.com/TYPO3/class-alias-loader.git","reference":"994ee9bebe847da862d0edc6f075df4693dfa8e2"},"dist":{"type":"zip","url":"https://api.github.com/repos/TYPO3/class-alias-loader/zipball/994ee9bebe847da862d0edc6f075df4693dfa8e2","reference":"994ee9bebe847da862d0edc6f075df4693dfa8e2","shasum":""},"type":"composer-plugin","time":"2020-03-29T16:12:26+00:00","autoload":{"psr-4":{"TYPO3\\ClassAliasLoader\\":"src/"}},"extra":{"class":"TYPO3\\ClassAliasLoader\\Plugin","branch-alias":{"dev-master":"1.1.x-dev"}},"require":{"php":">=5.3.7","composer-plugin-api":"^1.0 || ^2.0"},"require-dev":{"composer/composer":"^1.1@dev || ^2.0@dev","mikey179/vfsstream":"~1.4.0@dev","phpunit/phpunit":"^4.8"},"replace":{"helhum/class-alias-loader":"*"},"uid":3735889},"v1.1.0":{"name":"typo3/class-alias-loader","description":"Amends the composer class loader to support class aliases to provide backwards compatibility for packages","keywords":["autoloader","composer","classloader","alias"],"homepage":"http://github.com/TYPO3/class-alias-loader","version":"v1.1.0","version_normalized":"1.1.0.0","license":["MIT"],"authors":[{"name":"Helmut Hummel","email":"info@helhum.io"}],"source":{"type":"git","url":"https://github.com/TYPO3/class-alias-loader.git","reference":"282b56758ee542b9bc9f2c3cd12da22b76ddba3f"},"dist":{"type":"zip","url":"https://api.github.com/repos/TYPO3/class-alias-loader/zipball/282b56758ee542b9bc9f2c3cd12da22b76ddba3f","reference":"282b56758ee542b9bc9f2c3cd12da22b76ddba3f","shasum":""},"type":"composer-plugin","time":"2020-04-29T19:51:20+00:00","autoload":{"psr-4":{"TYPO3\\ClassAliasLoader\\":"src/"}},"extra":{"class":"TYPO3\\ClassAliasLoader\\Plugin","branch-alias":{"dev-master":"1.1.x-dev"}},"require":{"php":">=5.3.7","composer-plugin-api":"^1.0 || ^2.0"},"require-dev":{"composer/composer":"^1.1@dev || ^2.0@dev","mikey179/vfsstream":"~1.4.0@dev","phpunit/phpunit":">4.8 <8"},"replace":{"helhum/class-alias-loader":"*"},"uid":3825205},"v1.1.1":{"name":"typo3/class-alias-loader","description":"Amends the composer class loader to support class aliases to provide backwards compatibility for packages","keywords":["autoloader","composer","classloader","alias"],"homepage":"http://github.com/TYPO3/class-alias-loader","version":"v1.1.1","version_normalized":"1.1.1.0","license":["MIT"],"authors":[{"name":"Helmut Hummel","email":"info@helhum.io"}],"source":{"type":"git","url":"https://github.com/TYPO3/class-alias-loader.git","reference":"ee417366a289871460910ae1703976e9903a5e80"},"dist":{"type":"zip","url":"https://api.github.com/repos/TYPO3/class-alias-loader/zipball/ee417366a289871460910ae1703976e9903a5e80","reference":"ee417366a289871460910ae1703976e9903a5e80","shasum":""},"type":"composer-plugin","time":"2020-04-30T10:13:10+00:00","autoload":{"psr-4":{"TYPO3\\ClassAliasLoader\\":"src/"}},"extra":{"class":"TYPO3\\ClassAliasLoader\\Plugin","branch-alias":{"dev-master":"1.1.x-dev"}},"require":{"php":">=5.3.7","composer-plugin-api":"^1.0 || ^2.0"},"require-dev":{"composer/composer":"^1.1@dev || ^2.0@dev","mikey179/vfsstream":"~1.4.0@dev","phpunit/phpunit":">4.8 <8"},"replace":{"helhum/class-alias-loader":"*"},"uid":3826609},"v1.1.2":{"name":"typo3/class-alias-loader","description":"Amends the composer class loader to support class aliases to provide backwards compatibility for packages","keywords":["autoloader","composer","classloader","alias"],"homepage":"http://github.com/TYPO3/class-alias-loader","version":"v1.1.2","version_normalized":"1.1.2.0","license":["MIT"],"authors":[{"name":"Helmut Hummel","email":"info@helhum.io"}],"source":{"type":"git","url":"https://github.com/TYPO3/class-alias-loader.git","reference":"ead04a4d7bc215ca1faa895977c5ea349f0b7383"},"dist":{"type":"zip","url":"https://api.github.com/repos/TYPO3/class-alias-loader/zipball/ead04a4d7bc215ca1faa895977c5ea349f0b7383","reference":"ead04a4d7bc215ca1faa895977c5ea349f0b7383","shasum":""},"type":"composer-plugin","time":"2020-05-07T12:46:20+00:00","autoload":{"psr-4":{"TYPO3\\ClassAliasLoader\\":"src/"}},"extra":{"class":"TYPO3\\ClassAliasLoader\\Plugin","branch-alias":{"dev-master":"1.1.x-dev"}},"require":{"php":">=5.3.7","composer-plugin-api":"^1.0 || ^2.0"},"require-dev":{"composer/composer":"^1.1@dev || ^2.0@dev","mikey179/vfsstream":"~1.4.0@dev","phpunit/phpunit":">4.8 <8"},"replace":{"helhum/class-alias-loader":"*"},"uid":3845408},"v1.1.3":{"name":"typo3/class-alias-loader","description":"Amends the composer class loader to support class aliases to provide backwards compatibility for packages","keywords":["autoloader","composer","classloader","alias"],"homepage":"http://github.com/TYPO3/class-alias-loader","version":"v1.1.3","version_normalized":"1.1.3.0","license":["MIT"],"authors":[{"name":"Helmut Hummel","email":"info@helhum.io"}],"source":{"type":"git","url":"https://github.com/TYPO3/class-alias-loader.git","reference":"575f59581541f299f3a86a95b1db001ee6e1d2e0"},"dist":{"type":"zip","url":"https://api.github.com/repos/TYPO3/class-alias-loader/zipball/575f59581541f299f3a86a95b1db001ee6e1d2e0","reference":"575f59581541f299f3a86a95b1db001ee6e1d2e0","shasum":""},"type":"composer-plugin","time":"2020-05-24T13:03:22+00:00","autoload":{"psr-4":{"TYPO3\\ClassAliasLoader\\":"src/"}},"extra":{"class":"TYPO3\\ClassAliasLoader\\Plugin","branch-alias":{"dev-master":"1.1.x-dev"}},"require":{"php":">=5.3.7","composer-plugin-api":"^1.0 || ^2.0"},"require-dev":{"composer/composer":"^1.1@dev || ^2.0@dev","mikey179/vfsstream":"~1.4.0@dev","phpunit/phpunit":">4.8 <8"},"replace":{"helhum/class-alias-loader":"*"},"uid":3889305}}}} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-packages.json b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-packages.json new file mode 100644 index 0000000000..a5ccdb4ba5 --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-packages.json @@ -0,0 +1,69 @@ +{ + "packages": [], + "notify-batch": "https:\/\/packagist.org\/downloads\/", + "providers-url": "\/p\/%package%$%hash%.json", + "metadata-url": "\/p2\/%package%.json", + "metadata-changes-url": "https:\/\/packagist.org\/metadata\/changes.json", + "search": "https:\/\/packagist.org\/search.json?q=%query%&type=%type%", + "list": "https:\/\/packagist.org\/packages\/list.json", + "security-advisories": { + "metadata": true, + "api-url": "https:\/\/packagist.org\/api\/security-advisories\/" + }, + "providers-api": "https:\/\/packagist.org\/providers\/%package%.json", + "warning": "Support for Composer 1 will be shutdown on August 1st 2025. You should upgrade to Composer 2. See https:\/\/blog.packagist.com\/shutting-down-packagist-org-support-for-composer-1-x\/", + "warning-versions": "<1.99", + "provider-includes": { + "p\/provider-2013$%hash%.json": { + "sha256": "c8f66b919e1bc413cf539ae5e1c3641aaa7201bb35236028083b6a29db54819f" + }, + "p\/provider-2014$%hash%.json": { + "sha256": "94ebaab6c9615b692bcd554dc13706cc5031b9a9627638bab9946fcbc9bf08a1" + }, + "p\/provider-2015$%hash%.json": { + "sha256": "2b1532a5da804f7436f2b3149e48dd759749d9f22ac96e3eefba8937a8b107b5" + }, + "p\/provider-2016$%hash%.json": { + "sha256": "5dc2ed83294c0276fb6fb5a8b4c54b352a2c2b47d6fbfb23aa1b4aa609582008" + }, + "p\/provider-2017$%hash%.json": { + "sha256": "ff924ce644237ec99649173d2c4837302c592a55d60da597c73ed242918be50d" + }, + "p\/provider-2018$%hash%.json": { + "sha256": "56e61c2baea4a692b533dba5b6886f654a3c3545e96463c6e4133073a829e7fa" + }, + "p\/provider-2019$%hash%.json": { + "sha256": "c262cdac424514f851f81246c8e0903ef7186ab6512bb4839b65a7ac8652d0b9" + }, + "p\/provider-2020$%hash%.json": { + "sha256": "3a86d50c668a7d53edffcdef112844a35436e914f8a7753a3e5f8d6c7b1dce4e" + }, + "p\/provider-2021$%hash%.json": { + "sha256": "b692808b8deebd71a240b47a75cc7e574dcb4c12716576cdb5d747341cc334af" + }, + "p\/provider-2022$%hash%.json": { + "sha256": "0accffd503220a2214fa75043b0a05dc50faea35dd8fe49a6bcf78abfa2a7c30" + }, + "p\/provider-2023$%hash%.json": { + "sha256": "fe0ecb56d5a8115fc2e1458d1b98a3b4d51d04f9e865919783e0be6651b7b251" + }, + "p\/provider-2024-01$%hash%.json": { + "sha256": "b38bb9babb5f7cdc083fe8e37bbef94742af7e9781f3ab9e576de08c5f605f84" + }, + "p\/provider-2024-04$%hash%.json": { + "sha256": "cabad2053691f922e76c894efac5ea6088afb58bd4ea648e71773d48260e51b1" + }, + "p\/provider-2024-07$%hash%.json": { + "sha256": "af17a240b260e3e701f5e6a1f5f90f2f492c8bc48105eaac4fc2a56e77fd2701" + }, + "p\/provider-2024-10$%hash%.json": { + "sha256": "7d947c5ebdcf0d5344611c49735ae7ca4a7e695526a85360a63273c83f8cc06f" + }, + "p\/provider-archived$%hash%.json": { + "sha256": "0c2739922be632b3788c5bddb8f33e90de9697641fe11f888a43afbad106457c" + }, + "p\/provider-latest$%hash%.json": { + "sha256": "6fe454899c10d7cc91d7aef76fb2f0c50dcc59f81882caa38b8be00c6b8717b8" + } + } +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-typo3-class-alias-loader.json b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-typo3-class-alias-loader.json new file mode 100644 index 0000000000..b41b727a7c --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org-typo3-class-alias-loader.json @@ -0,0 +1,266 @@ +{ + "minified": "composer/2.0", + "packages": { + "typo3/class-alias-loader": [ + { + "authors": [ + { + "email": "info@helhum.io", + "name": "Helmut Hummel" + } + ], + "autoload": { + "psr-4": { + "TYPO3\\ClassAliasLoader\\": "src/" + } + }, + "description": "Amends the composer class loader to support class aliases to provide backwards compatibility for packages", + "dist": { + "reference": "cf2aebabe1886474da7194e1531900039263b3e0", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/cf2aebabe1886474da7194e1531900039263b3e0" + }, + "extra": { + "branch-alias": { + "dev-main": "1.1.x-dev" + }, + "class": "TYPO3\\ClassAliasLoader\\Plugin" + }, + "funding": [ + ], + "homepage": "http://github.com/TYPO3/class-alias-loader", + "keywords": [ + "autoloader", + "composer", + "classloader", + "alias" + ], + "license": [ + "MIT" + ], + "name": "typo3/class-alias-loader", + "replace": { + "helhum/class-alias-loader": "*" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=7.1" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": ">4.8 <9" + }, + "source": { + "reference": "cf2aebabe1886474da7194e1531900039263b3e0", + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git" + }, + "support": { + "issues": "https://github.com/TYPO3/class-alias-loader/issues", + "source": "https://github.com/TYPO3/class-alias-loader/tree/v1.2.0" + }, + "time": "2024-10-11T08:11:39+00:00", + "type": "composer-plugin", + "version": "v1.2.0", + "version_normalized": "1.2.0.0" + }, + { + "dist": { + "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/f6fc1f5fb04c42195e8e663b43aced4919ef318f" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3.7" + }, + "source": { + "reference": "f6fc1f5fb04c42195e8e663b43aced4919ef318f", + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git" + }, + "support": { + "issues": "https://github.com/TYPO3/class-alias-loader/issues", + "source": "https://github.com/TYPO3/class-alias-loader/tree/v1.1.4" + }, + "time": "2022-08-07T14:48:42+00:00", + "version": "v1.1.4", + "version_normalized": "1.1.4.0" + }, + { + "dist": { + "reference": "575f59581541f299f3a86a95b1db001ee6e1d2e0", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/575f59581541f299f3a86a95b1db001ee6e1d2e0" + }, + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + }, + "class": "TYPO3\\ClassAliasLoader\\Plugin" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": ">4.8 <8" + }, + "source": { + "reference": "575f59581541f299f3a86a95b1db001ee6e1d2e0", + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git" + }, + "support": { + "issues": "https://github.com/TYPO3/class-alias-loader/issues", + "source": "https://github.com/TYPO3/class-alias-loader/tree/v1.1.3" + }, + "time": "2020-05-24T13:03:22+00:00", + "version": "v1.1.3", + "version_normalized": "1.1.3.0" + }, + { + "dist": { + "reference": "ead04a4d7bc215ca1faa895977c5ea349f0b7383", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/ead04a4d7bc215ca1faa895977c5ea349f0b7383" + }, + "source": { + "reference": "ead04a4d7bc215ca1faa895977c5ea349f0b7383", + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git" + }, + "support": { + "issues": "https://github.com/TYPO3/class-alias-loader/issues", + "source": "https://github.com/TYPO3/class-alias-loader/tree/v1.1.2" + }, + "time": "2020-05-07T12:46:20+00:00", + "version": "v1.1.2", + "version_normalized": "1.1.2.0" + }, + { + "dist": { + "reference": "ee417366a289871460910ae1703976e9903a5e80", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/ee417366a289871460910ae1703976e9903a5e80" + }, + "source": { + "reference": "ee417366a289871460910ae1703976e9903a5e80", + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git" + }, + "support": { + "issues": "https://github.com/TYPO3/class-alias-loader/issues", + "source": "https://github.com/TYPO3/class-alias-loader/tree/v1.1.1" + }, + "time": "2020-04-30T10:13:10+00:00", + "version": "v1.1.1", + "version_normalized": "1.1.1.0" + }, + { + "dist": { + "reference": "282b56758ee542b9bc9f2c3cd12da22b76ddba3f", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/282b56758ee542b9bc9f2c3cd12da22b76ddba3f" + }, + "source": { + "reference": "282b56758ee542b9bc9f2c3cd12da22b76ddba3f", + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git" + }, + "support": { + "issues": "https://github.com/TYPO3/class-alias-loader/issues", + "source": "https://github.com/TYPO3/class-alias-loader/tree/v1.1.0" + }, + "time": "2020-04-29T19:51:20+00:00", + "version": "v1.1.0", + "version_normalized": "1.1.0.0" + }, + { + "dist": { + "reference": "994ee9bebe847da862d0edc6f075df4693dfa8e2", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/994ee9bebe847da862d0edc6f075df4693dfa8e2" + }, + "require-dev": { + "composer/composer": "^1.1@dev || ^2.0@dev", + "mikey179/vfsstream": "~1.4.0@dev", + "phpunit/phpunit": "^4.8" + }, + "source": { + "reference": "994ee9bebe847da862d0edc6f075df4693dfa8e2", + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git" + }, + "support": { + "issues": "https://github.com/TYPO3/class-alias-loader/issues", + "source": "https://github.com/TYPO3/class-alias-loader/tree/master" + }, + "time": "2020-03-29T16:12:26+00:00", + "version": "v1.0.2", + "version_normalized": "1.0.2.0" + }, + { + "dist": { + "reference": "4972f9f6c2bad07ab1620b5c9717fa626e9b03b0", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/4972f9f6c2bad07ab1620b5c9717fa626e9b03b0" + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + }, + "class": "TYPO3\\ClassAliasLoader\\Plugin" + }, + "funding": "__unset", + "require": { + "composer-plugin-api": "^1.0", + "php": ">=5.3.7" + }, + "require-dev": { + "composer/composer": "dev-master", + "mikey179/vfsstream": "1.4.*@dev", + "phpunit/phpunit": "^4.8" + }, + "source": { + "reference": "4972f9f6c2bad07ab1620b5c9717fa626e9b03b0", + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git" + }, + "time": "2018-10-03T12:49:56+00:00", + "version": "1.0.1", + "version_normalized": "1.0.1.0" + }, + { + "dist": { + "reference": "a9dd295c81ed0b51455644be420ab9210cad688f", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/TYPO3/class-alias-loader/zipball/a9dd295c81ed0b51455644be420ab9210cad688f" + }, + "require-dev": { + "composer/composer": "dev-master", + "mikey179/vfsstream": "1.4.*@dev", + "phpunit/phpunit": "~4.7.0" + }, + "source": { + "reference": "a9dd295c81ed0b51455644be420ab9210cad688f", + "type": "git", + "url": "https://github.com/TYPO3/class-alias-loader.git" + }, + "time": "2015-10-06T10:25:44+00:00", + "version": "1.0.0", + "version_normalized": "1.0.0.0" + } + ] + }, + "security-advisories": [ + ] +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---repo.packagist.org.v1-magento-adobe-ims.json b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org.v1-magento-adobe-ims.json new file mode 100644 index 0000000000..09d90828f4 --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org.v1-magento-adobe-ims.json @@ -0,0 +1,404 @@ +{ + "packages": { + "jean85/composer-provided-replaced-stub-package": { + "1.0.0": { + "authors": [ + { + "email": "alessandro.lai85@gmail.com", + "name": "Alessandro Lai" + } + ], + "description": "This is only a stub package used in the tests of jean85/pretty-package-versions", + "dist": { + "reference": "a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/Jean85/composer-provided-replaced-stub-package/zipball/a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90" + }, + "funding": [ + ], + "homepage": "", + "keywords": [ + ], + "license": [ + "MIT" + ], + "name": "jean85/composer-provided-replaced-stub-package", + "provide": { + "psr/log-implementation": "1.0.0" + }, + "replace": { + "monolog/monolog": "*" + }, + "source": { + "reference": "a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90", + "type": "git", + "url": "https://github.com/Jean85/composer-provided-replaced-stub-package.git" + }, + "time": "2020-04-28T10:17:21+00:00", + "type": "library", + "uid": 3820116, + "version": "1.0.0", + "version_normalized": "1.0.0.0" + }, + "dev-master": { + "authors": [ + { + "email": "alessandro.lai85@gmail.com", + "name": "Alessandro Lai" + } + ], + "default-branch": true, + "description": "This is only a stub package used in the tests of jean85/pretty-package-versions", + "dist": { + "reference": "a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/Jean85/composer-provided-replaced-stub-package/zipball/a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90" + }, + "funding": [ + ], + "homepage": "", + "keywords": [ + ], + "license": [ + "MIT" + ], + "name": "jean85/composer-provided-replaced-stub-package", + "provide": { + "psr/log-implementation": "1.0.0" + }, + "replace": { + "monolog/monolog": "*" + }, + "source": { + "reference": "a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90", + "type": "git", + "url": "https://github.com/Jean85/composer-provided-replaced-stub-package.git" + }, + "time": "2020-04-28T10:17:21+00:00", + "type": "library", + "uid": 4108141, + "version": "dev-master", + "version_normalized": "9999999-dev" + } + }, + "jtl/connector-shopware": { + "2.11.0": { + "authors": [ + { + "email": "info@jtl-software.de", + "homepage": "http://www.jtl-software.de", + "name": "JTL-Software GmbH", + "role": "Founder" + } + ], + "autoload": { + "psr-4": { + "\\": "plugins/", + "jtl\\Connector\\Shopware\\": "src/" + } + }, + "description": "Shopware 5 Connector based on jtl/connector", + "dist": { + "reference": "dbe81dc55bcfc250e210a40925817d3222910fee", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/jtl-software/connector-shopware5/zipball/dbe81dc55bcfc250e210a40925817d3222910fee" + }, + "extra": { + "installer-name": "jtlconnector" + }, + "funding": [ + ], + "homepage": "http://www.jtl-software.de", + "keywords": [ + "connector", + "shopware", + "jtl" + ], + "license": [ + "LGPL-3.0-or-later" + ], + "name": "jtl/connector-shopware", + "replace": { + "monolog/monolog": "*" + }, + "require": { + "jtl/connector": "^3.3", + "phing/phing": "^2.16", + "php": ">=7.1.3", + "symfony/yaml": "^3.4", + "theiconic/name-parser": "^0.1.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "source": { + "reference": "dbe81dc55bcfc250e210a40925817d3222910fee", + "type": "git", + "url": "https://github.com/jtl-software/connector-shopware5.git" + }, + "time": "2021-07-05T11:20:18+00:00", + "type": "shopware-frontend-plugin", + "uid": 5338928, + "version": "2.11.0", + "version_normalized": "2.11.0.0" + }, + "dev-task/attribute_refactorings": { + "authors": [ + { + "email": "info@jtl-software.de", + "homepage": "http://www.jtl-software.de", + "name": "JTL-Software GmbH", + "role": "Founder" + } + ], + "autoload": { + "psr-4": { + "\\": "plugins/", + "jtl\\Connector\\Shopware\\": "src/" + } + }, + "description": "Shopware 5 Connector based on jtl/connector", + "dist": { + "reference": "af20195040e30bfb5f94e1a0eb0a9fd18c3e547f", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/jtl-software/connector-shopware5/zipball/af20195040e30bfb5f94e1a0eb0a9fd18c3e547f" + }, + "extra": { + "installer-name": "jtlconnector" + }, + "funding": [ + ], + "homepage": "http://www.jtl-software.de", + "keywords": [ + "connector", + "shopware", + "jtl" + ], + "license": [ + "LGPL-3.0-or-later" + ], + "name": "jtl/connector-shopware", + "replace": { + "monolog/monolog": "*" + }, + "require": { + "jtl/connector": "^3.3", + "phing/phing": "^2.16", + "php": ">=7.1.3", + "symfony/yaml": "^3.4", + "theiconic/name-parser": "^0.1.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "source": { + "reference": "af20195040e30bfb5f94e1a0eb0a9fd18c3e547f", + "type": "git", + "url": "https://github.com/jtl-software/connector-shopware5.git" + }, + "time": "2021-08-30T07:49:42+00:00", + "type": "shopware-frontend-plugin", + "uid": 5474722, + "version": "dev-task/attribute_refactorings", + "version_normalized": "dev-task/attribute_refactorings" + } + }, + "monolog/monolog": { + "1.0.0": { + "authors": [ + { + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be", + "name": "Jordi Boggiano", + "role": "Developer" + } + ], + "description": "Logging for PHP 5.3", + "dist": { + "reference": "433b98d4218c181bae01865901aac045585e8a1a", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/433b98d4218c181bae01865901aac045585e8a1a" + }, + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging" + ], + "license": [ + "MIT" + ], + "name": "monolog/monolog", + "require": { + "php": ">=5.3.0" + }, + "source": { + "reference": "433b98d4218c181bae01865901aac045585e8a1a", + "type": "git", + "url": "https://github.com/Seldaek/monolog.git" + }, + "time": "2011-07-07T16:21:02+00:00", + "type": "library", + "uid": 5151, + "version": "1.0.0", + "version_normalized": "1.0.0.0" + }, + "dev-main": { + "authors": [ + { + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be", + "name": "Jordi Boggiano" + } + ], + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "default-branch": true, + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "dist": { + "reference": "d97d5e9468aa7d10f95b2e0468f39afdbd08a4d1", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/d97d5e9468aa7d10f95b2e0468f39afdbd08a4d1" + }, + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/Seldaek" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog" + } + ], + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "license": [ + "MIT" + ], + "name": "monolog/monolog", + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "source": { + "reference": "d97d5e9468aa7d10f95b2e0468f39afdbd08a4d1", + "type": "git", + "url": "https://github.com/Seldaek/monolog.git" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "time": "2024-12-10T13:30:50+00:00", + "type": "library", + "uid": 4731227, + "version": "dev-main", + "version_normalized": "dev-main" + } + }, + "phpointless/monolol": { + "1.0.0": { + "authors": [ + { + "email": "contact@romain-renaud.fr", + "name": "Romain Renaud" + } + ], + "autoload": { + "psr-4": { + "Monolol\\": "lib" + } + }, + "description": "PSR-3 compliant lol-gger", + "dist": { + "reference": "1991e6b72b52229dc43147fd2c208f21896021bb", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/PHPointless/monolol/zipball/1991e6b72b52229dc43147fd2c208f21896021bb" + }, + "homepage": "", + "keywords": [ + "PSR3", + "LoL", + "lol-gging" + ], + "license": [ + "MIT" + ], + "name": "phpointless/monolol", + "provide": { + "monolog/monolog": "1.12" + }, + "require": { + "monolog/monolog": "~1.12" + }, + "require-dev": { + "phpunit/phpunit": "~4.5" + }, + "source": { + "reference": "1991e6b72b52229dc43147fd2c208f21896021bb", + "type": "git", + "url": "https://github.com/PHPointless/monolol.git" + }, + "time": "2015-03-04T13:27:14+00:00", + "type": "library", + "uid": 347741, + "version": "1.0.0", + "version_normalized": "1.0.0.0" + } + } + } +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---repo.packagist.org.v1-monolog-monolog.json b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org.v1-monolog-monolog.json new file mode 100644 index 0000000000..55f793bd05 --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org.v1-monolog-monolog.json @@ -0,0 +1,604 @@ +{ + "packages": { + "jean85/composer-provided-replaced-stub-package": { + "1.0.0": { + "authors": [ + { + "email": "alessandro.lai85@gmail.com", + "name": "Alessandro Lai" + } + ], + "description": "This is only a stub package used in the tests of jean85/pretty-package-versions", + "dist": { + "reference": "a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/Jean85/composer-provided-replaced-stub-package/zipball/a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90" + }, + "funding": [ + ], + "homepage": "", + "keywords": [ + ], + "license": [ + "MIT" + ], + "name": "jean85/composer-provided-replaced-stub-package", + "provide": { + "psr/log-implementation": "1.0.0" + }, + "replace": { + "monolog/monolog": "*" + }, + "source": { + "reference": "a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90", + "type": "git", + "url": "https://github.com/Jean85/composer-provided-replaced-stub-package.git" + }, + "time": "2020-04-28T10:17:21+00:00", + "type": "library", + "uid": 3820116, + "version": "1.0.0", + "version_normalized": "1.0.0.0" + }, + "dev-master": { + "authors": [ + { + "email": "alessandro.lai85@gmail.com", + "name": "Alessandro Lai" + } + ], + "default-branch": true, + "description": "This is only a stub package used in the tests of jean85/pretty-package-versions", + "dist": { + "reference": "a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/Jean85/composer-provided-replaced-stub-package/zipball/a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90" + }, + "funding": [ + ], + "homepage": "", + "keywords": [ + ], + "license": [ + "MIT" + ], + "name": "jean85/composer-provided-replaced-stub-package", + "provide": { + "psr/log-implementation": "1.0.0" + }, + "replace": { + "monolog/monolog": "*" + }, + "source": { + "reference": "a89d3f39a6149d33b6f6ebecc2f5f44fd4a2cf90", + "type": "git", + "url": "https://github.com/Jean85/composer-provided-replaced-stub-package.git" + }, + "time": "2020-04-28T10:17:21+00:00", + "type": "library", + "uid": 4108141, + "version": "dev-master", + "version_normalized": "9999999-dev" + } + }, + "jtl/connector-shopware": { + "2.11.0": { + "authors": [ + { + "email": "info@jtl-software.de", + "homepage": "http://www.jtl-software.de", + "name": "JTL-Software GmbH", + "role": "Founder" + } + ], + "autoload": { + "psr-4": { + "\\": "plugins/", + "jtl\\Connector\\Shopware\\": "src/" + } + }, + "description": "Shopware 5 Connector based on jtl/connector", + "dist": { + "reference": "dbe81dc55bcfc250e210a40925817d3222910fee", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/jtl-software/connector-shopware5/zipball/dbe81dc55bcfc250e210a40925817d3222910fee" + }, + "extra": { + "installer-name": "jtlconnector" + }, + "funding": [ + ], + "homepage": "http://www.jtl-software.de", + "keywords": [ + "connector", + "shopware", + "jtl" + ], + "license": [ + "LGPL-3.0-or-later" + ], + "name": "jtl/connector-shopware", + "replace": { + "monolog/monolog": "*" + }, + "require": { + "jtl/connector": "^3.3", + "phing/phing": "^2.16", + "php": ">=7.1.3", + "symfony/yaml": "^3.4", + "theiconic/name-parser": "^0.1.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "source": { + "reference": "dbe81dc55bcfc250e210a40925817d3222910fee", + "type": "git", + "url": "https://github.com/jtl-software/connector-shopware5.git" + }, + "time": "2021-07-05T11:20:18+00:00", + "type": "shopware-frontend-plugin", + "uid": 5338928, + "version": "2.11.0", + "version_normalized": "2.11.0.0" + }, + "dev-task/attribute_refactorings": { + "authors": [ + { + "email": "info@jtl-software.de", + "homepage": "http://www.jtl-software.de", + "name": "JTL-Software GmbH", + "role": "Founder" + } + ], + "autoload": { + "psr-4": { + "\\": "plugins/", + "jtl\\Connector\\Shopware\\": "src/" + } + }, + "description": "Shopware 5 Connector based on jtl/connector", + "dist": { + "reference": "af20195040e30bfb5f94e1a0eb0a9fd18c3e547f", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/jtl-software/connector-shopware5/zipball/af20195040e30bfb5f94e1a0eb0a9fd18c3e547f" + }, + "extra": { + "installer-name": "jtlconnector" + }, + "funding": [ + ], + "homepage": "http://www.jtl-software.de", + "keywords": [ + "connector", + "shopware", + "jtl" + ], + "license": [ + "LGPL-3.0-or-later" + ], + "name": "jtl/connector-shopware", + "replace": { + "monolog/monolog": "*" + }, + "require": { + "jtl/connector": "^3.3", + "phing/phing": "^2.16", + "php": ">=7.1.3", + "symfony/yaml": "^3.4", + "theiconic/name-parser": "^0.1.1" + }, + "require-dev": { + "phpunit/phpunit": "^7.5" + }, + "source": { + "reference": "af20195040e30bfb5f94e1a0eb0a9fd18c3e547f", + "type": "git", + "url": "https://github.com/jtl-software/connector-shopware5.git" + }, + "time": "2021-08-30T07:49:42+00:00", + "type": "shopware-frontend-plugin", + "uid": 5474722, + "version": "dev-task/attribute_refactorings", + "version_normalized": "dev-task/attribute_refactorings" + } + }, + "monolog/monolog": { + "1.0.0": { + "authors": [ + { + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be", + "name": "Jordi Boggiano", + "role": "Developer" + } + ], + "description": "Logging for PHP 5.3", + "dist": { + "reference": "433b98d4218c181bae01865901aac045585e8a1a", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/433b98d4218c181bae01865901aac045585e8a1a" + }, + "homepage": "http://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging" + ], + "license": [ + "MIT" + ], + "name": "monolog/monolog", + "require": { + "php": ">=5.3.0" + }, + "source": { + "reference": "433b98d4218c181bae01865901aac045585e8a1a", + "type": "git", + "url": "https://github.com/Seldaek/monolog.git" + }, + "time": "2011-07-07T16:21:02+00:00", + "type": "library", + "uid": 5151, + "version": "1.0.0", + "version_normalized": "1.0.0.0" + }, + "3.8.0": { + "authors": [ + { + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be", + "name": "Jordi Boggiano" + } + ], + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "dist": { + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/32e515fdc02cdafbe4593e30a9350d486b125b67" + }, + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/Seldaek" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog" + } + ], + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "license": [ + "MIT" + ], + "name": "monolog/monolog", + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "source": { + "reference": "32e515fdc02cdafbe4593e30a9350d486b125b67", + "type": "git", + "url": "https://github.com/Seldaek/monolog.git" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "time": "2024-11-12T13:57:08+00:00", + "type": "library", + "uid": 8586646, + "version": "3.8.0", + "version_normalized": "3.8.0.0" + }, + "3.8.1": { + "authors": [ + { + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be", + "name": "Jordi Boggiano" + } + ], + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "dist": { + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/aef6ee73a77a66e404dd6540934a9ef1b3c855b4" + }, + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/Seldaek" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog" + } + ], + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "license": [ + "MIT" + ], + "name": "monolog/monolog", + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "source": { + "reference": "aef6ee73a77a66e404dd6540934a9ef1b3c855b4", + "type": "git", + "url": "https://github.com/Seldaek/monolog.git" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "time": "2024-12-05T17:15:07+00:00", + "type": "library", + "uid": 8656379, + "version": "3.8.1", + "version_normalized": "3.8.1.0" + }, + "dev-main": { + "authors": [ + { + "email": "j.boggiano@seld.be", + "homepage": "https://seld.be", + "name": "Jordi Boggiano" + } + ], + "autoload": { + "psr-4": { + "Monolog\\": "src/Monolog" + } + }, + "default-branch": true, + "description": "Sends your logs to files, sockets, inboxes, databases and various web services", + "dist": { + "reference": "d97d5e9468aa7d10f95b2e0468f39afdbd08a4d1", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/Seldaek/monolog/zipball/d97d5e9468aa7d10f95b2e0468f39afdbd08a4d1" + }, + "extra": { + "branch-alias": { + "dev-main": "3.x-dev" + } + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/Seldaek" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/packagist/monolog/monolog" + } + ], + "homepage": "https://github.com/Seldaek/monolog", + "keywords": [ + "log", + "logging", + "psr-3" + ], + "license": [ + "MIT" + ], + "name": "monolog/monolog", + "provide": { + "psr/log-implementation": "3.0.0" + }, + "require": { + "php": ">=8.1", + "psr/log": "^2.0 || ^3.0" + }, + "require-dev": { + "aws/aws-sdk-php": "^3.0", + "doctrine/couchdb": "~1.0@dev", + "elasticsearch/elasticsearch": "^7 || ^8", + "ext-json": "*", + "graylog2/gelf-php": "^1.4.2 || ^2.0", + "guzzlehttp/guzzle": "^7.4.5", + "guzzlehttp/psr7": "^2.2", + "mongodb/mongodb": "^1.8", + "php-amqplib/php-amqplib": "~2.4 || ^3", + "php-console/php-console": "^3.1.8", + "phpstan/phpstan": "^2", + "phpstan/phpstan-deprecation-rules": "^2", + "phpstan/phpstan-strict-rules": "^2", + "phpunit/phpunit": "^10.5.17 || ^11.0.7", + "predis/predis": "^1.1 || ^2", + "rollbar/rollbar": "^4.0", + "ruflin/elastica": "^7 || ^8", + "symfony/mailer": "^5.4 || ^6", + "symfony/mime": "^5.4 || ^6" + }, + "source": { + "reference": "d97d5e9468aa7d10f95b2e0468f39afdbd08a4d1", + "type": "git", + "url": "https://github.com/Seldaek/monolog.git" + }, + "suggest": { + "aws/aws-sdk-php": "Allow sending log messages to AWS services like DynamoDB", + "doctrine/couchdb": "Allow sending log messages to a CouchDB server", + "elasticsearch/elasticsearch": "Allow sending log messages to an Elasticsearch server via official client", + "ext-amqp": "Allow sending log messages to an AMQP server (1.0+ required)", + "ext-curl": "Required to send log messages using the IFTTTHandler, the LogglyHandler, the SendGridHandler, the SlackWebhookHandler or the TelegramBotHandler", + "ext-mbstring": "Allow to work properly with unicode symbols", + "ext-mongodb": "Allow sending log messages to a MongoDB server (via driver)", + "ext-openssl": "Required to send log messages using SSL", + "ext-sockets": "Allow sending log messages to a Syslog server (via UDP driver)", + "graylog2/gelf-php": "Allow sending log messages to a GrayLog2 server", + "mongodb/mongodb": "Allow sending log messages to a MongoDB server (via library)", + "php-amqplib/php-amqplib": "Allow sending log messages to an AMQP server using php-amqplib", + "rollbar/rollbar": "Allow sending log messages to Rollbar", + "ruflin/elastica": "Allow sending log messages to an Elastic Search server" + }, + "time": "2024-12-10T13:30:50+00:00", + "type": "library", + "uid": 4731227, + "version": "dev-main", + "version_normalized": "dev-main" + } + }, + "phpointless/monolol": { + "1.0.0": { + "authors": [ + { + "email": "contact@romain-renaud.fr", + "name": "Romain Renaud" + } + ], + "autoload": { + "psr-4": { + "Monolol\\": "lib" + } + }, + "description": "PSR-3 compliant lol-gger", + "dist": { + "reference": "1991e6b72b52229dc43147fd2c208f21896021bb", + "shasum": "", + "type": "zip", + "url": "https://api.github.com/repos/PHPointless/monolol/zipball/1991e6b72b52229dc43147fd2c208f21896021bb" + }, + "homepage": "", + "keywords": [ + "PSR3", + "LoL", + "lol-gging" + ], + "license": [ + "MIT" + ], + "name": "phpointless/monolol", + "provide": { + "monolog/monolog": "1.12" + }, + "require": { + "monolog/monolog": "~1.12" + }, + "require-dev": { + "phpunit/phpunit": "~4.5" + }, + "source": { + "reference": "1991e6b72b52229dc43147fd2c208f21896021bb", + "type": "git", + "url": "https://github.com/PHPointless/monolol.git" + }, + "time": "2015-03-04T13:27:14+00:00", + "type": "library", + "uid": 347741, + "version": "1.0.0", + "version_normalized": "1.0.0.0" + } + } + } +} \ No newline at end of file diff --git a/src/test/resources/unit/tasks/repositories/https---repo.packagist.org.v1-packages.json b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org.v1-packages.json new file mode 100644 index 0000000000..c0355a182e --- /dev/null +++ b/src/test/resources/unit/tasks/repositories/https---repo.packagist.org.v1-packages.json @@ -0,0 +1,62 @@ +{ + "packages": [], + "notify-batch": "https:\/\/packagist.org\/downloads\/", + "providers-url": "\/p\/%package%$%hash%.json", + "search": "https:\/\/packagist.org\/search.json?q=%query%&type=%type%", + "list": "https:\/\/packagist.org\/packages\/list.json", + "warning": "Support for Composer 1 will be shutdown on August 1st 2025. You should upgrade to Composer 2. See https:\/\/blog.packagist.com\/shutting-down-packagist-org-support-for-composer-1-x\/", + "warning-versions": "<1.99", + "provider-includes": { + "p\/provider-2013$%hash%.json": { + "sha256": "c8f66b919e1bc413cf539ae5e1c3641aaa7201bb35236028083b6a29db54819f" + }, + "p\/provider-2014$%hash%.json": { + "sha256": "94ebaab6c9615b692bcd554dc13706cc5031b9a9627638bab9946fcbc9bf08a1" + }, + "p\/provider-2015$%hash%.json": { + "sha256": "2b1532a5da804f7436f2b3149e48dd759749d9f22ac96e3eefba8937a8b107b5" + }, + "p\/provider-2016$%hash%.json": { + "sha256": "5dc2ed83294c0276fb6fb5a8b4c54b352a2c2b47d6fbfb23aa1b4aa609582008" + }, + "p\/provider-2017$%hash%.json": { + "sha256": "ff924ce644237ec99649173d2c4837302c592a55d60da597c73ed242918be50d" + }, + "p\/provider-2018$%hash%.json": { + "sha256": "56e61c2baea4a692b533dba5b6886f654a3c3545e96463c6e4133073a829e7fa" + }, + "p\/provider-2019$%hash%.json": { + "sha256": "c262cdac424514f851f81246c8e0903ef7186ab6512bb4839b65a7ac8652d0b9" + }, + "p\/provider-2020$%hash%.json": { + "sha256": "3a86d50c668a7d53edffcdef112844a35436e914f8a7753a3e5f8d6c7b1dce4e" + }, + "p\/provider-2021$%hash%.json": { + "sha256": "b692808b8deebd71a240b47a75cc7e574dcb4c12716576cdb5d747341cc334af" + }, + "p\/provider-2022$%hash%.json": { + "sha256": "0accffd503220a2214fa75043b0a05dc50faea35dd8fe49a6bcf78abfa2a7c30" + }, + "p\/provider-2023$%hash%.json": { + "sha256": "fe0ecb56d5a8115fc2e1458d1b98a3b4d51d04f9e865919783e0be6651b7b251" + }, + "p\/provider-2024-01$%hash%.json": { + "sha256": "b38bb9babb5f7cdc083fe8e37bbef94742af7e9781f3ab9e576de08c5f605f84" + }, + "p\/provider-2024-04$%hash%.json": { + "sha256": "cabad2053691f922e76c894efac5ea6088afb58bd4ea648e71773d48260e51b1" + }, + "p\/provider-2024-07$%hash%.json": { + "sha256": "af17a240b260e3e701f5e6a1f5f90f2f492c8bc48105eaac4fc2a56e77fd2701" + }, + "p\/provider-2024-10$%hash%.json": { + "sha256": "7d947c5ebdcf0d5344611c49735ae7ca4a7e695526a85360a63273c83f8cc06f" + }, + "p\/provider-archived$%hash%.json": { + "sha256": "0c2739922be632b3788c5bddb8f33e90de9697641fe11f888a43afbad106457c" + }, + "p\/provider-latest$%hash%.json": { + "sha256": "6fe454899c10d7cc91d7aef76fb2f0c50dcc59f81882caa38b8be00c6b8717b8" + } + } +} \ No newline at end of file