From 7f8a8cb80bdfdf8b03049a214089a18626d394f0 Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Wed, 29 Apr 2020 16:17:11 +0200 Subject: [PATCH 01/12] Squashable 1 Signed-off-by: Tomas Langer --- .../java/io/helidon/config/BuilderImpl.java | 3 + .../main/java/io/helidon/config/Config.java | 45 +++ .../main/java/io/helidon/config/MpConfig.java | 289 +++++++++++++++ .../io/helidon/config/MpConfigBuilder.java | 336 +++++++++++++++++- .../config/MpConfigProviderResolver.java | 37 +- .../java/io/helidon/config/MpConfigTest.java | 121 +++++++ dependencies/pom.xml | 2 +- .../config/ConfigCdiExtension.java | 133 +++++-- .../microprofile/config/MutableMpTest.java | 4 +- 9 files changed, 920 insertions(+), 50 deletions(-) create mode 100644 config/config/src/main/java/io/helidon/config/MpConfig.java diff --git a/config/config/src/main/java/io/helidon/config/BuilderImpl.java b/config/config/src/main/java/io/helidon/config/BuilderImpl.java index 2153c58b2b3..523b991c3ea 100644 --- a/config/config/src/main/java/io/helidon/config/BuilderImpl.java +++ b/config/config/src/main/java/io/helidon/config/BuilderImpl.java @@ -187,6 +187,9 @@ public Config.Builder addStringMapper(Class type, Function map Objects.requireNonNull(type); Objects.requireNonNull(mapper); + if (String.class.equals(type)) { + return this; + } addMapper(type, config -> mapper.apply(config.asString().get())); return this; diff --git a/config/config/src/main/java/io/helidon/config/Config.java b/config/config/src/main/java/io/helidon/config/Config.java index 2772f0ba692..b84fb99025a 100644 --- a/config/config/src/main/java/io/helidon/config/Config.java +++ b/config/config/src/main/java/io/helidon/config/Config.java @@ -17,6 +17,7 @@ package io.helidon.config; import java.time.Instant; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -374,6 +375,50 @@ static Builder builder() { return new BuilderImpl(); } + /** + * This method allows use to use Helidon Config on top of an MP config. + * There is a limitation - the converters configured with MP config will not be available, unless + * the implementation is coming from Helidon. + * + * @param mpConfig MP Config instance + * @return a new Helidon config using only the mpConfig as its config source + */ + @SuppressWarnings("unchecked") + static Config create(org.eclipse.microprofile.config.Config mpConfig) { + if (mpConfig instanceof Config) { + return (Config) mpConfig; + } + + Builder builder = Config.builder() + .disableEnvironmentVariablesSource() + .disableSystemPropertiesSource() + .disableMapperServices() + .disableCaching() + .disableSourceServices() + .disableParserServices() + .disableFilterServices(); + + if (mpConfig instanceof MpConfig) { + ((MpConfig)mpConfig).converters() + .forEach((clazz, converter) -> { + Class cl = (Class) clazz; + builder.addStringMapper(cl, converter::convert); + }); + } + + Map allConfig = new HashMap<>(); + mpConfig.getPropertyNames() + .forEach(it -> { + // covering the condition where a config key disappears between getting the property names and requesting + // the value + Optional optionalValue = mpConfig.getOptionalValue(it, String.class); + optionalValue.ifPresent(value -> allConfig.put(it, value)); + }); + + return builder.addSource(ConfigSources.create(allConfig)) + .build(); + } + /** * Returns the {@code Context} instance associated with the current * {@code Config} node that allows the application to access the last loaded diff --git a/config/config/src/main/java/io/helidon/config/MpConfig.java b/config/config/src/main/java/io/helidon/config/MpConfig.java new file mode 100644 index 00000000000..ad9400ac698 --- /dev/null +++ b/config/config/src/main/java/io/helidon/config/MpConfig.java @@ -0,0 +1,289 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config; + +import java.lang.reflect.Array; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.eclipse.microprofile.config.Config; +import org.eclipse.microprofile.config.spi.ConfigSource; +import org.eclipse.microprofile.config.spi.Converter; + +public class MpConfig implements Config { + private static final Logger LOGGER = Logger.getLogger(MpConfig.class.getName()); + + private static final Pattern SPLIT_PATTERN = Pattern.compile("(? sources = new LinkedList<>(); + private final HashMap, Converter> converters = new LinkedHashMap<>(); + + MpConfig(List sources, HashMap, Converter> converters) { + this.sources.addAll(sources); + this.converters.putAll(converters); + this.converters.putIfAbsent(String.class, value -> value); + } + + @Override + public T getValue(String propertyName, Class propertyType) { + return getOptionalValue(propertyName, propertyType) + .orElseThrow(() -> new NoSuchElementException("Property \"" + propertyName + "\" is not available in " + + "configuration")); + } + + @SuppressWarnings("unchecked") + @Override + public Optional getOptionalValue(String propertyName, Class propertyType) { + // let's resolve arrays + if (propertyType.isArray()) { + Class componentType = propertyType.getComponentType(); + // first try to see if we have a direct value + Optional optionalValue = getOptionalValue(propertyName, String.class); + if (optionalValue.isPresent()) { + return Optional.of((T) toArray(propertyName, optionalValue.get(), componentType)); + } + + /* + we also support indexed value + e.g. for key "my.list" you can have both: + my.list=12,13,14 + or (not and): + my.list.0=12 + my.list.1=13 + */ + + String indexedConfigKey = propertyName + ".0"; + optionalValue = getOptionalValue(indexedConfigKey, String.class); + if (optionalValue.isPresent()) { + List result = new LinkedList<>(); + + // first element is already in + result.add(convert(indexedConfigKey, componentType, optionalValue.get())); + + // hardcoded limit to lists of 1000 elements + for (int i = 1; i < 1000; i++) { + indexedConfigKey = propertyName + "." + i; + optionalValue = getOptionalValue(indexedConfigKey, String.class); + if (optionalValue.isPresent()) { + result.add(convert(indexedConfigKey, componentType, optionalValue.get())); + } else { + // finish the iteration on first missing index + break; + } + } + Object array = Array.newInstance(componentType, result.size()); + for (int i = 0; i < result.size(); i++) { + Object component = result.get(i); + Array.set(array, i, component); + } + return Optional.of((T) array); + } else { + return Optional.empty(); + } + } else { + return sources.stream() + .map(it -> it.getValue(propertyName)) + .filter(Objects::nonNull) + .findFirst() + .map(it -> convert(propertyName, propertyType, it)); + } + } + + private Object toArray(String propertyName, String stringValue, Class componentType) { + String[] values = toArray(stringValue); + + Object array = Array.newInstance(componentType, values.length); + + for (int i = 0; i < values.length; i++) { + String value = values[i]; + Array.set(array, i, convert(propertyName, componentType, value)); + } + + return array; + } + + @Override + public Iterable getPropertyNames() { + Set names = new LinkedHashSet<>(); + for (ConfigSource source : sources) { + names.addAll(source.getPropertyNames()); + } + return names; + } + + @Override + public Iterable getConfigSources() { + return Collections.unmodifiableList(sources); + } + + /** + * Convert a String to a specific type. + * This is a helper method to allow for processing of default values that cannot be typed (e.g. in annotations). + * + * @param type type of the property + * @param value String value + * @param type + * @return instance of the correct type + * @throws java.lang.IllegalArgumentException in case the String provided cannot be converted to the type expected + */ + public T convert(String propertyName, Class type, String value) { + try { + return findConverter(type) + .convert(value); + } catch (Exception e) { + throw new IllegalArgumentException("Failed to convert property \"" + + propertyName + + "\" from its value \"" + + value + + "\" to " + + type.getName(), + e); + } + } + + @SuppressWarnings("unchecked") + private Converter findConverter(Class type) { + Converter converter = converters.get(type); + if (null != converter) { + return (Converter) converter; + } + + return converters.entrySet() + .stream() + .filter(it -> type.isAssignableFrom(it.getKey())) + .findFirst() + .map(Map.Entry::getValue) + .map(it -> (Converter) it) + .or(() -> findImplicit(type)) + .orElseGet(() -> new FailingConverter<>(type)); + } + + @SuppressWarnings("unchecked") + private Optional> findImplicit(Class type) { + // enums must be explicitly supported + if (Enum.class.isAssignableFrom(type)) { + return Optional.of(value -> { + Class enumClass = (Class) type; + return (T) Enum.valueOf(enumClass, value); + }); + } + // any class that has a "public static T method()" + Optional method = findMethod(type, "of", String.class) + .or(() -> findMethod(type, "valueOf", String.class)) + .or(() -> findMethod(type, "parse", CharSequence.class)) + .or(() -> findMethod(type, "parse", String.class)); + + if (method.isPresent()) { + Method m = method.get(); + return Optional.of(value -> { + try { + return (T) m.invoke(null, value); + } catch (Exception e) { + throw new IllegalArgumentException("Failed to convert to " + type.getName() + " using a static method", e); + } + }); + } + + // constructor with a single string parameter + try { + Constructor constructor = type.getConstructor(String.class); + if (constructor.canAccess(null)) { + return Optional.of(value -> { + try { + return constructor.newInstance(value); + } catch (Exception e) { + throw new IllegalArgumentException("Failed to convert to " + type.getName() + " using a constructor", e); + } + }); + } else { + LOGGER.finest("Constructor with String parameter is not accessible on type " + type); + } + } catch (NoSuchMethodException e) { + LOGGER.log(Level.FINEST, "There is no public constructor with string parameter on class " + type.getName(), e); + } + + return Optional.empty(); + } + + private Optional findMethod(Class type, String name, Class... parameterTypes) { + try { + Method result = type.getDeclaredMethod(name, parameterTypes); + if (!result.canAccess(null)) { + LOGGER.finest(() -> "Method " + name + "(" + Arrays + .toString(parameterTypes) + ") is not accessible on class " + type.getName()); + return Optional.empty(); + } + if (!Modifier.isStatic(result.getModifiers())) { + LOGGER.finest(() -> "Method " + name + "(" + Arrays + .toString(parameterTypes) + ") is not static on class " + type.getName()); + return Optional.empty(); + } + + return Optional.of(result); + } catch (NoSuchMethodException e) { + LOGGER.log(Level.FINEST, + "Method " + name + "(" + Arrays.toString(parameterTypes) + ") is not avilable on class " + type.getName(), + e); + return Optional.empty(); + } + } + + HashMap, Converter> converters() { + return converters; + } + + private static class FailingConverter implements Converter { + private Class type; + + private FailingConverter(Class type) { + this.type = type; + } + + @Override + public T convert(String value) { + throw new IllegalArgumentException("Cannot convert \"" + value + "\" to type " + type.getName()); + } + } + + static String[] toArray(String stringValue) { + String[] values = SPLIT_PATTERN.split(stringValue, -1); + + for (int i = 0; i < values.length; i++) { + String value = values[i]; + values[i] = ESCAPED_COMMA_PATTERN.matcher(value).replaceAll(Matcher.quoteReplacement(",")); + } + return values; + } +} diff --git a/config/config/src/main/java/io/helidon/config/MpConfigBuilder.java b/config/config/src/main/java/io/helidon/config/MpConfigBuilder.java index 369eacd5106..e367a104814 100644 --- a/config/config/src/main/java/io/helidon/config/MpConfigBuilder.java +++ b/config/config/src/main/java/io/helidon/config/MpConfigBuilder.java @@ -16,17 +16,50 @@ package io.helidon.config; +import java.io.IOException; +import java.io.InputStream; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.net.URL; +import java.net.URLConnection; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.ServiceLoader; +import java.util.Set; +import java.util.regex.Pattern; + +import io.helidon.common.serviceloader.Priorities; + import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.spi.ConfigBuilder; import org.eclipse.microprofile.config.spi.ConfigSource; +import org.eclipse.microprofile.config.spi.ConfigSourceProvider; import org.eclipse.microprofile.config.spi.Converter; /** * Configuration builder. */ public class MpConfigBuilder implements ConfigBuilder { + private static final Pattern DISALLOWED_CHARS = Pattern.compile("[^a-zA-Z0-9_]"); + private static final String UNDERSCORE = "_"; + private final BuilderImpl delegate = new BuilderImpl(); + private boolean useDefaultSources = false; + private boolean useDiscoveredSources = false; + private boolean useDiscoveredConverters = false; + + private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + private List sources = new LinkedList<>(); + private List converters = new LinkedList<>(); + + private boolean pureMp = true; + MpConfigBuilder() { delegate.disableSystemPropertiesSource(); delegate.disableEnvironmentVariablesSource(); @@ -37,52 +70,353 @@ public class MpConfigBuilder implements ConfigBuilder { @Override public ConfigBuilder addDefaultSources() { delegate.mpAddDefaultSources(); + useDefaultSources = true; return this; } @Override public ConfigBuilder addDiscoveredSources() { delegate.mpAddDiscoveredSources(); + useDiscoveredSources = true; return this; } @Override public ConfigBuilder addDiscoveredConverters() { delegate.mpAddDiscoveredConverters(); + useDiscoveredConverters = true; return this; } @Override public ConfigBuilder forClassLoader(ClassLoader loader) { delegate.mpForClassLoader(loader); + this.classLoader = loader; return this; } @Override public ConfigBuilder withSources(ConfigSource... sources) { delegate.mpWithSources(sources); + for (ConfigSource source : sources) { + this.sources.add(new OrdinalSource(source)); + } return this; } @Override public ConfigBuilder withConverter(Class aClass, int ordinal, Converter converter) { delegate.mpWithConverter(aClass, ordinal, converter); + this.converters.add(new OrdinalConverter(converter, aClass, ordinal)); return this; } @Override public ConfigBuilder withConverters(Converter... converters) { delegate.mpWithConverters(converters); + for (Converter converter : converters) { + this.converters.add(new OrdinalConverter(converter)); + } return this; } @Override public Config build() { - return delegate.build(); + if (pureMp) { + if (useDefaultSources) { + sources.add(new OrdinalSource(new MpSystemPropertiesSource(), 400)); + sources.add(new OrdinalSource(new MpEnvironmentVariablesSource(), 300)); + // microprofile-config.properties + try { + classLoader.getResources("META-INF/microprofile-config.properties") + .asIterator() + .forEachRemaining(it -> { + sources.add(new OrdinalSource(new MpPropertiesSource(it))); + }); + } catch (IOException e) { + throw new IllegalStateException("Failed to read microprofile-config.properties from classpath"); + } + } + + // built-in converters + converters.add(new OrdinalConverter(MpConfigBuilder::toBoolean, Boolean.class, 1)); + converters.add(new OrdinalConverter(MpConfigBuilder::toBoolean, Boolean.TYPE, 1)); + converters.add(new OrdinalConverter(Byte::parseByte, Byte.class, 1)); + converters.add(new OrdinalConverter(Byte::parseByte, Byte.TYPE, 1)); + converters.add(new OrdinalConverter(Short::parseShort, Short.class, 1)); + converters.add(new OrdinalConverter(Short::parseShort, Short.TYPE, 1)); + converters.add(new OrdinalConverter(Integer::parseInt, Integer.class, 1)); + converters.add(new OrdinalConverter(Integer::parseInt, Integer.TYPE, 1)); + converters.add(new OrdinalConverter(Long::parseLong, Long.class, 1)); + converters.add(new OrdinalConverter(Long::parseLong, Long.TYPE, 1)); + converters.add(new OrdinalConverter(Float::parseFloat, Float.class, 1)); + converters.add(new OrdinalConverter(Float::parseFloat, Float.TYPE, 1)); + converters.add(new OrdinalConverter(Double::parseDouble, Double.class, 1)); + converters.add(new OrdinalConverter(Double::parseDouble, Double.TYPE, 1)); + converters.add(new OrdinalConverter(MpConfigBuilder::toChar, Character.class, 1)); + converters.add(new OrdinalConverter(MpConfigBuilder::toChar, Character.TYPE, 1)); + converters.add(new OrdinalConverter(MpConfigBuilder::toClass, Class.class, 1)); + + if (useDiscoveredConverters) { + ServiceLoader.load(Converter.class) + .forEach(it -> converters.add(new OrdinalConverter(it))); + } + + if (useDiscoveredSources) { + ServiceLoader.load(ConfigSource.class) + .forEach(it -> sources.add(new OrdinalSource(it))); + + ServiceLoader.load(ConfigSourceProvider.class) + .forEach(it -> { + it.getConfigSources(classLoader) + .forEach(source -> sources.add(new OrdinalSource(source))); + }); + } + + // now it is from lowest to highest + sources.sort(Comparator.comparingInt(o -> o.ordinal)); + converters.sort(Comparator.comparingInt(o -> o.ordinal)); + + // revert to have the first one the most significant + Collections.reverse(sources); + Collections.reverse(converters); + + List sources = new LinkedList<>(); + HashMap, Converter> converters = new HashMap<>(); + + this.sources.forEach(ordinal -> sources.add(ordinal.source)); + this.converters.forEach(ordinal -> converters.putIfAbsent(ordinal.type, ordinal.converter)); + + return new MpConfig(sources, converters); + } else { + return delegate.build(); + } } ConfigBuilder metaConfig(io.helidon.config.Config metaConfig) { + pureMp = false; delegate.config(metaConfig); return this; } + + private static Class toClass(String stringValue) { + try { + return Class.forName(stringValue); + } catch (ClassNotFoundException e) { + throw new IllegalArgumentException("Failed to convert property " + stringValue + " to class", e); + } + } + + private static char toChar(String stringValue) { + if (stringValue.length() != 1) { + throw new IllegalArgumentException("The string to map must be a single character, but is: " + stringValue); + } + return stringValue.charAt(0); + } + + private static Boolean toBoolean(String stringValue) { + final String lower = stringValue.toLowerCase(); + // according to microprofile config specification (section Built-in Converters) + switch (lower) { + case "true": + case "1": + case "yes": + case "y": + case "on": + return true; + default: + return false; + } + } + + private static class OrdinalSource { + private final int ordinal; + private final ConfigSource source; + + + private OrdinalSource(ConfigSource source) { + this.source = source; + this.ordinal = findOrdinal(source); + } + + private OrdinalSource(ConfigSource source, int ordinal) { + this.ordinal = ordinal; + this.source = source; + } + + private static int findOrdinal(ConfigSource source) { + int ordinal = source.getOrdinal(); + if (ordinal == ConfigSource.DEFAULT_ORDINAL) { + return Priorities.find(source, ConfigSource.DEFAULT_ORDINAL); + } + return ordinal; + } + } + + private static class OrdinalConverter { + private final int ordinal; + private final Class type; + private final Converter converter; + + private OrdinalConverter(Converter converter, Class aClass, int ordinal) { + this.ordinal = ordinal; + this.type = aClass; + this.converter = converter; + } + + private OrdinalConverter(Converter converter) { + this(converter, getConverterType(converter.getClass()), Priorities.find(converter, 100)); + } + } + + private static Class getConverterType(Class converterClass) { + Class type = doGetType(converterClass); + if (null == type) { + throw new IllegalArgumentException("Converter " + converterClass + " must be a ParameterizedType."); + } + return type; + } + + private static Class doGetType(Class clazz) { + if (clazz.equals(Object.class)) { + return null; + } + + Type[] genericInterfaces = clazz.getGenericInterfaces(); + for (Type genericInterface : genericInterfaces) { + if (genericInterface instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) genericInterface; + if (pt.getRawType().equals(Converter.class)) { + Type[] typeArguments = pt.getActualTypeArguments(); + if (typeArguments.length != 1) { + throw new IllegalStateException("Converter " + clazz + " must be a ParameterizedType."); + } + Type typeArgument = typeArguments[0]; + if (typeArgument instanceof Class) { + return (Class) typeArgument; + } + throw new IllegalStateException("Converter " + clazz + " must convert to a class, not " + typeArgument); + } + } + } + + return doGetType(clazz.getSuperclass()); + } + + private static class MpSystemPropertiesSource implements ConfigSource { + private final Properties props; + + private MpSystemPropertiesSource() { + this.props = System.getProperties(); + } + + @Override + public Map getProperties() { + Set strings = props.stringPropertyNames(); + + Map result = new HashMap<>(); + strings.forEach(it -> result.put(it, props.getProperty(it))); + return result; + } + + @Override + public String getValue(String propertyName) { + return props.getProperty(propertyName); + } + + @Override + public String getName() { + return "System Properties"; + } + } + + private static class MpEnvironmentVariablesSource implements ConfigSource { + private final Map env; + + private MpEnvironmentVariablesSource() { + this.env = System.getenv(); + System.out.println("Setting up evn with: " + env); + } + + @Override + public Map getProperties() { + return env; + } + + @Override + public String getValue(String propertyName) { + // According to the spec, we have three ways of looking for a property + // 1. Exact match + String result = env.get(propertyName); + if (null != result) { + System.out.println("Returning " + result + " for " + propertyName); + return result; + } + // 2. replace non alphanumeric characters with _ + String rule2 = rule2(propertyName); + result = env.get(rule2); + if (null != result) { + System.out.println("Returning " + result + " for " + rule2); + return result; + } + // 3. replace same as above, but uppercase + String rule3 = rule2.toUpperCase(); + result = env.get(rule3); + System.out.println("Returning " + result + " for " + rule3); + return result; + } + + @Override + public String getName() { + return "Environment Variables"; + } + + /** + * Rule #2 states: Replace each character that is neither alphanumeric nor _ with _ (i.e. com_ACME_size). + * + * @param propertyName name of property as requested by user + * @return name of environment variable we look for + */ + private static String rule2(String propertyName) { + return DISALLOWED_CHARS.matcher(propertyName).replaceAll(UNDERSCORE); + } + } + + private class MpPropertiesSource implements ConfigSource { + private final Map props = new HashMap<>(); + private final String name; + + private MpPropertiesSource(URL it) { + this.name = it.toString(); + + try { + URLConnection urlConnection = it.openConnection(); + try (InputStream inputStream = urlConnection.getInputStream()) { + Properties properties = new Properties(); + properties.load(inputStream); + + properties.stringPropertyNames() + .forEach(prop -> props.put(prop, properties.getProperty(prop))); + } + } catch (Exception e) { + throw new ConfigException("Failed to load ", e); + } + + } + + @Override + public Map getProperties() { + return Collections.unmodifiableMap(props); + } + + @Override + public String getValue(String propertyName) { + return props.get(propertyName); + } + + @Override + public String getName() { + return "Properties: " + name; + } + } } diff --git a/config/config/src/main/java/io/helidon/config/MpConfigProviderResolver.java b/config/config/src/main/java/io/helidon/config/MpConfigProviderResolver.java index fa1865fc8e0..b045a481868 100644 --- a/config/config/src/main/java/io/helidon/config/MpConfigProviderResolver.java +++ b/config/config/src/main/java/io/helidon/config/MpConfigProviderResolver.java @@ -144,13 +144,11 @@ private ConfigDelegate doRegisterConfig(Config config, ClassLoader classLoader) config = ((ConfigDelegate) config).delegate(); } - io.helidon.config.Config helidonConfig = (io.helidon.config.Config) config; - if (null != currentConfig) { - currentConfig.set(helidonConfig); + currentConfig.set(config); } - ConfigDelegate newConfig = new ConfigDelegate(helidonConfig); + ConfigDelegate newConfig = new ConfigDelegate(config); CONFIGS.put(classLoader, newConfig); return newConfig; @@ -192,18 +190,29 @@ public void releaseConfig(Config config) { * that hold a reference to configuration obtained at build time. */ public static final class ConfigDelegate implements io.helidon.config.Config, Config { - private AtomicReference delegate; + private final AtomicReference delegate = new AtomicReference<>(); + private final AtomicReference helidonDelegate = new AtomicReference<>(); + + private ConfigDelegate(Config delegate) { + set(delegate); + } - private ConfigDelegate(io.helidon.config.Config delegate) { - this.delegate = new AtomicReference<>(delegate); + private void set(Config delegate) { + this.delegate.set(delegate); + if (delegate instanceof io.helidon.config.Config) { + this.helidonDelegate.set((io.helidon.config.Config) delegate); + } else { + this.helidonDelegate.set(io.helidon.config.Config.create(delegate)); + } } private void set(io.helidon.config.Config newDelegate) { - this.delegate.set(newDelegate); + this.delegate.set((Config) newDelegate); + this.helidonDelegate.set(newDelegate); } private io.helidon.config.Config getCurrent() { - return delegate.get().context().last(); + return helidonDelegate.get().context().last(); } @Override @@ -283,22 +292,22 @@ public ConfigValue> asMap() throws MissingValueException { @Override public T getValue(String propertyName, Class propertyType) { - return ((Config) getCurrent()).getValue(propertyName, propertyType); + return delegate.get().getValue(propertyName, propertyType); } @Override public Optional getOptionalValue(String propertyName, Class propertyType) { - return ((Config) getCurrent()).getOptionalValue(propertyName, propertyType); + return delegate.get().getOptionalValue(propertyName, propertyType); } @Override public Iterable getPropertyNames() { - return ((Config) getCurrent()).getPropertyNames(); + return delegate.get().getPropertyNames(); } @Override public Iterable getConfigSources() { - return ((Config) getCurrent()).getConfigSources(); + return delegate.get().getConfigSources(); } /** @@ -307,7 +316,7 @@ public Iterable getConfigSources() { * @return the instance backing this config delegate */ public Config delegate() { - return (Config) getCurrent(); + return delegate.get(); } } } diff --git a/config/config/src/test/java/io/helidon/config/MpConfigTest.java b/config/config/src/test/java/io/helidon/config/MpConfigTest.java index f43889023f5..43132cb35b7 100644 --- a/config/config/src/test/java/io/helidon/config/MpConfigTest.java +++ b/config/config/src/test/java/io/helidon/config/MpConfigTest.java @@ -18,17 +18,22 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; import org.eclipse.microprofile.config.Config; +import org.eclipse.microprofile.config.spi.ConfigProviderResolver; import org.eclipse.microprofile.config.spi.ConfigSource; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import static org.hamcrest.CoreMatchers.instanceOf; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.arrayContaining; +import static org.hamcrest.Matchers.arrayWithSize; import static org.hamcrest.Matchers.hasSize; /** @@ -98,4 +103,120 @@ void testIntArray() { Integer[] values = config.getValue("mp-list", Integer[].class); assertThat(values, arrayContaining(1, 2, 3)); } + + @Test + void mutableTest() { + // THIS MUST WORK - the spec says the sources can be mutable and config must use the latest values + var mutable = new MutableConfigSource(); + + Config config = ConfigProviderResolver.instance().getBuilder() + .withSources(mutable) + .build(); + + String value = config.getValue("key", String.class); + assertThat(value, is("initial")); + + String updated = "updated"; + mutable.set(updated); + value = config.getValue("key", String.class); + assertThat(value, is(updated)); + } + + @Test + void arrayTest() { + MutableConfigSource cs = new MutableConfigSource(); + cs.set("large:cheese\\,mushroom,medium:chicken,small:pepperoni"); + Config config = ConfigProviderResolver.instance().getBuilder() + .withConverter(Pizza.class, 10, value -> { + String[] parts = value.split(":"); + if (parts.length == 2) { + String size = parts[0]; + String flavor = parts[1]; + return new Pizza(flavor, size); + } + + return null; + }) + .withSources(cs) + .build(); + + Pizza[] value = config.getValue("key", + Pizza[].class); + + assertThat(value, notNullValue()); + assertThat(value, arrayWithSize(3)); + assertThat(value, is(new Pizza[] { + new Pizza("cheese,mushroom", "large"), + new Pizza("chicken", "medium"), + new Pizza("pepperoni", "small") + })); + } + + private static class MutableConfigSource implements ConfigSource { + private AtomicReference value = new AtomicReference<>("initial"); + + @Override + public Map getProperties() { + return Map.of("key", value.get()); + } + + @Override + public String getValue(String propertyName) { + if ("key".equals(propertyName)) { + return value.get(); + } + return null; + } + + @Override + public String getName() { + return getClass().getName(); + } + + private void set(String value) { + this.value.set(value); + } + } + + public static class Pizza { + private String flavor; + private String size; + + public Pizza(String flavour, String size) { + this.flavor = flavour; + this.size = size; + } + + public String getSize() { + return size; + } + + public String getFlavor() { + return flavor; + } + + @Override + public String toString() { + return flavor + ":" + size; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + Pizza pizza = (Pizza) o; + return flavor.equals(pizza.flavor) && + size.equals(pizza.size); + } + + @Override + public int hashCode() { + return Objects.hash(flavor, size); + } + } } + diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 583c6fca0ae..34c29a8ee93 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -79,7 +79,7 @@ 1.1.6 5.6.2 2.10 - 1.3 + 1.4 2.1 1.1.1 2.2 diff --git a/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java b/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java index c5e2cd18b58..31e41bedba8 100644 --- a/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java +++ b/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java @@ -26,7 +26,6 @@ import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.LinkedList; @@ -38,6 +37,8 @@ import java.util.Set; import java.util.function.Supplier; import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.stream.Collectors; import javax.enterprise.context.ApplicationScoped; @@ -62,19 +63,21 @@ import io.helidon.common.HelidonFeatures; import io.helidon.common.HelidonFlavor; import io.helidon.common.NativeImageHelper; -import io.helidon.config.Config; -import io.helidon.config.MissingValueException; +import io.helidon.config.MpConfig; +import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.ConfigProvider; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.config.spi.ConfigSource; /** - * Extension to enable config injection in CDI container (all of {@link Config}, {@link org.eclipse.microprofile.config.Config} - * and {@link ConfigProperty}). + * Extension to enable config injection in CDI container (all of {@link io.helidon.config.Config}, + * {@link org.eclipse.microprofile.config.Config} and {@link ConfigProperty}). */ public class ConfigCdiExtension implements Extension { private static final Logger LOGGER = Logger.getLogger(ConfigCdiExtension.class.getName()); + private static final Pattern SPLIT_PATTERN = Pattern.compile("(? annotationType() { } private final List ips = new LinkedList<>(); - private Config runtimeHelidonConfig; /** * Constructor invoked by CDI container. @@ -233,7 +235,7 @@ private Object produce(InjectionPoint ip) { // this is build-time of native-image - e.g. run from command line or maven // logging may not be working/configured to deliver this message as it should System.err.println("You are accessing configuration key '" + configKey + "' during" - + " container initialization. This will not work nice with Graal native-image"); + + " container initialization. This will not work nicely with Graal native-image"); } Type type = ip.getType(); @@ -255,7 +257,7 @@ any java class (except for parameterized types) Map - a detached key/value mapping of whole subtree */ FieldTypes fieldTypes = FieldTypes.create(type); - Config config = (Config) ConfigProvider.getConfig(); + org.eclipse.microprofile.config.Config config = ConfigProvider.getConfig(); String defaultValue = defaultValue(annotation); Object value = configValue(config, fieldTypes, configKey, defaultValue); @@ -284,9 +286,29 @@ private Object configValue(Config config, FieldTypes fieldTypes, String configKe } private static T withDefault(Config config, String key, Class type, String defaultValue) { - return config.get(key) - .as(type) - .orElseGet(() -> (null == defaultValue) ? null : config.convert(type, defaultValue)); + return config.getOptionalValue(key, type) + .orElseGet(() -> convert(key, config, defaultValue, type)); + } + + @SuppressWarnings("unchecked") + private static T convert(String key, Config config, String value, Class type) { + if (null == value) { + return null; + } + if (String.class.equals(type)) { + return (T) value; + } + if (config instanceof io.helidon.config.Config) { + return ((io.helidon.config.Config) config).convert(type, value); + } + if (config instanceof MpConfig) { + return ((MpConfig) config).convert(key, type, value); + } + + throw new IllegalArgumentException("Helidon CDI MP Config implementation requires Helidon config instance. " + + "Current config is " + config.getClass().getName() + + ", which is not supported, as we cannot convert arbitrary String values"); + } private static Object parameterizedConfigValue(Config config, @@ -321,7 +343,13 @@ private static Object parameterizedConfigValue(Config config, typeArg2); } } else if (Map.class.isAssignableFrom(rawType)) { - return config.get(configKey).detach().asMap().get(); + Map result = new HashMap<>(); + config.getPropertyNames() + .forEach(name -> { + // workaround for race condition (if key disappears from source after we call getPropertyNames + config.getOptionalValue(name, String.class).ifPresent(value -> result.put(name, value)); + }); + return result; } else if (Set.class.isAssignableFrom(rawType)) { return new LinkedHashSet<>(asList(config, configKey, typeArg, defaultValue)); } else { @@ -330,32 +358,71 @@ private static Object parameterizedConfigValue(Config config, } } - private static List asList(Config config, String configKey, Class typeArg, String defaultValue) { - try { - return config.get(configKey).asList(typeArg).get(); - } catch (MissingValueException e) { - // if default - if (null == defaultValue) { - //noinspection ThrowInsideCatchBlockWhichIgnoresCaughtException - throw new NoSuchElementException("Missing list value for key " - + configKey - + ", original message: " - + e.getMessage()); - } else { - if (defaultValue.isEmpty()) { - return Collections.emptyList(); - } + static String[] toArray(String stringValue) { + String[] values = SPLIT_PATTERN.split(stringValue, -1); - List result = new LinkedList<>(); + for (int i = 0; i < values.length; i++) { + String value = values[i]; + values[i] = ESCAPED_COMMA_PATTERN.matcher(value).replaceAll(Matcher.quoteReplacement(",")); + } + return values; + } - String[] values = defaultValue.split(","); - for (String value : values) { - result.add(config.convert(typeArg, value)); - } + private static List asList(Config config, String configKey, Class typeArg, String defaultValue) { + // first try to see if we have a direct value + Optional optionalValue = config.getOptionalValue(configKey, String.class); + if (optionalValue.isPresent()) { + return toList(configKey, config, optionalValue.get(), typeArg); + } - return result; + /* + we also support indexed value + e.g. for key "my.list" you can have both: + my.list=12,13,14 + or (not and): + my.list.0=12 + my.list.1=13 + */ + + String indexedConfigKey = configKey + ".0"; + optionalValue = config.getOptionalValue(indexedConfigKey, String.class); + if (optionalValue.isPresent()) { + List result = new LinkedList<>(); + + // first element is already in + result.add(convert(indexedConfigKey, config, optionalValue.get(), typeArg)); + + // hardcoded limit to lists of 1000 elements + for (int i = 1; i < 1000; i++) { + indexedConfigKey = configKey + "." + i; + optionalValue = config.getOptionalValue(indexedConfigKey, String.class); + if (optionalValue.isPresent()) { + result.add(convert(indexedConfigKey, config, optionalValue.get(), typeArg)); + } else { + // finish the iteration on first missing index + break; + } } + return result; + } else { + if (null == defaultValue) { + throw new NoSuchElementException("Missing list value for key " + configKey); + } + + return toList(configKey, config, defaultValue, typeArg); + } + } + + private static List toList(String configKey, Config config, String stringValue, Class typeArg) { + if (stringValue.isEmpty()) { + return List.of(); + } + // we have a comma separated list + List result = new LinkedList<>(); + for (String value : toArray(stringValue)) { + result.add(convert(configKey, config, value, typeArg)); } + return result; } private String defaultValue(ConfigProperty annotation) { diff --git a/microprofile/config/src/test/java/io/helidon/microprofile/config/MutableMpTest.java b/microprofile/config/src/test/java/io/helidon/microprofile/config/MutableMpTest.java index fca589467ae..4cdc273bfa0 100644 --- a/microprofile/config/src/test/java/io/helidon/microprofile/config/MutableMpTest.java +++ b/microprofile/config/src/test/java/io/helidon/microprofile/config/MutableMpTest.java @@ -118,7 +118,9 @@ public String getName() { public void setValue(String value) { this.value.set(value); - listener.accept("value", value); + if (null != listener) { + listener.accept("value", value); + } } } } From 43bb44d59760dae263006ba1085140c8d4847fb6 Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Mon, 4 May 2020 17:06:31 +0200 Subject: [PATCH 02/12] Priorities update and pom fixes, webserver better error message on port conflict. Signed-off-by: Tomas Langer --- common/metrics/pom.xml | 7 - .../common/serviceloader/Priorities.java | 18 ++- .../common/serviceloader/PrioritiesTest.java | 126 ++++++++++++++++++ dependencies/pom.xml | 33 +++++ integrations/cdi/jpa-cdi/pom.xml | 4 +- metrics/metrics/pom.xml | 7 - microprofile/fault-tolerance/pom.xml | 7 - .../jwt/auth/JwtAuthProvider.java | 12 ++ 8 files changed, 189 insertions(+), 25 deletions(-) create mode 100644 common/service-loader/src/test/java/io/helidon/common/serviceloader/PrioritiesTest.java diff --git a/common/metrics/pom.xml b/common/metrics/pom.xml index 606a3f8335e..3fd541fe7d0 100644 --- a/common/metrics/pom.xml +++ b/common/metrics/pom.xml @@ -39,14 +39,7 @@ org.eclipse.microprofile.metrics microprofile-metrics-api - ${version.lib.microprofile-metrics-api} provided - - - org.osgi - org.osgi.annotation.versioning - - diff --git a/common/service-loader/src/main/java/io/helidon/common/serviceloader/Priorities.java b/common/service-loader/src/main/java/io/helidon/common/serviceloader/Priorities.java index 411e1a138aa..ffd8340afa3 100644 --- a/common/service-loader/src/main/java/io/helidon/common/serviceloader/Priorities.java +++ b/common/service-loader/src/main/java/io/helidon/common/serviceloader/Priorities.java @@ -89,12 +89,26 @@ public static void sort(List list) { * @param defaultPriority default priority for elements that do not have it */ public static void sort(List list, int defaultPriority) { - list.sort(Comparator.comparingInt(it -> { + list.sort(priorityComparator(defaultPriority)); + } + + /** + * Returns a comparator for two objects, the classes for which are implementations of + * {@link io.helidon.common.Prioritized}, and/or optionally annotated with {@link javax.annotation.Priority} + * and which applies a specified default priority if either or both classes lack the annotation. + * + * @param type of object being compared + * @param defaultPriority used if the classes for either or both objects + * lack the {@code Priority} annotation + * @return comparator + */ + public static Comparator priorityComparator(int defaultPriority) { + return Comparator.comparingInt(it -> { if (it instanceof Class) { return find((Class) it, defaultPriority); } else { return find(it, defaultPriority); } - })); + }); } } diff --git a/common/service-loader/src/test/java/io/helidon/common/serviceloader/PrioritiesTest.java b/common/service-loader/src/test/java/io/helidon/common/serviceloader/PrioritiesTest.java new file mode 100644 index 00000000000..bebc3e03505 --- /dev/null +++ b/common/service-loader/src/test/java/io/helidon/common/serviceloader/PrioritiesTest.java @@ -0,0 +1,126 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.common.serviceloader; + +import java.util.ArrayList; +import java.util.List; + +import javax.annotation.Priority; + +import io.helidon.common.Prioritized; + +import org.junit.jupiter.api.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class PrioritiesTest { + @Test + void testSort() { + List services = new ArrayList<>(5); + services.add(new DefaultPriority()); + services.add(new VeryLowPriority()); + services.add(new LowestPriority()); + services.add(new HigherPriority()); + services.add(new LowerPriority()); + + Priorities.sort(services, 100); + + validate(services); + } + + @Test + void testComparator() { + List services = new ArrayList<>(5); + // intentionally different order than in other methods, to make sure it is not working "by accident" + services.add(new LowestPriority()); + services.add(new LowerPriority()); + services.add(new VeryLowPriority()); + services.add(new HigherPriority()); + services.add(new DefaultPriority()); + + services.sort(Priorities.priorityComparator(100)); + + validate(services); + } + + private void validate(List services) { + assertThat("There must be 5 services in the list", services.size(), is(5)); + assertThat(services.get(0).getIt(), is(HigherPriority.IT)); + assertThat(services.get(1).getIt(), is(LowerPriority.IT)); + assertThat(services.get(2).getIt(), is(DefaultPriority.IT)); + assertThat(services.get(3).getIt(), is(VeryLowPriority.IT)); + assertThat(services.get(4).getIt(), is(LowestPriority.IT)); + } + + private interface Service { + String getIt(); + } + + @Priority(1) + private static class HigherPriority implements Service { + private static final String IT = "higher"; + + @Override + public String getIt() { + return IT; + } + } + + @Priority(2) + private static class LowerPriority implements Service { + private static final String IT = "lower"; + + @Override + public String getIt() { + return IT; + } + } + + private static class DefaultPriority implements Service { + private static final String IT = "default"; + + @Override + public String getIt() { + return IT; + } + } + + @Priority(101) + private static class VeryLowPriority implements Service { + private static final String IT = "veryLow"; + + @Override + public String getIt() { + return IT; + } + } + + private static class LowestPriority implements Service, Prioritized { + private static final String IT = "lowest"; + + @Override + public String getIt() { + return IT; + } + + @Override + public int priority() { + return 1000; + } + } +} diff --git a/dependencies/pom.xml b/dependencies/pom.xml index 34c29a8ee93..6f371c29c5a 100644 --- a/dependencies/pom.xml +++ b/dependencies/pom.xml @@ -601,6 +601,39 @@ + + org.eclipse.microprofile.metrics + microprofile-metrics-api + ${version.lib.microprofile-metrics-api} + + + org.osgi + org.osgi.annotation.versioning + + + + + org.eclipse.microprofile.metrics + microprofile-metrics-rest-tck + ${version.lib.microprofile-metrics-api} + + + org.jboss.arquillian.junit + arquillian-junit-container + + + + + org.eclipse.microprofile.metrics + microprofile-metrics-api-tck + ${version.lib.microprofile-metrics-api} + + + org.jboss.arquillian.junit + arquillian-junit-container + + + org.eclipse.microprofile.reactive-streams-operators microprofile-reactive-streams-operators-api diff --git a/integrations/cdi/jpa-cdi/pom.xml b/integrations/cdi/jpa-cdi/pom.xml index 008c03fbfaf..fde2b7e7bab 100644 --- a/integrations/cdi/jpa-cdi/pom.xml +++ b/integrations/cdi/jpa-cdi/pom.xml @@ -77,8 +77,8 @@ test - io.helidon.microprofile.config - helidon-microprofile-config + io.helidon.microprofile.cdi + helidon-microprofile-cdi test diff --git a/metrics/metrics/pom.xml b/metrics/metrics/pom.xml index 04c69aab999..f40f5c8a3b5 100644 --- a/metrics/metrics/pom.xml +++ b/metrics/metrics/pom.xml @@ -49,13 +49,6 @@ org.eclipse.microprofile.metrics microprofile-metrics-api - ${version.lib.microprofile-metrics-api} - - - org.osgi - org.osgi.annotation.versioning - - io.helidon.webserver diff --git a/microprofile/fault-tolerance/pom.xml b/microprofile/fault-tolerance/pom.xml index 962e37df85f..da0caca3c2b 100644 --- a/microprofile/fault-tolerance/pom.xml +++ b/microprofile/fault-tolerance/pom.xml @@ -65,14 +65,7 @@ org.eclipse.microprofile.metrics microprofile-metrics-api - ${version.lib.microprofile-metrics-api} provided - - - org.osgi - org.osgi.annotation.versioning - - com.netflix.hystrix diff --git a/microprofile/jwt-auth/src/main/java/io/helidon/microprofile/jwt/auth/JwtAuthProvider.java b/microprofile/jwt-auth/src/main/java/io/helidon/microprofile/jwt/auth/JwtAuthProvider.java index c1529415f2a..349436fb6f8 100644 --- a/microprofile/jwt-auth/src/main/java/io/helidon/microprofile/jwt/auth/JwtAuthProvider.java +++ b/microprofile/jwt-auth/src/main/java/io/helidon/microprofile/jwt/auth/JwtAuthProvider.java @@ -881,6 +881,18 @@ public Builder config(Config config) { mpConfig.getOptionalValue(CONFIG_PUBLIC_KEY_PATH, String.class).ifPresent(this::publicKeyPath); mpConfig.getOptionalValue(CONFIG_EXPECTED_ISSUER, String.class).ifPresent(this::expectedIssuer); + if (null == publicKey && null == publicKeyPath) { + // this is a fix for incomplete TCK tests + // we will configure this location in our tck configuration + String key = "helidon.mp.jwt.verify.publickey.location"; + mpConfig.getOptionalValue(key, String.class).ifPresent(it -> { + publicKeyPath(it); + LOGGER.warning("You have configured public key for JWT-Auth provider using a property" + + " reserved for TCK tests (" + key + "). Please use " + + CONFIG_PUBLIC_KEY_PATH + " instead."); + }); + } + return this; } From 8c3d92f87b8adccc97d561b7b52b6531113326d7 Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Mon, 4 May 2020 17:53:40 +0200 Subject: [PATCH 03/12] New config MP module and code style fixes. Updated TCK support. Signed-off-by: Tomas Langer --- bom/pom.xml | 5 + .../common/serviceloader/Priorities.java | 2 +- .../test-mp-reference => config-mp}/pom.xml | 35 +- .../java/io/helidon/config/mp/MpConfig.java | 77 ++++ .../io/helidon/config/mp/MpConfigBuilder.java | 267 +++++++++++ .../io/helidon/config/mp/MpConfigImpl.java} | 193 ++++++-- .../config/mp}/MpConfigProviderResolver.java | 25 +- .../io/helidon/config/mp/MpConfigSources.java | 255 +++++++++++ .../mp/MpEnvironmentVariablesSource.java | 90 ++++ .../config/mp/MpHelidonConfigSource.java | 51 +++ .../io/helidon/config/mp/MpHelidonSource.java | 137 ++++++ .../io/helidon/config/mp/MpMapSource.java | 50 +++ .../config/mp/MpSystemPropertiesSource.java | 54 +++ .../io/helidon/config/mp/package-info.java} | 20 +- .../helidon/config/mp/spi/MpConfigFilter.java | 47 ++ .../helidon/config/mp/spi/package-info.java | 20 + .../config-mp/src/main/java/module-info.java | 38 ++ ...oprofile.config.spi.ConfigProviderResolver | 4 +- .../config/mp}/MpConfigReferenceTest.java | 13 +- .../config/mp/MpConfigSourcesTest.java | 219 +++++++++ .../io/helidon/config/mp}/MpConfigTest.java | 61 ++- .../META-INF/microprofile-config.properties | 4 + config/config/pom.xml | 4 - .../io/helidon/config/AbstractConfigImpl.java | 144 +----- .../config/AbstractConfigSourceBuilder.java | 2 +- .../config/AbstractNodeBuilderImpl.java | 9 +- .../helidon/config/AbstractSourceBuilder.java | 2 +- .../java/io/helidon/config/BuilderImpl.java | 276 ++---------- .../main/java/io/helidon/config/Config.java | 62 +-- .../java/io/helidon/config/ConfigDiff.java | 3 +- .../java/io/helidon/config/ConfigFactory.java | 19 +- .../java/io/helidon/config/ConfigHelper.java | 83 +--- .../io/helidon/config/ConfigLeafImpl.java | 4 +- .../java/io/helidon/config/ConfigMappers.java | 162 ++++--- .../config/ConfigSourceMpRuntimeImpl.java | 101 ----- .../helidon/config/ConfigSourceRuntime.java | 11 +- .../config/ConfigSourceRuntimeImpl.java | 63 +-- .../helidon/config/ConfigSourcesRuntime.java | 22 +- .../java/io/helidon/config/ConfigUtils.java | 123 ----- .../java/io/helidon/config/ConfigValue.java | 6 +- .../java/io/helidon/config/ConfigValues.java | 4 +- .../helidon/config/ListNodeBuilderImpl.java | 5 - .../io/helidon/config/MpConfigBuilder.java | 422 ------------------ .../helidon/config/ObjectNodeBuilderImpl.java | 5 - .../java/io/helidon/config/ProviderImpl.java | 16 +- .../io/helidon/config/UrlOverrideSource.java | 2 +- .../helidon/config/ValueResolvingFilter.java | 2 +- .../config/spi/ChangeWatcherProvider.java | 2 +- .../config/spi/FallbackMergingStrategy.java | 11 +- .../helidon/config/spi/OrderedProperties.java | 6 +- .../java/io/helidon/config/spi/SpiHelper.java | 2 +- config/config/src/main/java/module-info.java | 11 +- .../config/AutoLoadedConfigPriority.java | 8 +- .../io/helidon/config/ConfigHelperTest.java | 69 ++- .../io/helidon/config/ConfigUtilsTest.java | 153 ------- .../io/helidon/config/FilterLoadingTest.java | 2 +- config/encryption/pom.xml | 9 + .../config/encryption/EncryptionUtil.java | 30 +- .../config/encryption/MpEncryptionFilter.java | 216 +++++++++ .../encryption/src/main/java/module-info.java | 5 +- .../io.helidon.config.mp.spi.MpConfigFilter | 17 + config/pom.xml | 1 + config/tests/pom.xml | 1 - config/yaml/pom.xml | 6 + .../config/yaml/YamlMpConfigSource.java | 186 ++++++++ .../yaml/YamlMpConfigSourceProvider.java | 52 +++ config/yaml/src/main/java/module-info.java | 3 + ...croprofile.config.spi.ConfigSourceProvider | 17 + .../config/yaml/YamlMpConfigSourceTest.java | 51 +++ .../graal/native-image-extension/pom.xml | 4 + .../extension/HelidonReflectionFeature.java | 2 +- messaging/connectors/kafka/pom.xml | 4 + .../connectors/kafka/KafkaConnector.java | 9 +- .../kafka/src/main/java/module-info.java | 2 + metrics/metrics/pom.xml | 4 + .../metrics/src/main/java/module-info.java | 2 + microprofile/cdi/pom.xml | 2 +- .../cdi/HelidonContainerImpl.java | 14 +- .../cdi/src/main/java/module-info.java | 2 + .../cdi/HelidonContainerInitializerTest.java | 25 +- .../io/helidon/microprofile/cdi/MainTest.java | 17 +- microprofile/config/pom.xml | 18 +- .../config/ConfigCdiExtension.java | 37 +- .../microprofile/config/package-info.java | 4 +- .../config/src/main/java/module-info.java | 5 +- .../META-INF/microprofile-config.properties | 3 +- .../messaging/AdHocConfigBuilder.java | 14 +- .../messaging/src/main/java/module-info.java | 1 + .../messaging/AbstractCDITest.java | 38 +- microprofile/server/pom.xml | 5 - .../server/JaxRsCdiExtension.java | 4 +- .../helidon/microprofile/server/Server.java | 10 +- .../server/ServerCdiExtension.java | 23 +- .../server/src/main/java/module-info.java | 3 + .../HelidonContainerConfiguration.java | 29 +- .../HelidonDeployableContainer.java | 191 ++++---- .../microprofile/arquillian/ServerRunner.java | 80 +--- ...{tck-application.yaml => application.yaml} | 0 .../src/test/resources/application.yaml | 4 + .../src/test/resources/arquillian.xml | 6 - .../src/test/resources/arquillian.xml | 7 +- microprofile/tests/tck/tck-metrics/pom.xml | 14 - ...{tck-application.yaml => application.yaml} | 0 .../src/test/resources/arquillian.xml | 6 - .../tests/tck/tck-rest-client/pom.xml | 7 - .../restclient/tck/RestClientExtension.java | 31 ++ .../restclient/tck/UrlResourceProvider.java | 44 ++ .../src/test/resources/arquillian.xml | 2 - .../kafka/KafkaCdiExtensionTest.java | 27 +- .../src/main/resources/logging.properties | 20 +- .../io/helidon/webserver/NettyWebServer.java | 15 +- 111 files changed, 2712 insertions(+), 2100 deletions(-) rename config/{tests/test-mp-reference => config-mp}/pom.xml (63%) create mode 100644 config/config-mp/src/main/java/io/helidon/config/mp/MpConfig.java create mode 100644 config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java rename config/{config/src/main/java/io/helidon/config/MpConfig.java => config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java} (66%) rename config/{config/src/main/java/io/helidon/config => config-mp/src/main/java/io/helidon/config/mp}/MpConfigProviderResolver.java (92%) create mode 100644 config/config-mp/src/main/java/io/helidon/config/mp/MpConfigSources.java create mode 100644 config/config-mp/src/main/java/io/helidon/config/mp/MpEnvironmentVariablesSource.java create mode 100644 config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonConfigSource.java create mode 100644 config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonSource.java create mode 100644 config/config-mp/src/main/java/io/helidon/config/mp/MpMapSource.java create mode 100644 config/config-mp/src/main/java/io/helidon/config/mp/MpSystemPropertiesSource.java rename config/{config/src/main/java/io/helidon/config/ConfigSourceRuntimeBase.java => config-mp/src/main/java/io/helidon/config/mp/package-info.java} (67%) create mode 100644 config/config-mp/src/main/java/io/helidon/config/mp/spi/MpConfigFilter.java create mode 100644 config/config-mp/src/main/java/io/helidon/config/mp/spi/package-info.java create mode 100644 config/config-mp/src/main/java/module-info.java rename config/{config => config-mp}/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigProviderResolver (82%) rename config/{tests/test-mp-reference/src/test/java/io/helidon/config/tests/mpref => config-mp/src/test/java/io/helidon/config/mp}/MpConfigReferenceTest.java (85%) create mode 100644 config/config-mp/src/test/java/io/helidon/config/mp/MpConfigSourcesTest.java rename config/{config/src/test/java/io/helidon/config => config-mp/src/test/java/io/helidon/config/mp}/MpConfigTest.java (75%) rename config/{tests/test-mp-reference/src/main => config-mp/src/test}/resources/META-INF/microprofile-config.properties (93%) delete mode 100644 config/config/src/main/java/io/helidon/config/ConfigSourceMpRuntimeImpl.java delete mode 100644 config/config/src/main/java/io/helidon/config/MpConfigBuilder.java delete mode 100644 config/config/src/test/java/io/helidon/config/ConfigUtilsTest.java create mode 100644 config/encryption/src/main/java/io/helidon/config/encryption/MpEncryptionFilter.java create mode 100644 config/encryption/src/main/resources/META-INF/services/io.helidon.config.mp.spi.MpConfigFilter create mode 100644 config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java create mode 100644 config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSourceProvider.java create mode 100644 config/yaml/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSourceProvider create mode 100644 config/yaml/src/test/java/io/helidon/config/yaml/YamlMpConfigSourceTest.java rename microprofile/tests/tck/tck-health/src/test/resources/{tck-application.yaml => application.yaml} (100%) create mode 100644 microprofile/tests/tck/tck-jwt-auth/src/test/resources/application.yaml rename microprofile/tests/tck/tck-opentracing/src/test/resources/{tck-application.yaml => application.yaml} (100%) create mode 100644 microprofile/tests/tck/tck-rest-client/src/test/java/io/helidon/microprofile/restclient/tck/RestClientExtension.java create mode 100644 microprofile/tests/tck/tck-rest-client/src/test/java/io/helidon/microprofile/restclient/tck/UrlResourceProvider.java rename microprofile/tests/tck/tck-jwt-auth/src/test/resources/tck-application.yaml => tests/integration/security/gh1487/src/main/resources/logging.properties (58%) diff --git a/bom/pom.xml b/bom/pom.xml index 3d052bc7104..074c02c1bc9 100644 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -248,6 +248,11 @@ helidon-config-object-mapping ${helidon.version} + + io.helidon.config + helidon-config-mp + ${helidon.version} + io.helidon.security diff --git a/common/service-loader/src/main/java/io/helidon/common/serviceloader/Priorities.java b/common/service-loader/src/main/java/io/helidon/common/serviceloader/Priorities.java index ffd8340afa3..5d3300fb287 100644 --- a/common/service-loader/src/main/java/io/helidon/common/serviceloader/Priorities.java +++ b/common/service-loader/src/main/java/io/helidon/common/serviceloader/Priorities.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/config/tests/test-mp-reference/pom.xml b/config/config-mp/pom.xml similarity index 63% rename from config/tests/test-mp-reference/pom.xml rename to config/config-mp/pom.xml index 8e91315428a..98090d26d33 100644 --- a/config/tests/test-mp-reference/pom.xml +++ b/config/config-mp/pom.xml @@ -16,33 +16,40 @@ --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - io.helidon.config.tests - helidon-config-tests-project + io.helidon.config + helidon-config-project 2.0.0-SNAPSHOT - helidon-config-test-mp-reference - Helidon Config Tests MP Reference - - - Integration tests of reference in MP - + helidon-config-mp + Helidon Config MP + Core of the implementation of MicroProfile Config specification - org.eclipse.microprofile.config - microprofile-config-api + jakarta.annotation + jakarta.annotation-api + + + io.helidon.common + helidon-common + + + io.helidon.common + helidon-common-service-loader io.helidon.config helidon-config - runtime - + + org.eclipse.microprofile.config + microprofile-config-api + org.junit.jupiter junit-jupiter-api diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfig.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfig.java new file mode 100644 index 00000000000..99477b7da1c --- /dev/null +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfig.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.mp; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +import io.helidon.config.ConfigSources; + +import org.eclipse.microprofile.config.Config; + +/** + * Utilities for Helidon MicroProfile Config implementation. + */ +public class MpConfig { + /** + * This method allows use to use Helidon Config on top of an MP config. + * There is a limitation - the converters configured with MP config will not be available, unless + * the implementation is coming from Helidon. + *

+ * If you want to use the Helidon {@link io.helidon.config.Config} API instead of the MicroProfile + * {@link org.eclipse.microprofile.config.Config} one, this method will create a Helidon config + * instance that is based on the provided configuration instance. + * + * @param mpConfig MP Config instance + * @return a new Helidon config using only the mpConfig as its config source + */ + @SuppressWarnings("unchecked") + public static io.helidon.config.Config toHelidonConfig(Config mpConfig) { + if (mpConfig instanceof io.helidon.config.Config) { + return (io.helidon.config.Config) mpConfig; + } + + io.helidon.config.Config.Builder builder = io.helidon.config.Config.builder() + .disableEnvironmentVariablesSource() + .disableSystemPropertiesSource() + .disableMapperServices() + .disableCaching() + .disableParserServices() + .disableFilterServices(); + + if (mpConfig instanceof MpConfigImpl) { + ((MpConfigImpl) mpConfig).converters() + .forEach((clazz, converter) -> { + Class cl = (Class) clazz; + builder.addStringMapper(cl, converter::convert); + }); + } + + Map allConfig = new HashMap<>(); + mpConfig.getPropertyNames() + .forEach(it -> { + // covering the condition where a config key disappears between getting the property names and requesting + // the value + Optional optionalValue = mpConfig.getOptionalValue(it, String.class); + optionalValue.ifPresent(value -> allConfig.put(it, value)); + }); + + return builder.addSource(ConfigSources.create(allConfig)) + .build(); + } +} diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java new file mode 100644 index 00000000000..8dec2c553a1 --- /dev/null +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java @@ -0,0 +1,267 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.mp; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.ServiceLoader; + +import io.helidon.common.serviceloader.HelidonServiceLoader; +import io.helidon.common.serviceloader.Priorities; +import io.helidon.config.ConfigMappers; +import io.helidon.config.mp.spi.MpConfigFilter; + +import org.eclipse.microprofile.config.Config; +import org.eclipse.microprofile.config.spi.ConfigBuilder; +import org.eclipse.microprofile.config.spi.ConfigSource; +import org.eclipse.microprofile.config.spi.ConfigSourceProvider; +import org.eclipse.microprofile.config.spi.Converter; + +/** + * Configuration builder. + */ +public class MpConfigBuilder implements ConfigBuilder { + private boolean useDefaultSources = false; + private boolean useDiscoveredSources = false; + private boolean useDiscoveredConverters = false; + + private final List sources = new LinkedList<>(); + private final List converters = new LinkedList<>(); + + private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + + MpConfigBuilder() { + } + + @Override + public ConfigBuilder addDefaultSources() { + useDefaultSources = true; + return this; + } + + @Override + public ConfigBuilder addDiscoveredSources() { + useDiscoveredSources = true; + return this; + } + + @Override + public ConfigBuilder addDiscoveredConverters() { + useDiscoveredConverters = true; + return this; + } + + @Override + public ConfigBuilder forClassLoader(ClassLoader loader) { + this.classLoader = loader; + return this; + } + + @Override + public ConfigBuilder withSources(ConfigSource... sources) { + for (ConfigSource source : sources) { + this.sources.add(new OrdinalSource(source)); + } + return this; + } + + @Override + public ConfigBuilder withConverter(Class aClass, int ordinal, Converter converter) { + this.converters.add(new OrdinalConverter(converter, aClass, ordinal)); + return this; + } + + @Override + public ConfigBuilder withConverters(Converter... converters) { + for (Converter converter : converters) { + this.converters.add(new OrdinalConverter(converter)); + } + return this; + } + + @Override + public Config build() { + if (useDefaultSources) { + sources.add(new OrdinalSource(MpConfigSources.systemProperties(), 400)); + sources.add(new OrdinalSource(MpConfigSources.environmentVariables(), 300)); + // microprofile-config.properties + MpConfigSources.classPath(classLoader, "META-INF/microprofile-config.properties") + .stream() + .map(OrdinalSource::new) + .forEach(sources::add); + } + // built-in converters + converters.add(new OrdinalConverter(ConfigMappers::toBoolean, Boolean.class, 1)); + converters.add(new OrdinalConverter(ConfigMappers::toBoolean, Boolean.TYPE, 1)); + converters.add(new OrdinalConverter(Byte::parseByte, Byte.class, 1)); + converters.add(new OrdinalConverter(Byte::parseByte, Byte.TYPE, 1)); + converters.add(new OrdinalConverter(Short::parseShort, Short.class, 1)); + converters.add(new OrdinalConverter(Short::parseShort, Short.TYPE, 1)); + converters.add(new OrdinalConverter(Integer::parseInt, Integer.class, 1)); + converters.add(new OrdinalConverter(Integer::parseInt, Integer.TYPE, 1)); + converters.add(new OrdinalConverter(Long::parseLong, Long.class, 1)); + converters.add(new OrdinalConverter(Long::parseLong, Long.TYPE, 1)); + converters.add(new OrdinalConverter(Float::parseFloat, Float.class, 1)); + converters.add(new OrdinalConverter(Float::parseFloat, Float.TYPE, 1)); + converters.add(new OrdinalConverter(Double::parseDouble, Double.class, 1)); + converters.add(new OrdinalConverter(Double::parseDouble, Double.TYPE, 1)); + converters.add(new OrdinalConverter(MpConfigBuilder::toChar, Character.class, 1)); + converters.add(new OrdinalConverter(MpConfigBuilder::toChar, Character.TYPE, 1)); + converters.add(new OrdinalConverter(MpConfigBuilder::toClass, Class.class, 1)); + + if (useDiscoveredConverters) { + ServiceLoader.load(Converter.class) + .forEach(it -> converters.add(new OrdinalConverter(it))); + } + + if (useDiscoveredSources) { + ServiceLoader.load(ConfigSource.class) + .forEach(it -> sources.add(new OrdinalSource(it))); + + ServiceLoader.load(ConfigSourceProvider.class) + .forEach(it -> { + it.getConfigSources(classLoader) + .forEach(source -> sources.add(new OrdinalSource(source))); + }); + } + + // now it is from lowest to highest + sources.sort(Comparator.comparingInt(o -> o.ordinal)); + converters.sort(Comparator.comparingInt(o -> o.ordinal)); + + // revert to have the first one the most significant + Collections.reverse(sources); + Collections.reverse(converters); + + List sources = new LinkedList<>(); + HashMap, Converter> converters = new HashMap<>(); + + this.sources.forEach(ordinal -> sources.add(ordinal.source)); + this.converters.forEach(ordinal -> converters.putIfAbsent(ordinal.type, ordinal.converter)); + + List filters = HelidonServiceLoader.create(ServiceLoader.load(MpConfigFilter.class)) + .asList(); + + return new MpConfigImpl(sources, converters, filters); + } + + ConfigBuilder metaConfig(io.helidon.config.Config metaConfig) { + io.helidon.config.Config helidonConfig = io.helidon.config.Config.builder() + .config(metaConfig) + .build(); + this.sources.add(new OrdinalSource(MpConfigSources.create(helidonConfig))); + return this; + } + + private static Class toClass(String stringValue) { + try { + return Class.forName(stringValue); + } catch (ClassNotFoundException e) { + throw new IllegalArgumentException("Failed to convert property " + stringValue + " to class", e); + } + } + + private static char toChar(String stringValue) { + if (stringValue.length() != 1) { + throw new IllegalArgumentException("The string to map must be a single character, but is: " + stringValue); + } + return stringValue.charAt(0); + } + + private static class OrdinalSource { + private final int ordinal; + private final ConfigSource source; + + private OrdinalSource(ConfigSource source) { + this.source = source; + this.ordinal = findOrdinal(source); + } + + private OrdinalSource(ConfigSource source, int ordinal) { + this.ordinal = ordinal; + this.source = source; + } + + private static int findOrdinal(ConfigSource source) { + int ordinal = source.getOrdinal(); + if (ordinal == ConfigSource.DEFAULT_ORDINAL) { + return Priorities.find(source, ConfigSource.DEFAULT_ORDINAL); + } + return ordinal; + } + + @Override + public String toString() { + return ordinal + " " + source.getName(); + } + } + + private static class OrdinalConverter { + private final int ordinal; + private final Class type; + private final Converter converter; + + private OrdinalConverter(Converter converter, Class aClass, int ordinal) { + this.ordinal = ordinal; + this.type = aClass; + this.converter = converter; + } + + private OrdinalConverter(Converter converter) { + this(converter, getConverterType(converter.getClass()), Priorities.find(converter, 100)); + } + } + + private static Class getConverterType(Class converterClass) { + Class type = doGetType(converterClass); + if (null == type) { + throw new IllegalArgumentException("Converter " + converterClass + " must be a ParameterizedType."); + } + return type; + } + + private static Class doGetType(Class clazz) { + if (clazz.equals(Object.class)) { + return null; + } + + Type[] genericInterfaces = clazz.getGenericInterfaces(); + for (Type genericInterface : genericInterfaces) { + if (genericInterface instanceof ParameterizedType) { + ParameterizedType pt = (ParameterizedType) genericInterface; + if (pt.getRawType().equals(Converter.class)) { + Type[] typeArguments = pt.getActualTypeArguments(); + if (typeArguments.length != 1) { + throw new IllegalStateException("Converter " + clazz + " must be a ParameterizedType."); + } + Type typeArgument = typeArguments[0]; + if (typeArgument instanceof Class) { + return (Class) typeArgument; + } + throw new IllegalStateException("Converter " + clazz + " must convert to a class, not " + typeArgument); + } + } + } + + return doGetType(clazz.getSuperclass()); + } +} diff --git a/config/config/src/main/java/io/helidon/config/MpConfig.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java similarity index 66% rename from config/config/src/main/java/io/helidon/config/MpConfig.java rename to config/config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java index ad9400ac698..33b341249f9 100644 --- a/config/config/src/main/java/io/helidon/config/MpConfig.java +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java @@ -14,22 +14,23 @@ * limitations under the License. */ -package io.helidon.config; +package io.helidon.config.mp; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.logging.Level; @@ -37,23 +38,51 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import io.helidon.config.mp.spi.MpConfigFilter; + import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.spi.ConfigSource; import org.eclipse.microprofile.config.spi.Converter; -public class MpConfig implements Config { - private static final Logger LOGGER = Logger.getLogger(MpConfig.class.getName()); +public class MpConfigImpl implements Config { + private static final Logger LOGGER = Logger.getLogger(MpConfigImpl.class.getName()); + // for references resolving + // matches string between ${ } with a negative lookbehind if there is not backslash + private static final String REGEX_REFERENCE = "(?> UNRESOLVED_KEYS = ThreadLocal.withInitial(HashSet::new); private static final Pattern SPLIT_PATTERN = Pattern.compile("(? sources = new LinkedList<>(); private final HashMap, Converter> converters = new LinkedHashMap<>(); + private final boolean valueResolving; + private final List filters = new ArrayList<>(); - MpConfig(List sources, HashMap, Converter> converters) { + MpConfigImpl(List sources, + HashMap, Converter> converters, + List filters) { this.sources.addAll(sources); this.converters.putAll(converters); this.converters.putIfAbsent(String.class, value -> value); + + this.valueResolving = getOptionalValue("helidon.config.value-resolving.enabled", Boolean.class) + .orElse(true); + + // we need to initialize the filters first, before we set up filters + filters.forEach(it -> { + // initialize filter with filters with higher priority already in place + it.init(this); + // and then add it to the list of active filters + // do not do this first, as we would end up in using an uninitialized filter + this.filters.add(it); + }); } @Override @@ -113,27 +142,12 @@ public Optional getOptionalValue(String propertyName, Class propertyTy return Optional.empty(); } } else { - return sources.stream() - .map(it -> it.getValue(propertyName)) - .filter(Objects::nonNull) - .findFirst() + return getStringValue(propertyName) + .flatMap(it -> applyFilters(propertyName, it)) .map(it -> convert(propertyName, propertyType, it)); } } - private Object toArray(String propertyName, String stringValue, Class componentType) { - String[] values = toArray(stringValue); - - Object array = Array.newInstance(componentType, values.length); - - for (int i = 0; i < values.length; i++) { - String value = values[i]; - Array.set(array, i, convert(propertyName, componentType, value)); - } - - return array; - } - @Override public Iterable getPropertyNames() { Set names = new LinkedHashSet<>(); @@ -148,17 +162,39 @@ public Iterable getConfigSources() { return Collections.unmodifiableList(sources); } + /** + * Return the {@link Converter} used by this instance to produce instances of the specified type from string values. + * + * This method is from a future version of MP Config specification and may changed before it + * is released. It is nevertheless needed to process annotations with default values. + * + * @param the conversion type + * @param forType the type to be produced by the converter + * @return an {@link java.util.Optional} containing the converter, or empty if no converter is available for the specified type + */ + @SuppressWarnings("unchecked") + public Optional> getConverter(Class forType) { + return converters.entrySet() + .stream() + .filter(it -> forType.isAssignableFrom(it.getKey())) + .findFirst() + .map(Map.Entry::getValue) + .map(it -> (Converter) it) + .or(() -> findImplicit(forType)); + } + /** * Convert a String to a specific type. * This is a helper method to allow for processing of default values that cannot be typed (e.g. in annotations). * + * @param propertyName name of the property, used for error messages * @param type type of the property - * @param value String value + * @param value String value (may be null) * @param type - * @return instance of the correct type - * @throws java.lang.IllegalArgumentException in case the String provided cannot be converted to the type expected + * @return instance of the correct type, may return null in case null was provided and converter did not do this + * @throws IllegalArgumentException in case the String provided cannot be converted to the type expected */ - public T convert(String propertyName, Class type, String value) { + private T convert(String propertyName, Class type, String value) { try { return findConverter(type) .convert(value); @@ -173,20 +209,87 @@ public T convert(String propertyName, Class type, String value) { } } + private Optional getStringValue(String propertyName) { + for (ConfigSource source : sources) { + String value = source.getValue(propertyName); + + if (null == value) { + // not in this one + continue; + } + + LOGGER.finest("Found property " + propertyName + " in source " + source.getName()); + return Optional.of(resolveReferences(propertyName, value)); + } + + return Optional.empty(); + } + + private Optional applyFilters(String propertyName, String stringValue) { + String result = stringValue; + + for (MpConfigFilter filter : filters) { + result = filter.apply(propertyName, stringValue); + } + + return Optional.ofNullable(result); + } + + private Object toArray(String propertyName, String stringValue, Class componentType) { + String[] values = toArray(stringValue); + + Object array = Array.newInstance(componentType, values.length); + + for (int i = 0; i < values.length; i++) { + String value = values[i]; + Array.set(array, i, convert(propertyName, componentType, value)); + } + + return array; + } + + private String resolveReferences(String key, String value) { + if (!valueResolving) { + return value; + } + if (!UNRESOLVED_KEYS.get().add(key)) { + UNRESOLVED_KEYS.get().clear(); + throw new IllegalStateException("Recursive resolving of references for key " + key + ", value: " + value); + } + try { + return format(value); + } catch (NoSuchElementException e) { + LOGGER.log(Level.FINER, e, () -> String.format("Reference for key %s not found. Value: %s", key, value)); + return value; + } finally { + UNRESOLVED_KEYS.get().remove(key); + } + } + + private String format(String value) { + Matcher m = PATTERN_REFERENCE.matcher(value); + final StringBuffer sb = new StringBuffer(); + while (m.find()) { + String propertyName = m.group(1); + m.appendReplacement(sb, + Matcher.quoteReplacement(getOptionalValue(propertyName, String.class) + .orElseGet(() -> "${" + propertyName + "}"))); + } + m.appendTail(sb); + // remove all backslash that encodes ${...} + m = PATTERN_BACKSLASH.matcher(sb.toString()); + + return m.replaceAll(""); + } + @SuppressWarnings("unchecked") - private Converter findConverter(Class type) { + Converter findConverter(Class type) { Converter converter = converters.get(type); if (null != converter) { return (Converter) converter; } - return converters.entrySet() - .stream() - .filter(it -> type.isAssignableFrom(it.getKey())) - .findFirst() - .map(Map.Entry::getValue) - .map(it -> (Converter) it) - .or(() -> findImplicit(type)) + return getConverter(type) .orElseGet(() -> new FailingConverter<>(type)); } @@ -264,8 +367,18 @@ HashMap, Converter> converters() { return converters; } + static String[] toArray(String stringValue) { + String[] values = SPLIT_PATTERN.split(stringValue, -1); + + for (int i = 0; i < values.length; i++) { + String value = values[i]; + values[i] = ESCAPED_COMMA_PATTERN.matcher(value).replaceAll(Matcher.quoteReplacement(",")); + } + return values; + } + private static class FailingConverter implements Converter { - private Class type; + private final Class type; private FailingConverter(Class type) { this.type = type; @@ -276,14 +389,4 @@ public T convert(String value) { throw new IllegalArgumentException("Cannot convert \"" + value + "\" to type " + type.getName()); } } - - static String[] toArray(String stringValue) { - String[] values = SPLIT_PATTERN.split(stringValue, -1); - - for (int i = 0; i < values.length; i++) { - String value = values[i]; - values[i] = ESCAPED_COMMA_PATTERN.matcher(value).replaceAll(Matcher.quoteReplacement(",")); - } - return values; - } } diff --git a/config/config/src/main/java/io/helidon/config/MpConfigProviderResolver.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigProviderResolver.java similarity index 92% rename from config/config/src/main/java/io/helidon/config/MpConfigProviderResolver.java rename to config/config-mp/src/main/java/io/helidon/config/mp/MpConfigProviderResolver.java index b045a481868..3eb4245eb92 100644 --- a/config/config/src/main/java/io/helidon/config/MpConfigProviderResolver.java +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigProviderResolver.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.helidon.config; +package io.helidon.config.mp; import java.time.Instant; import java.util.IdentityHashMap; @@ -31,6 +31,8 @@ import java.util.stream.Stream; import io.helidon.common.GenericType; +import io.helidon.config.ConfigValue; +import io.helidon.config.MetaConfig; import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.spi.ConfigProviderResolver; @@ -115,7 +117,7 @@ public void registerConfig(Config config, ClassLoader classLoader) { * * @param config configuration to use */ - public static void runtimeStart(io.helidon.config.Config config) { + public static void runtimeStart(Config config) { if (BUILD_CONFIG.isEmpty()) { return; } @@ -197,20 +199,15 @@ private ConfigDelegate(Config delegate) { set(delegate); } - private void set(Config delegate) { + void set(Config delegate) { this.delegate.set(delegate); if (delegate instanceof io.helidon.config.Config) { this.helidonDelegate.set((io.helidon.config.Config) delegate); } else { - this.helidonDelegate.set(io.helidon.config.Config.create(delegate)); + this.helidonDelegate.set(MpConfig.toHelidonConfig(delegate)); } } - private void set(io.helidon.config.Config newDelegate) { - this.delegate.set((Config) newDelegate); - this.helidonDelegate.set(newDelegate); - } - private io.helidon.config.Config getCurrent() { return helidonDelegate.get().context().last(); } @@ -251,7 +248,7 @@ public Stream traverse(Predicate T convert(Class type, String value) throws ConfigMappingException { + public T convert(Class type, String value) { return getCurrent().convert(type, value); } @@ -271,22 +268,22 @@ public ConfigValue as(Function mapper) { } @Override - public ConfigValue> asList(Class type) throws ConfigMappingException { + public ConfigValue> asList(Class type) { return getCurrent().asList(type); } @Override - public ConfigValue> asList(Function mapper) throws ConfigMappingException { + public ConfigValue> asList(Function mapper) { return getCurrent().asList(mapper); } @Override - public ConfigValue> asNodeList() throws ConfigMappingException { + public ConfigValue> asNodeList() { return getCurrent().asNodeList(); } @Override - public ConfigValue> asMap() throws MissingValueException { + public ConfigValue> asMap() { return getCurrent().asMap(); } diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigSources.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigSources.java new file mode 100644 index 00000000000..f31db2a8306 --- /dev/null +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigSources.java @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.mp; + +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import io.helidon.config.Config; +import io.helidon.config.ConfigException; + +import org.eclipse.microprofile.config.spi.ConfigSource; + +/** + * Utilities for MicroProfile Config {@link org.eclipse.microprofile.config.spi.ConfigSource}. + *

+ * The following methods create MicroProfile config sources to help with manual setup of Config + * from {@link org.eclipse.microprofile.config.spi.ConfigProviderResolver#getBuilder()}: + *

    + *
  • {@link #systemProperties()} - system properties config source
  • + *
  • {@link #environmentVariables()} - environment variables config source
  • + *
  • {@link #create(java.nio.file.Path)} - load a properties file from file system
  • + *
  • {@link #create(String, java.nio.file.Path)} - load a properties file from file system with custom name
  • + *
  • {@link #create(java.util.Map)} - create an in-memory source from map
  • + *
  • {@link #create(String, java.util.Map)} - create an in-memory source from map with custom name
  • + *
  • {@link #create(java.util.Properties)} - create an in-memory source from properties
  • + *
  • {@link #create(String, java.util.Properties)} - create an in-memory source from properties with custom name
  • + *
+ * The following methods add integration with Helidon SE Config: + *
    + *
  • {@link #create(io.helidon.config.spi.ConfigSource)} - create a MicroProfile config source from Helidon SE config + * source
  • + *
  • {@link #create(io.helidon.config.Config)} - create a MicroProfile config source from Helidon SE Config instance
  • + *
+ */ +public class MpConfigSources { + /** + * In memory config source based on the provided map. + * The config source queries the map each time {@link org.eclipse.microprofile.config.spi.ConfigSource#getValue(String)} + * is called. + * + * @param name name of the source + * @param theMap map serving as configuration data + * @return a new config source + */ + public static ConfigSource create(String name, Map theMap) { + return new MpMapSource(name, theMap); + } + + /** + * In memory config source based on the provided map. + * The config source queries the map each time {@link org.eclipse.microprofile.config.spi.ConfigSource#getValue(String)} + * is called. + * + * @param theMap map serving as configuration data + * @return a new config source + */ + public static ConfigSource create(Map theMap) { + return create("Map", theMap); + } + + /** + * {@link java.util.Properties} config source based on a file on file system. + * The file is read just once, when the source is created and further changes to the underlying file are + * ignored. + * + * @param path path of the properties file on the file system + * @return a new config source + */ + public static ConfigSource create(Path path) { + return create(path.toString(), path); + } + + /** + * {@link java.util.Properties} config source based on a URL. + * The URL is read just once, when the source is created and further changes to the underlying resource are + * ignored. + * + * @param url url of the properties file (any URL scheme supported by JVM can be used) + * @return a new config source + */ + public static ConfigSource create(URL url) { + String name = url.toString(); + + try { + URLConnection urlConnection = url.openConnection(); + try (InputStream inputStream = urlConnection.getInputStream()) { + Properties properties = new Properties(); + properties.load(inputStream); + + return create(name, properties); + } + } catch (Exception e) { + throw new ConfigException("Failed to load ", e); + } + } + + /** + * {@link java.util.Properties} config source based on a file on file system. + * The file is read just once, when the source is created and further changes to the underlying file are + * ignored. + * + * @param name name of the config source + * @param path path of the properties file on the file system + * @return a new config source + */ + public static ConfigSource create(String name, Path path) { + Properties props = new Properties(); + + try (InputStream in = Files.newInputStream(path)) { + props.load(in); + } catch (IOException e) { + throw new ConfigException("Failed to read properties from " + path.toAbsolutePath()); + } + + return create(name, props); + } + + /** + * In memory config source based on the provided properties. + * The config source queries the properties each time + * {@link org.eclipse.microprofile.config.spi.ConfigSource#getValue(String)} + * is called. + * + * @param properties serving as configuration data + * @return a new config source + */ + public static ConfigSource create(Properties properties) { + return create("Properties", properties); + } + + /** + * In memory config source based on the provided properties. + * The config source queries the properties each time + * {@link org.eclipse.microprofile.config.spi.ConfigSource#getValue(String)} + * is called. + * + * @param name name of the config source + * @param properties serving as configuration data + * @return a new config source + */ + public static ConfigSource create(String name, Properties properties) { + Map result = new HashMap<>(); + for (String key : properties.stringPropertyNames()) { + result.put(key, properties.getProperty(key)); + } + return new MpMapSource(name, result); + } + + /** + * Environment variables config source. + * This source takes care of replacement of properties by environment variables as defined + * in MicroProfile Config specification. + * This config source is immutable and caching. + * + * @return a new config source + */ + public static ConfigSource environmentVariables() { + return new MpEnvironmentVariablesSource(); + } + + /** + * In memory config source based on system properties. + * The config source queries the properties each time + * {@link org.eclipse.microprofile.config.spi.ConfigSource#getValue(String)} + * is called. + * + * @return a new config source + */ + public static ConfigSource systemProperties() { + return new MpSystemPropertiesSource(); + } + + /** + * Find all resources on classpath and return a config source for each. + * Order is kept as provided by class loader. + * + * @param resource resource to find + * @return a config source for each resource on classpath, empty if none found + */ + public static List classPath(String resource) { + return classPath(Thread.currentThread().getContextClassLoader(), resource); + } + + /** + * Find all resources on classpath and return a config source for each. + * Order is kept as provided by class loader. + * + * @param classLoader class loader to use to locate the resources + * @param resource resource to find + * @return a config source for each resource on classpath, empty if none found + */ + public static List classPath(ClassLoader classLoader, String resource) { + List sources = new LinkedList<>(); + try { + classLoader.getResources(resource) + .asIterator() + .forEachRemaining(it -> sources.add(create(it))); + } catch (IOException e) { + throw new IllegalStateException("Failed to read \"" + resource + "\" from classpath"); + } + + return sources; + } + + /** + * Config source based on a Helidon SE config source. + * This is to support Helidon SE features in Helidon MP. + * + * The config source will be immutable regardless of configured polling strategy or change watchers. + * + * @param helidonConfigSource config source to use + * @return a new MicroProfile Config config source + */ + public static ConfigSource create(io.helidon.config.spi.ConfigSource helidonConfigSource) { + return MpHelidonSource.create(helidonConfigSource); + } + + /** + * Config source base on a Helidon SE config instance. + * This is to support advanced Helidon SE features in Helidon MP. + * + * The config source will be mutable if the config uses polling strategy and/or change watchers. + * Each time the {@link org.eclipse.microprofile.config.spi.ConfigSource#getValue(String)} is called, + * the latest config version will be queried. + * + * @param config Helidon SE configuration + * @return a new MicroProfile Config config source + */ + public static ConfigSource create(Config config) { + return new MpHelidonConfigSource(config); + } +} diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpEnvironmentVariablesSource.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpEnvironmentVariablesSource.java new file mode 100644 index 00000000000..2fc6fb6f9e4 --- /dev/null +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpEnvironmentVariablesSource.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.mp; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.regex.Pattern; + +import javax.annotation.Priority; + +import org.eclipse.microprofile.config.spi.ConfigSource; + +@Priority(300) +class MpEnvironmentVariablesSource implements ConfigSource { + private static final Pattern DISALLOWED_CHARS = Pattern.compile("[^a-zA-Z0-9_]"); + private static final String UNDERSCORE = "_"; + + private final Map env; + private final Map cache = new ConcurrentHashMap<>(); + + MpEnvironmentVariablesSource() { + this.env = System.getenv(); + } + + @Override + public Map getProperties() { + return env; + } + + @Override + public String getValue(String propertyName) { + // environment variable config source is immutable - we can safely cache all requested keys, so we + // not not execute the regular expression on every get + return cache.computeIfAbsent(propertyName, theKey -> { + // According to the spec, we have three ways of looking for a property + // 1. Exact match + String result = env.get(propertyName); + if (null != result) { + return new Cached(result); + } + // 2. replace non alphanumeric characters with _ + String rule2 = rule2(propertyName); + result = env.get(rule2); + if (null != result) { + return new Cached(result); + } + // 3. replace same as above, but uppercase + String rule3 = rule2.toUpperCase(); + result = env.get(rule3); + return new Cached(result); + }).value; + } + + @Override + public String getName() { + return "Environment Variables"; + } + + /** + * Rule #2 states: Replace each character that is neither alphanumeric nor _ with _ (i.e. com_ACME_size). + * + * @param propertyName name of property as requested by user + * @return name of environment variable we look for + */ + private static String rule2(String propertyName) { + return DISALLOWED_CHARS.matcher(propertyName).replaceAll(UNDERSCORE); + } + + private static final class Cached { + private final String value; + + private Cached(String value) { + this.value = value; + } + } +} diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonConfigSource.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonConfigSource.java new file mode 100644 index 00000000000..d780822f17e --- /dev/null +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonConfigSource.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.mp; + +import java.util.Map; + +import org.eclipse.microprofile.config.spi.ConfigSource; + +final class MpHelidonConfigSource implements ConfigSource { + private final io.helidon.config.Config helidonConfig; + + MpHelidonConfigSource(io.helidon.config.Config helidonConfig) { + this.helidonConfig = helidonConfig; + } + + @Override + public Map getProperties() { + return helidonConfig.context() + .last() + .asMap() + .orElseGet(Map::of); + } + + @Override + public String getValue(String s) { + return helidonConfig.context() + .last() + .get(s) + .asString() + .orElse(null); + } + + @Override + public String getName() { + return "Helidon Config"; + } +} diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonSource.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonSource.java new file mode 100644 index 00000000000..95f9227c211 --- /dev/null +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonSource.java @@ -0,0 +1,137 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.mp; + +import java.util.Collections; +import java.util.Map; +import java.util.Optional; +import java.util.ServiceLoader; +import java.util.concurrent.ConcurrentHashMap; + +import io.helidon.common.serviceloader.HelidonServiceLoader; +import io.helidon.config.ConfigException; +import io.helidon.config.ConfigHelper; +import io.helidon.config.spi.ConfigContent; +import io.helidon.config.spi.ConfigNode; +import io.helidon.config.spi.ConfigParser; +import io.helidon.config.spi.LazyConfigSource; +import io.helidon.config.spi.NodeConfigSource; +import io.helidon.config.spi.ParsableSource; + +import org.eclipse.microprofile.config.spi.ConfigSource; + +class MpHelidonSource { + static ConfigSource create(io.helidon.config.spi.ConfigSource source) { + source.init(it -> { + throw new UnsupportedOperationException( + "Source runtimes are not available in MicroProfile Config implementation"); + }); + + if (!source.exists() && !source.optional()) { + throw new ConfigException("Config source " + source + " is mandatory, yet it does not exist."); + } + + if (source instanceof NodeConfigSource) { + Optional load = ((NodeConfigSource) source).load(); + // load the data, create a map from it + return MpConfigSources.create(source.description(), + load.map(ConfigContent.NodeContent::data) + .map(ConfigHelper::flattenNodes) + .orElseGet(Map::of)); + } + + if (source instanceof ParsableSource) { + return HelidonParsableSource.create((ParsableSource) source); + } + + if (source instanceof LazyConfigSource) { + return new HelidonLazySource(source, (LazyConfigSource) source); + } + + throw new IllegalArgumentException( + "Helidon config source must be one of: node source, parsable source, or lazy source. Provided is neither: " + + source.getClass().getName()); + } + + private static class HelidonParsableSource { + public static ConfigSource create(ParsableSource source) { + Optional load = source.load(); + if (load.isEmpty()) { + return MpConfigSources.create(source.description(), Map.of()); + } + ConfigParser.Content content = load.get(); + + String mediaType = content.mediaType() + .or(source::mediaType) + .orElseThrow(() -> new ConfigException("Source " + source + " does not provide media type, cannot use it.")); + + ConfigParser parser = source.parser() + .or(() -> findParser(mediaType)) + .orElseThrow(() -> new ConfigException("Could not locate config parser for media type: \"" + + mediaType + "\"")); + + // create a map from parsed node + return MpConfigSources.create(source.description(), + ConfigHelper.flattenNodes(parser.parse(content))); + + } + + private static Optional findParser(String mediaType) { + return HelidonServiceLoader.create(ServiceLoader.load(ConfigParser.class)) + .asList() + .stream() + .filter(it -> it.supportedMediaTypes().contains(mediaType)) + .findFirst(); + } + } + + private static class HelidonLazySource implements ConfigSource { + private final Map loadedProperties = new ConcurrentHashMap<>(); + private final LazyConfigSource lazy; + private final io.helidon.config.spi.ConfigSource source; + + private HelidonLazySource(io.helidon.config.spi.ConfigSource source, LazyConfigSource lazy) { + this.lazy = lazy; + this.source = source; + } + + @Override + public Map getProperties() { + return Collections.unmodifiableMap(loadedProperties); + } + + @Override + public String getValue(String propertyName) { + String value = lazy.node(propertyName) + .flatMap(ConfigNode::value) + .orElse(null); + + if (null == value) { + loadedProperties.remove(propertyName); + } else { + loadedProperties.put(propertyName, value); + } + + return value; + } + + @Override + public String getName() { + return source.description(); + } + } +} diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpMapSource.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpMapSource.java new file mode 100644 index 00000000000..1ad2bad479e --- /dev/null +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpMapSource.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.mp; + +import java.util.Collections; +import java.util.Map; + +import org.eclipse.microprofile.config.spi.ConfigSource; + +/** + * Map based config source. + */ +class MpMapSource implements ConfigSource { + private final Map map; + private final String name; + + MpMapSource(String name, Map map) { + this.name = name; + this.map = map; + } + + @Override + public Map getProperties() { + return Collections.unmodifiableMap(map); + } + + @Override + public String getValue(String propertyName) { + return map.get(propertyName); + } + + @Override + public String getName() { + return name; + } +} diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpSystemPropertiesSource.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpSystemPropertiesSource.java new file mode 100644 index 00000000000..7ef8ba9f573 --- /dev/null +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpSystemPropertiesSource.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.mp; + +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import javax.annotation.Priority; + +import org.eclipse.microprofile.config.spi.ConfigSource; + +@Priority(400) +class MpSystemPropertiesSource implements ConfigSource { + private final Properties props; + + MpSystemPropertiesSource() { + this.props = System.getProperties(); + } + + @Override + public Map getProperties() { + Set strings = props.stringPropertyNames(); + + Map result = new HashMap<>(); + strings.forEach(it -> result.put(it, props.getProperty(it))); + return result; + } + + @Override + public String getValue(String propertyName) { + return props.getProperty(propertyName); + } + + @Override + public String getName() { + return "System Properties"; + } +} diff --git a/config/config/src/main/java/io/helidon/config/ConfigSourceRuntimeBase.java b/config/config-mp/src/main/java/io/helidon/config/mp/package-info.java similarity index 67% rename from config/config/src/main/java/io/helidon/config/ConfigSourceRuntimeBase.java rename to config/config-mp/src/main/java/io/helidon/config/mp/package-info.java index 73972af045b..57ad5b9501e 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigSourceRuntimeBase.java +++ b/config/config-mp/src/main/java/io/helidon/config/mp/package-info.java @@ -14,19 +14,7 @@ * limitations under the License. */ -package io.helidon.config; - -abstract class ConfigSourceRuntimeBase implements ConfigSourceRuntime { - - boolean isSystemProperties() { - return false; - } - - boolean isEnvironmentVariables() { - return false; - } - - boolean changesSupported() { - return false; - } -} +/** + * Helidon implementation of microprofile config. + */ +package io.helidon.config.mp; diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/spi/MpConfigFilter.java b/config/config-mp/src/main/java/io/helidon/config/mp/spi/MpConfigFilter.java new file mode 100644 index 00000000000..f4a8716e2e6 --- /dev/null +++ b/config/config-mp/src/main/java/io/helidon/config/mp/spi/MpConfigFilter.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.mp.spi; + +import org.eclipse.microprofile.config.Config; + +/** + * Filtering support for MicroProfile config implementation. + * The current specification does not have a way to intercept values as they are + * delivered. + * As we want to support filtering capabilities (such as for configuration encryption), + * this is a temporary solution (or permanent if the MP spec does not add any similar feature). + */ +public interface MpConfigFilter { + /** + * Initialize this filter from configuration. + * The config instance provided only has filters with higher priority than this filter. + * + * @param config configuration to set this filter up. + */ + default void init(Config config) { + } + + /** + * Apply this filter on the provided value. + * + * @param propertyName name of the property (its key) + * @param value the current value of the property as retrieved from the config source, or from previous + * filters + * @return value as processed by this filter + */ + String apply(String propertyName, String value); +} diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/spi/package-info.java b/config/config-mp/src/main/java/io/helidon/config/mp/spi/package-info.java new file mode 100644 index 00000000000..5f85752af2a --- /dev/null +++ b/config/config-mp/src/main/java/io/helidon/config/mp/spi/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Helidon specific extension support for MicroProfile Config. + */ +package io.helidon.config.mp.spi; diff --git a/config/config-mp/src/main/java/module-info.java b/config/config-mp/src/main/java/module-info.java new file mode 100644 index 00000000000..f0c082201b8 --- /dev/null +++ b/config/config-mp/src/main/java/module-info.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Implementation of the non-CDI parts of Eclipse MicroProfile Config specification. + */ +module io.helidon.config.mp { + requires java.logging; + requires io.helidon.common; + requires io.helidon.config; + requires transitive microprofile.config.api; + requires java.annotation; + requires io.helidon.common.serviceloader; + + exports io.helidon.config.mp; + exports io.helidon.config.mp.spi; + + uses org.eclipse.microprofile.config.spi.ConfigSource; + uses org.eclipse.microprofile.config.spi.ConfigSourceProvider; + uses org.eclipse.microprofile.config.spi.Converter; + uses io.helidon.config.mp.spi.MpConfigFilter; + uses io.helidon.config.spi.ConfigParser; + + provides org.eclipse.microprofile.config.spi.ConfigProviderResolver with io.helidon.config.mp.MpConfigProviderResolver; +} \ No newline at end of file diff --git a/config/config/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigProviderResolver b/config/config-mp/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigProviderResolver similarity index 82% rename from config/config/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigProviderResolver rename to config/config-mp/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigProviderResolver index d1cabddfa38..462e78f791e 100644 --- a/config/config/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigProviderResolver +++ b/config/config-mp/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigProviderResolver @@ -1,5 +1,5 @@ # -# Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2020 Oracle and/or its affiliates. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,4 +14,4 @@ # limitations under the License. # -io.helidon.config.MpConfigProviderResolver +io.helidon.config.mp.MpConfigProviderResolver diff --git a/config/tests/test-mp-reference/src/test/java/io/helidon/config/tests/mpref/MpConfigReferenceTest.java b/config/config-mp/src/test/java/io/helidon/config/mp/MpConfigReferenceTest.java similarity index 85% rename from config/tests/test-mp-reference/src/test/java/io/helidon/config/tests/mpref/MpConfigReferenceTest.java rename to config/config-mp/src/test/java/io/helidon/config/mp/MpConfigReferenceTest.java index a2cd90172a5..bcc5b44285f 100644 --- a/config/tests/test-mp-reference/src/test/java/io/helidon/config/tests/mpref/MpConfigReferenceTest.java +++ b/config/config-mp/src/test/java/io/helidon/config/mp/MpConfigReferenceTest.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package io.helidon.config.tests.mpref; +package io.helidon.config.mp; import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.ConfigProvider; @@ -53,6 +53,17 @@ void testBoth() { test("3", "1", VALUE_1 + "-" + VALUE_2); } + @Test + void testMissingRefs() { + String key = "referencing4-1"; + String actual = config.getValue(key, String.class); + assertThat(actual, is("${missing}")); + + key = "referencing4-2"; + actual = config.getValue(key, String.class); + assertThat(actual, is("${missing}-value")); + } + private void test(String prefix, String value) { test(prefix, "1", value); test(prefix, "2", value + "-ref"); diff --git a/config/config-mp/src/test/java/io/helidon/config/mp/MpConfigSourcesTest.java b/config/config-mp/src/test/java/io/helidon/config/mp/MpConfigSourcesTest.java new file mode 100644 index 00000000000..d16d882e84f --- /dev/null +++ b/config/config-mp/src/test/java/io/helidon/config/mp/MpConfigSourcesTest.java @@ -0,0 +1,219 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.mp; + +import java.io.ByteArrayInputStream; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.Optional; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +import io.helidon.config.ConfigException; +import io.helidon.config.ConfigSources; +import io.helidon.config.PropertiesConfigParser; +import io.helidon.config.spi.ConfigContent; +import io.helidon.config.spi.ConfigContext; +import io.helidon.config.spi.ConfigNode; +import io.helidon.config.spi.ConfigParser; +import io.helidon.config.spi.ConfigSource; +import io.helidon.config.spi.LazyConfigSource; +import io.helidon.config.spi.NodeConfigSource; +import io.helidon.config.spi.ParsableSource; + +import org.junit.jupiter.api.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.hamcrest.MatcherAssert.assertThat; + +public class MpConfigSourcesTest { + @Test + void testHelidonMap() { + Map values = Map.of( + "key.first", "first", + "key.second", "second" + ); + org.eclipse.microprofile.config.spi.ConfigSource mpSource = MpConfigSources.create(ConfigSources.create(values).build()); + + assertThat(mpSource.getValue("key.first"), is("first")); + assertThat(mpSource.getValue("key.second"), is("second")); + } + @Test + void testHelidonParsable() { + ParsableImpl helidonSource = new ParsableImpl(); + org.eclipse.microprofile.config.spi.ConfigSource mpSource = MpConfigSources.create(helidonSource); + + assertThat(mpSource.getValue(ParsableImpl.KEY + ".notThere"), nullValue()); + assertThat(mpSource.getValue(ParsableImpl.KEY), is(ParsableImpl.VALUE)); + + assertThat(mpSource.getName(), is(ParsableImpl.DESCRIPTION)); + assertThat("init called exactly once", helidonSource.inits.get(), is(1)); + assertThat("exists called exactly once", helidonSource.exists.get(), is(1)); + } + @Test + void testHelidonNode() { + NodeImpl helidonSource = new NodeImpl(); + org.eclipse.microprofile.config.spi.ConfigSource mpSource = MpConfigSources.create(helidonSource); + + assertThat(mpSource.getValue(NodeImpl.KEY + ".notThere"), nullValue()); + assertThat(mpSource.getValue(NodeImpl.KEY), is(NodeImpl.VALUE)); + + assertThat(mpSource.getName(), is(NodeImpl.DESCRIPTION)); + assertThat("init called exactly once", helidonSource.inits.get(), is(1)); + assertThat("exists called exactly once", helidonSource.exists.get(), is(1)); + } + + @Test + void testHelidonLazy() { + LazyImpl lazy = new LazyImpl(); + + org.eclipse.microprofile.config.spi.ConfigSource mpSource = MpConfigSources.create(lazy); + assertThat(mpSource.getValue("key-1"), nullValue()); + + lazy.put("key-1", "value-1"); + assertThat(mpSource.getValue("key-1"), is("value-1")); + + lazy.remove("key-1"); + assertThat(mpSource.getValue("key-1"), nullValue()); + + assertThat(mpSource.getName(), is(LazyImpl.DESCRIPTION)); + assertThat("init called exactly once", lazy.inits.get(), is(1)); + assertThat("exists called exactly once", lazy.exists.get(), is(1)); + } + + private static final class NodeImpl implements ConfigSource, NodeConfigSource { + private static final String DESCRIPTION = "node-unit-test"; + private static final String KEY = "key"; + private static final String VALUE = "value"; + + private final AtomicInteger inits = new AtomicInteger(); + private final AtomicInteger exists = new AtomicInteger(); + + @Override + public Optional load() throws ConfigException { + return Optional.of(ConfigContent.NodeContent.builder() + .node(ConfigNode.ObjectNode.builder() + .addValue(KEY, VALUE) + .build()) + .build()); + } + + @Override + public void init(ConfigContext context) { + inits.incrementAndGet(); + } + + @Override + public boolean exists() { + exists.incrementAndGet(); + return true; + } + + @Override + public String description() { + return DESCRIPTION; + } + } + + private static final class LazyImpl implements ConfigSource, LazyConfigSource { + private static final String DESCRIPTION = "lazy-unit-test"; + + private final Map values = new ConcurrentHashMap<>(); + private final AtomicInteger inits = new AtomicInteger(); + private final AtomicInteger exists = new AtomicInteger(); + + @Override + public void init(ConfigContext context) { + inits.incrementAndGet(); + } + + @Override + public boolean exists() { + exists.incrementAndGet(); + return true; + } + + @Override + public String description() { + return DESCRIPTION; + } + + @Override + public Optional node(String key) { + return Optional.ofNullable(values.get(key)) + .map(ConfigNode.ValueNode::create); + } + + private void put(String key, String value) { + values.put(key, value); + } + + private void remove(String key) { + values.remove(key); + } + } + + private static final class ParsableImpl implements ConfigSource, ParsableSource { + private static final String DESCRIPTION = "parsable-unit-test"; + private static final String KEY = "parsable.key"; + private static final String VALUE = "parsableValue"; + private static final String CONTENT = KEY + "=" + VALUE; + + private final AtomicInteger inits = new AtomicInteger(); + private final AtomicInteger exists = new AtomicInteger(); + + @Override + public Optional load() throws ConfigException { + return Optional.of(content()); + } + + private ConfigParser.Content content() { + return ConfigParser.Content.builder() + .charset(StandardCharsets.UTF_8) + .data(new ByteArrayInputStream(CONTENT.getBytes(StandardCharsets.UTF_8))) + .mediaType(PropertiesConfigParser.MEDIA_TYPE_TEXT_JAVA_PROPERTIES) + .build(); + } + + @Override + public Optional parser() { + return Optional.empty(); + } + + @Override + public Optional mediaType() { + return Optional.empty(); + } + + @Override + public void init(ConfigContext context) { + inits.incrementAndGet(); + } + + @Override + public boolean exists() { + exists.incrementAndGet(); + return true; + } + + @Override + public String description() { + return DESCRIPTION; + } + } +} diff --git a/config/config/src/test/java/io/helidon/config/MpConfigTest.java b/config/config-mp/src/test/java/io/helidon/config/mp/MpConfigTest.java similarity index 75% rename from config/config/src/test/java/io/helidon/config/MpConfigTest.java rename to config/config-mp/src/test/java/io/helidon/config/mp/MpConfigTest.java index 43132cb35b7..00ccb22805c 100644 --- a/config/config/src/test/java/io/helidon/config/MpConfigTest.java +++ b/config/config-mp/src/test/java/io/helidon/config/mp/MpConfigTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2019, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package io.helidon.config; +package io.helidon.config.mp; import java.util.ArrayList; import java.util.List; @@ -44,22 +44,18 @@ public class MpConfigTest { @BeforeAll static void initClass() { - Object helidonConfig = io.helidon.config.Config.builder() - .addSource(ConfigSources.classpath("io/helidon/config/application.properties")) - .addSource(ConfigSources.create(Map.of("mp-1", "mp-value-1", - "mp-2", "mp-value-2", - "app.storageEnabled", "false", - "mp-array", "a,b,c", - "mp-list.0", "1", - "mp-list.1", "2", - "mp-list.2", "3"))) - .disableEnvironmentVariablesSource() - .disableSystemPropertiesSource() + config = ConfigProviderResolver.instance() + .getBuilder() + .withSources(MpConfigSources.create(Map.of("mp-1", "mp-value-1", + "mp-2", "mp-value-2", + "app.storageEnabled", "false", + "mp-array", "a,b,c", + "mp-list.0", "1", + "mp-list.1", "2", + "mp-list.2", "3")), + MpConfigSources.create(Map.of("app.storageEnabled", "true", + ConfigSource.CONFIG_ORDINAL, "1000"))) .build(); - - assertThat(helidonConfig, instanceOf(Config.class)); - - config = (Config) helidonConfig; } @Test @@ -72,15 +68,14 @@ void testConfigSources() { assertThat(asList, hasSize(2)); - ConfigSourceRuntimeImpl helidonWrapper = (ConfigSourceRuntimeImpl) asList.get(0); - assertThat(helidonWrapper.unwrap(), instanceOf(ClasspathConfigSource.class)); - helidonWrapper = (ConfigSourceRuntimeImpl) asList.get(1); - assertThat(helidonWrapper.unwrap(), instanceOf(MapConfigSource.class)); + assertThat(asList.get(0), instanceOf(MpMapSource.class)); + assertThat(asList.get(1), instanceOf(MpMapSource.class)); - ConfigSource classpath = asList.get(0); - assertThat(classpath.getValue("app.storageEnabled"), is("true")); + // first is the one with higher config ordinal + ConfigSource map = asList.get(0); + assertThat(map.getValue("app.storageEnabled"), is("true")); - ConfigSource map = asList.get(1); + map = asList.get(1); assertThat(map.getValue("mp-1"), is("mp-value-1")); assertThat(map.getValue("mp-2"), is("mp-value-2")); assertThat(map.getValue("app.storageEnabled"), is("false")); @@ -153,18 +148,20 @@ void arrayTest() { } private static class MutableConfigSource implements ConfigSource { - private AtomicReference value = new AtomicReference<>("initial"); + private final AtomicReference value = new AtomicReference<>("initial"); @Override public Map getProperties() { return Map.of("key", value.get()); } + @SuppressWarnings("ReturnOfNull") @Override public String getValue(String propertyName) { if ("key".equals(propertyName)) { return value.get(); } + // this is required by the specification (null returns if not found) return null; } @@ -179,22 +176,14 @@ private void set(String value) { } public static class Pizza { - private String flavor; - private String size; + private final String flavor; + private final String size; - public Pizza(String flavour, String size) { + private Pizza(String flavour, String size) { this.flavor = flavour; this.size = size; } - public String getSize() { - return size; - } - - public String getFlavor() { - return flavor; - } - @Override public String toString() { return flavor + ":" + size; diff --git a/config/tests/test-mp-reference/src/main/resources/META-INF/microprofile-config.properties b/config/config-mp/src/test/resources/META-INF/microprofile-config.properties similarity index 93% rename from config/tests/test-mp-reference/src/main/resources/META-INF/microprofile-config.properties rename to config/config-mp/src/test/resources/META-INF/microprofile-config.properties index 6bbb95a236a..45ff59e5d8a 100644 --- a/config/tests/test-mp-reference/src/main/resources/META-INF/microprofile-config.properties +++ b/config/config-mp/src/test/resources/META-INF/microprofile-config.properties @@ -27,3 +27,7 @@ referencing2-3=ref-${value2} referencing2-4=ref-${value2}-ref referencing3-1=${value1}-${value2} + +referencing4-1=${missing} +referencing4-2=${missing}-${value1} + diff --git a/config/config/pom.xml b/config/config/pom.xml index a19fbfa3b32..32a79284559 100644 --- a/config/config/pom.xml +++ b/config/config/pom.xml @@ -54,10 +54,6 @@ io.helidon.common helidon-common-media-type - - org.eclipse.microprofile.config - microprofile-config-api - org.junit.jupiter junit-jupiter-api diff --git a/config/config/src/main/java/io/helidon/config/AbstractConfigImpl.java b/config/config/src/main/java/io/helidon/config/AbstractConfigImpl.java index 656ecdd42fa..6e8070fce6e 100644 --- a/config/config/src/main/java/io/helidon/config/AbstractConfigImpl.java +++ b/config/config/src/main/java/io/helidon/config/AbstractConfigImpl.java @@ -17,24 +17,17 @@ package io.helidon.config; import java.time.Instant; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedList; import java.util.List; -import java.util.NoSuchElementException; import java.util.Objects; import java.util.Optional; -import java.util.Set; import java.util.function.Consumer; import java.util.logging.Logger; -import org.eclipse.microprofile.config.spi.ConfigSource; - /** * Abstract common implementation of {@link Config} extended by appropriate Config node types: * {@link ConfigListImpl}, {@link ConfigMissingImpl}, {@link ConfigObjectImpl}, {@link ConfigLeafImpl}. */ -abstract class AbstractConfigImpl implements Config, org.eclipse.microprofile.config.Config { +abstract class AbstractConfigImpl implements Config { public static final Logger LOGGER = Logger.getLogger(AbstractConfigImpl.class.getName()); @@ -45,8 +38,6 @@ abstract class AbstractConfigImpl implements Config, org.eclipse.microprofile.co private final Type type; private final Context context; private final ConfigMapperManager mapperManager; - private final boolean useSystemProperties; - private final boolean useEnvironmentVariables; /** * Initializes Config implementation. @@ -73,26 +64,6 @@ abstract class AbstractConfigImpl implements Config, org.eclipse.microprofile.co this.type = type; context = new NodeContextImpl(); - - boolean sysProps = false; - boolean envVars = false; - int index = 0; - for (ConfigSourceRuntimeBase configSource : factory.configSources()) { - if (index == 0 && configSource.isSystemProperties()) { - sysProps = true; - } - if (configSource.isEnvironmentVariables()) { - envVars = true; - } - - if (sysProps && envVars) { - break; - } - index++; - } - - this.useEnvironmentVariables = envVars; - this.useSystemProperties = sysProps; } /** @@ -164,117 +135,6 @@ public ConfigValue> asNodeList() throws ConfigMappingException { return asList(Config.class); } - /* - * MicroProfile Config methods - */ - @Override - public T getValue(String propertyName, Class propertyType) { - Config config = factory.context().last(); - try { - return mpFindValue(config, propertyName, propertyType); - } catch (MissingValueException e) { - throw new NoSuchElementException(e.getMessage()); - } catch (ConfigMappingException e) { - throw new IllegalArgumentException(e); - } - } - - @Override - public Optional getOptionalValue(String propertyName, Class propertyType) { - try { - return Optional.of(getValue(propertyName, propertyType)); - } catch (NoSuchElementException e) { - return Optional.empty(); - } catch (ConfigMappingException e) { - throw new IllegalArgumentException(e); - } - } - - @Override - public Iterable getPropertyNames() { - Set keys = new HashSet<>(factory.context().last() - .asMap() - .orElseGet(Collections::emptyMap) - .keySet()); - - if (useSystemProperties) { - keys.addAll(System.getProperties().stringPropertyNames()); - } - - return keys; - } - - @Override - public Iterable getConfigSources() { - Config config = factory.context().last(); - if (null == config) { - // maybe we are in progress of initializing this config (e.g. filter processing) - config = this; - } - - if (config instanceof AbstractConfigImpl) { - return ((AbstractConfigImpl) config).mpConfigSources(); - } - return Collections.emptyList(); - } - - private Iterable mpConfigSources() { - return new LinkedList<>(factory.mpConfigSources()); - } - - private T mpFindValue(Config config, String propertyName, Class propertyType) { - // this is a workaround TCK tests that expect system properties to be mutable - // Helidon config does the same, yet with a slight delay (polling reasons) - // we need to check if system properties are enabled and first - if so, do this - - String property = null; - if (useSystemProperties) { - property = System.getProperty(propertyName); - } - - if (null == property) { - ConfigValue value = config - .get(propertyName) - .as(propertyType); - - if (value.isPresent()) { - return value.get(); - } - - // try to find in env vars - if (useEnvironmentVariables) { - T envVar = mpFindEnvVar(config, propertyName, propertyType); - if (null != envVar) { - return envVar; - } - } - - return value.get(); - } else { - return config.get(propertyName).convert(propertyType, property); - } - } - - private T mpFindEnvVar(Config config, String propertyName, Class propertyType) { - String result = System.getenv(propertyName); - - // now let's resolve all variants required by the specification - if (null == result) { - for (String alias : EnvironmentVariableAliases.aliasesOf(propertyName)) { - result = System.getenv(alias); - if (null != result) { - break; - } - } - } - - if (null != result) { - return config.convert(propertyType, result); - } - - return null; - } - private Config contextConfig(Config rootConfig) { return rootConfig .get(AbstractConfigImpl.this.prefix) @@ -312,7 +172,5 @@ public Config last() { public Config reload() { return AbstractConfigImpl.this.contextConfig(AbstractConfigImpl.this.factory.context().reload()); } - } - } diff --git a/config/config/src/main/java/io/helidon/config/AbstractConfigSourceBuilder.java b/config/config/src/main/java/io/helidon/config/AbstractConfigSourceBuilder.java index 8594a93cde3..a2b09fe0502 100644 --- a/config/config/src/main/java/io/helidon/config/AbstractConfigSourceBuilder.java +++ b/config/config/src/main/java/io/helidon/config/AbstractConfigSourceBuilder.java @@ -41,7 +41,7 @@ public abstract class AbstractConfigSourceBuilder> parserMapping; @SuppressWarnings("unchecked") - private B me = (B) this; + private final B me = (B) this; /** * {@inheritDoc} diff --git a/config/config/src/main/java/io/helidon/config/AbstractNodeBuilderImpl.java b/config/config/src/main/java/io/helidon/config/AbstractNodeBuilderImpl.java index 168d5b68294..1e5be476d05 100644 --- a/config/config/src/main/java/io/helidon/config/AbstractNodeBuilderImpl.java +++ b/config/config/src/main/java/io/helidon/config/AbstractNodeBuilderImpl.java @@ -34,7 +34,7 @@ public abstract class AbstractNodeBuilderImpl { private final B thisBuilder; - private Function tokenResolver; + private final Function tokenResolver; @SuppressWarnings("unchecked") AbstractNodeBuilderImpl(Function tokenResolver) { @@ -80,13 +80,6 @@ static String formatFrom(String from) { } } - /** - * Human readable description of current builder implementation to be used in logs and exception messages. - * - * @return builder description - */ - protected abstract String typeDescription(); - /** * Returns id computed from key. * diff --git a/config/config/src/main/java/io/helidon/config/AbstractSourceBuilder.java b/config/config/src/main/java/io/helidon/config/AbstractSourceBuilder.java index 097c34e5cbc..9dab0a952d2 100644 --- a/config/config/src/main/java/io/helidon/config/AbstractSourceBuilder.java +++ b/config/config/src/main/java/io/helidon/config/AbstractSourceBuilder.java @@ -41,7 +41,7 @@ public abstract class AbstractSourceBuilder prioritizedSources = new ArrayList<>(); - private final List prioritizedMpSources = new ArrayList<>(); // sources "pre-sorted" - all user defined sources without priority will be ordered // as added, as well as config sources from meta configuration private final List sources = new LinkedList<>(); - private boolean configSourceServicesEnabled; // to use when more than one source is configured private MergingStrategy mergingStrategy = MergingStrategy.fallback(); private boolean hasSystemPropertiesSource; @@ -84,7 +74,6 @@ class BuilderImpl implements Config.Builder { private final List prioritizedMappers = new ArrayList<>(); private final MapperProviders mapperProviders; private boolean mapperServicesEnabled; - private boolean mpMapperServicesEnabled; /* * Config parsers */ @@ -104,7 +93,7 @@ class BuilderImpl implements Config.Builder { * Other configuration. */ private OverrideSource overrideSource; - private ClassLoader classLoader; + /* * Other switches */ @@ -114,15 +103,11 @@ class BuilderImpl implements Config.Builder { private boolean systemPropertiesSourceEnabled; private boolean environmentVariablesSourceEnabled; private boolean envVarAliasGeneratorEnabled; - private boolean mpDiscoveredSourcesAdded; - private boolean mpDiscoveredConvertersAdded; BuilderImpl() { - configSourceServicesEnabled = true; overrideSource = OverrideSources.empty(); mapperProviders = MapperProviders.create(); mapperServicesEnabled = true; - mpMapperServicesEnabled = true; parsers = new ArrayList<>(); parserServicesEnabled = true; filterProviders = new ArrayList<>(); @@ -135,12 +120,6 @@ class BuilderImpl implements Config.Builder { envVarAliasGeneratorEnabled = false; } - @Override - public Config.Builder disableSourceServices() { - this.configSourceServicesEnabled = false; - return this; - } - @Override public Config.Builder sources(List> sourceSuppliers) { // replace current config sources with the ones provided @@ -178,10 +157,6 @@ public Config.Builder disableMapperServices() { return this; } - void disableMpMapperServices() { - this.mpMapperServicesEnabled = false; - } - @Override public Config.Builder addStringMapper(Class type, Function mapper) { Objects.requireNonNull(type); @@ -322,14 +297,6 @@ public AbstractConfigImpl build() { if (null == changesExecutor) { changesExecutor = Executors.newCachedThreadPool(new ConfigThreadFactory("config-changes")); } - if (configSourceServicesEnabled) { - // add MP config sources from service loader (if not already done) - mpAddDiscoveredSources(); - } - if (mpMapperServicesEnabled) { - // add MP discovered converters from service loader (if not already done) - mpAddDiscoveredConverters(); - } /* * Now prepare the config runtime. @@ -393,7 +360,6 @@ public Config.Builder config(Config metaConfig) { metaConfig.get("key-resolving.enabled").asBoolean().ifPresent(this::keyResolvingEnabled); metaConfig.get("parsers.enabled").asBoolean().ifPresent(this::parserServicesEnabled); metaConfig.get("mappers.enabled").asBoolean().ifPresent(this::mapperServicesEnabled); - metaConfig.get("config-source-services.enabled").asBoolean().ifPresent(this::configSourceServicesEnabled); disableSystemPropertiesSource(); disableEnvironmentVariablesSource(); @@ -421,129 +387,6 @@ public Config.Builder mergingStrategy(MergingStrategy strategy) { return this; } - private void configSourceServicesEnabled(boolean enabled) { - this.configSourceServicesEnabled = enabled; - } - - void mpWithConverters(Converter... converters) { - for (Converter converter : converters) { - addMpConverter(converter); - } - } - - void mpWithConverter(Class type, int ordinal, Converter converter) { - // priority 1 is highest, 100 is default - // MP ordinal 1 is lowest, 100 is default - - // 100 - priority 1 - // 101 - priority 0 - int priority = 101 - ordinal; - prioritizedMappers.add(new MpConverterWrapper(type, converter, priority)); - } - - @SuppressWarnings("unchecked") - private void addMpConverter(Converter converter) { - Class type = (Class) getTypeOfMpConverter(converter.getClass()); - if (type == null) { - throw new IllegalStateException("Converter " + converter.getClass() + " must be a ParameterizedType"); - } - - mpWithConverter(type, - Priorities.find(converter.getClass(), 100), - converter); - } - - void mpAddDefaultSources() { - hasEnvVarSource = true; - hasSystemPropertiesSource = true; - - prioritizedSources.add(new HelidonSourceWithPriority(ConfigSources.systemProperties().build(), 100)); - prioritizedSources.add(new HelidonSourceWithPriority(ConfigSources.environmentVariables(), 100)); - prioritizedSources.add(new HelidonSourceWithPriority(ConfigSources.classpath("application.yaml") - .optional(true) - .build(), 100)); - - ConfigSources.classpathAll("META-INF/microprofile-config.properties") - .stream() - .map(io.helidon.common.Builder::build) - .map(source -> new HelidonSourceWithPriority(source, 100)) - .forEach(prioritizedSources::add); - } - - void mpAddDiscoveredSources() { - if (mpDiscoveredSourcesAdded) { - return; - } - this.mpDiscoveredSourcesAdded = true; - this.configSourceServicesEnabled = true; - final ClassLoader usedCl = ((null == classLoader) ? Thread.currentThread().getContextClassLoader() : classLoader); - - List mpSources = new LinkedList<>(); - - // service loader MP sources - HelidonServiceLoader - .create(ServiceLoader.load(org.eclipse.microprofile.config.spi.ConfigSource.class, usedCl)) - .forEach(mpSources::add); - - // config source providers - HelidonServiceLoader.create(ServiceLoader.load(ConfigSourceProvider.class, usedCl)) - .forEach(csp -> csp.getConfigSources(usedCl) - .forEach(mpSources::add)); - - for (org.eclipse.microprofile.config.spi.ConfigSource source : mpSources) { - prioritizedMpSources.add(new PrioritizedMpSource(source)); - } - } - - void mpAddDiscoveredConverters() { - if (mpDiscoveredConvertersAdded) { - return; - } - this.mpDiscoveredConvertersAdded = true; - this.mpMapperServicesEnabled = true; - - final ClassLoader usedCl = ((null == classLoader) ? Thread.currentThread().getContextClassLoader() : classLoader); - - HelidonServiceLoader.create(ServiceLoader.load(Converter.class, usedCl)) - .forEach(this::addMpConverter); - } - - void mpForClassLoader(ClassLoader loader) { - this.classLoader = loader; - } - - void mpWithSources(org.eclipse.microprofile.config.spi.ConfigSource... sources) { - for (org.eclipse.microprofile.config.spi.ConfigSource source : sources) { - if (source instanceof AbstractConfigSource) { - prioritizedSources.add(new HelidonSourceWithPriority((ConfigSource) source, null)); - } else { - prioritizedMpSources.add(new PrioritizedMpSource(source)); - } - } - } - - private Type getTypeOfMpConverter(Class clazz) { - if (clazz.equals(Object.class)) { - return null; - } - - Type[] genericInterfaces = clazz.getGenericInterfaces(); - for (Type genericInterface : genericInterfaces) { - if (genericInterface instanceof ParameterizedType) { - ParameterizedType pt = (ParameterizedType) genericInterface; - if (pt.getRawType().equals(Converter.class)) { - Type[] typeArguments = pt.getActualTypeArguments(); - if (typeArguments.length != 1) { - throw new IllegalStateException("Converter " + clazz + " must be a ParameterizedType."); - } - return typeArguments[0]; - } - } - } - - return getTypeOfMpConverter(clazz.getSuperclass()); - } - private void cachingEnabled(boolean enabled) { this.cachingEnabled = enabled; } @@ -561,7 +404,7 @@ private void keyResolvingEnabled(Boolean aBoolean) { } private ConfigSourcesRuntime buildConfigSources(ConfigContextImpl context) { - List targetSources = new LinkedList<>(); + List targetSources = new LinkedList<>(); if (systemPropertiesSourceEnabled && !hasSystemPropertiesSource) { hasSystemPropertiesSource = true; @@ -577,7 +420,7 @@ private ConfigSourcesRuntime buildConfigSources(ConfigContextImpl context) { envVarAliasGeneratorEnabled = true; } - boolean nothingConfigured = sources.isEmpty() && prioritizedSources.isEmpty() && prioritizedMpSources.isEmpty(); + boolean nothingConfigured = sources.isEmpty() && prioritizedSources.isEmpty(); if (nothingConfigured) { // use meta configuration to load all sources @@ -601,10 +444,10 @@ private ConfigSourcesRuntime buildConfigSources(ConfigContextImpl context) { return new ConfigSourcesRuntime(targetSources, mergingStrategy); } - private List mergePrioritized(ConfigContextImpl context) { - List allPrioritized = new ArrayList<>(this.prioritizedMpSources); + private List mergePrioritized(ConfigContextImpl context) { + List allPrioritized = new ArrayList<>(); prioritizedSources.stream() - .map(it -> new PrioritizedHelidonSource(it, context)) + .map(it -> new PrioritizedConfigSource(it, context)) .forEach(allPrioritized::add); Priorities.sort(allPrioritized); @@ -711,7 +554,7 @@ private void addAutoLoadedFilters() { .build() .asList() .stream() - .map(filter -> (Function) (Config t) -> filter) + .map(LoadedFilterProvider::new) .forEach(this::addFilter); } @@ -719,9 +562,7 @@ private void addAutoLoadedFilters() { * {@link ConfigContext} implementation. */ static class ConfigContextImpl implements ConfigContext { - private final Map runtimes = new IdentityHashMap<>(); - private final Map mpRuntimes - = new IdentityHashMap<>(); + private final Map runtimes = new IdentityHashMap<>(); private final Executor changesExecutor; private final List configParsers; @@ -736,7 +577,7 @@ public ConfigSourceRuntime sourceRuntime(ConfigSource source) { return sourceRuntimeBase(source); } - private ConfigSourceRuntimeBase sourceRuntimeBase(ConfigSource source) { + private ConfigSourceRuntimeImpl sourceRuntimeBase(ConfigSource source) { return runtimes.computeIfAbsent(source, it -> new ConfigSourceRuntimeImpl(this, source)); } @@ -748,10 +589,6 @@ Optional findParser(String mediaType) { .findFirst(); } - ConfigSourceRuntimeBase sourceRuntime(org.eclipse.microprofile.config.spi.ConfigSource source) { - return mpRuntimes.computeIfAbsent(source, it -> new ConfigSourceMpRuntimeImpl(source)); - } - Executor changesExecutor() { return changesExecutor; } @@ -770,7 +607,6 @@ private EmptyConfigHolder() { // config sources .sources(ConfigSources.empty()) .overrides(OverrideSources.empty()) - .disableSourceServices() .disableEnvironmentVariablesSource() .disableSystemPropertiesSource() .disableParserServices() @@ -803,35 +639,6 @@ private interface PrioritizedMapperProvider extends Prioritized, ConfigMapperProvider { } - private static final class MpConverterWrapper implements PrioritizedMapperProvider { - private final Map, Function> converterMap = new HashMap<>(); - private final Converter converter; - private final int priority; - - private MpConverterWrapper(Class theClass, - Converter converter, - int priority) { - this.converter = converter; - this.priority = priority; - this.converterMap.put(theClass, config -> config.asString().as(converter::convert).get()); - } - - @Override - public int priority() { - return priority; - } - - @Override - public Map, Function> mappers() { - return converterMap; - } - - @Override - public String toString() { - return converter.toString(); - } - } - private static final class HelidonMapperWrapper implements PrioritizedMapperProvider { private final ConfigMapperProvider delegate; private final int priority; @@ -872,56 +679,16 @@ public String toString() { } } - private interface PrioritizedConfigSource extends Prioritized { - ConfigSourceRuntimeBase runtime(ConfigContextImpl context); - } - - private static final class PrioritizedMpSource implements PrioritizedConfigSource { - private final org.eclipse.microprofile.config.spi.ConfigSource delegate; - - private PrioritizedMpSource(org.eclipse.microprofile.config.spi.ConfigSource delegate) { - this.delegate = delegate; - - } - - @Override - public ConfigSourceRuntimeBase runtime(ConfigContextImpl context) { - return context.sourceRuntime(delegate); - } - - @Override - public int priority() { - // MP config is using "ordinals" - the higher the number, the more important it is - // We are using "priorities" - the lower the number, the more important it is - String value = delegate.getValue(CONFIG_ORDINAL); - - int priority; - - if (null != value) { - priority = Integer.parseInt(value); - } else { - priority = Priorities.find(delegate, 100); - } - - // priority from Prioritized and annotation (MP has it reversed) - // it is a tough call how to merge priorities and ordinals - // now we use a "101" as a constant, so components with ordinal 100 will have - // priority of 1 - return 101 - priority; - } - } - - private static final class PrioritizedHelidonSource implements PrioritizedConfigSource { + private static final class PrioritizedConfigSource implements Prioritized { private final HelidonSourceWithPriority source; private final ConfigContext context; - private PrioritizedHelidonSource(HelidonSourceWithPriority source, ConfigContext context) { + private PrioritizedConfigSource(HelidonSourceWithPriority source, ConfigContext context) { this.source = source; this.context = context; } - @Override - public ConfigSourceRuntimeBase runtime(ConfigContextImpl context) { + private ConfigSourceRuntimeImpl runtime(ConfigContextImpl context) { return context.sourceRuntimeBase(source.unwrap()); } @@ -952,7 +719,7 @@ int priority(ConfigContext context) { // ordinal from data return context.sourceRuntime(configSource) - .node(CONFIG_ORDINAL) + .node("config_priority") .flatMap(node -> node.value() .map(Integer::parseInt)) .orElseGet(() -> { @@ -962,4 +729,21 @@ int priority(ConfigContext context) { } } + private static class LoadedFilterProvider implements Function { + private final ConfigFilter filter; + + private LoadedFilterProvider(ConfigFilter filter) { + this.filter = filter; + } + + @Override + public ConfigFilter apply(Config config) { + return filter; + } + + @Override + public String toString() { + return filter.toString(); + } + } } diff --git a/config/config/src/main/java/io/helidon/config/Config.java b/config/config/src/main/java/io/helidon/config/Config.java index b84fb99025a..13100181ccb 100644 --- a/config/config/src/main/java/io/helidon/config/Config.java +++ b/config/config/src/main/java/io/helidon/config/Config.java @@ -17,7 +17,6 @@ package io.helidon.config; import java.time.Instant; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -41,7 +40,7 @@ *

Configuration

* Immutable tree-structured configuration. *

Loading Configuration

- * Load the default configuration using the {@link #create} method. + * Load the default configuration using the {@link Config#create} method. *
{@code
  * Config config = Config.create();
  * }
Use {@link Config.Builder} to construct a new {@code Config} instance @@ -234,7 +233,7 @@ *

Handling Multiple Configuration * Sources

* A {@code Config} instance, including the default {@code Config} returned by - * {@link #create}, might be associated with multiple {@link ConfigSource}s. The + * {@link Config#create}, might be associated with multiple {@link ConfigSource}s. The * config system merges these together so that values from config sources with higher priority have * precedence over values from config sources with lower priority. */ @@ -375,50 +374,6 @@ static Builder builder() { return new BuilderImpl(); } - /** - * This method allows use to use Helidon Config on top of an MP config. - * There is a limitation - the converters configured with MP config will not be available, unless - * the implementation is coming from Helidon. - * - * @param mpConfig MP Config instance - * @return a new Helidon config using only the mpConfig as its config source - */ - @SuppressWarnings("unchecked") - static Config create(org.eclipse.microprofile.config.Config mpConfig) { - if (mpConfig instanceof Config) { - return (Config) mpConfig; - } - - Builder builder = Config.builder() - .disableEnvironmentVariablesSource() - .disableSystemPropertiesSource() - .disableMapperServices() - .disableCaching() - .disableSourceServices() - .disableParserServices() - .disableFilterServices(); - - if (mpConfig instanceof MpConfig) { - ((MpConfig)mpConfig).converters() - .forEach((clazz, converter) -> { - Class cl = (Class) clazz; - builder.addStringMapper(cl, converter::convert); - }); - } - - Map allConfig = new HashMap<>(); - mpConfig.getPropertyNames() - .forEach(it -> { - // covering the condition where a config key disappears between getting the property names and requesting - // the value - Optional optionalValue = mpConfig.getOptionalValue(it, String.class); - optionalValue.ifPresent(value -> allConfig.put(it, value)); - }); - - return builder.addSource(ConfigSources.create(allConfig)) - .build(); - } - /** * Returns the {@code Context} instance associated with the current * {@code Config} node that allows the application to access the last loaded @@ -854,6 +809,7 @@ default ConfigValue asNode() { // // config changes // + /** * Register a {@link Consumer} that is invoked each time a change occurs on whole Config or on a particular Config node. *

@@ -1021,8 +977,8 @@ enum Type { */ MISSING(false, false); - private boolean exists; - private boolean isLeaf; + private final boolean exists; + private final boolean isLeaf; Type(boolean exists, boolean isLeaf) { this.exists = exists; @@ -1159,14 +1115,6 @@ interface Context { * @see ConfigFilter */ interface Builder { - /** - * Disable loading of config sources from Java service loader. - * This disables loading of MicroProfile Config sources. - * - * @return updated builder instance - */ - Builder disableSourceServices(); - /** * Sets ordered list of {@link ConfigSource} instance to be used as single source of configuration * to be wrapped into {@link Config} API. diff --git a/config/config/src/main/java/io/helidon/config/ConfigDiff.java b/config/config/src/main/java/io/helidon/config/ConfigDiff.java index ad986ff1c46..13126dbf629 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigDiff.java +++ b/config/config/src/main/java/io/helidon/config/ConfigDiff.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -56,7 +56,6 @@ static ConfigDiff from(Config origConfig, Config newConfig) { .map(Config::key) .distinct() .flatMap(ConfigDiff::expandKey) - .distinct() .collect(toSet()); return new ConfigDiff(newConfig, changedKeys); diff --git a/config/config/src/main/java/io/helidon/config/ConfigFactory.java b/config/config/src/main/java/io/helidon/config/ConfigFactory.java index a4c3f785b55..34b7ff0ebf4 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigFactory.java +++ b/config/config/src/main/java/io/helidon/config/ConfigFactory.java @@ -23,7 +23,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import java.util.function.Function; -import java.util.stream.Collectors; import io.helidon.config.spi.ConfigFilter; import io.helidon.config.spi.ConfigNode; @@ -44,8 +43,6 @@ final class ConfigFactory { private final Function> aliasGenerator; private final ConcurrentMap configCache; private final Instant timestamp; - private final List configSources; - private final List mpConfigSources; /** * Create new instance of the factory operating on specified {@link ConfigSource}. @@ -60,8 +57,7 @@ final class ConfigFactory { ObjectNode node, ConfigFilter filter, ProviderImpl provider, - Function> aliasGenerator, - List configSources) { + Function> aliasGenerator) { Objects.requireNonNull(mapperManager, "mapperManager argument is null."); Objects.requireNonNull(node, "node argument is null."); @@ -73,14 +69,9 @@ final class ConfigFactory { this.filter = filter; this.provider = provider; this.aliasGenerator = aliasGenerator; - this.configSources = configSources; configCache = new ConcurrentHashMap<>(); timestamp = Instant.now(); - - this.mpConfigSources = configSources.stream() - .map(ConfigSourceRuntime::asMpSource) - .collect(Collectors.toList()); } Instant timestamp() { @@ -161,14 +152,6 @@ ProviderImpl provider() { return provider; } - List configSources() { - return configSources; - } - - List mpConfigSources() { - return mpConfigSources; - } - /** * Prefix represents detached roots. */ diff --git a/config/config/src/main/java/io/helidon/config/ConfigHelper.java b/config/config/src/main/java/io/helidon/config/ConfigHelper.java index 71ccbf100e7..60b8f1a9a27 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigHelper.java +++ b/config/config/src/main/java/io/helidon/config/ConfigHelper.java @@ -18,10 +18,6 @@ import java.util.AbstractMap; import java.util.Map; -import java.util.concurrent.Flow; -import java.util.function.Function; -import java.util.logging.Level; -import java.util.logging.Logger; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -37,26 +33,18 @@ private ConfigHelper() { } /** - * Creates a {@link ConfigHelper#subscriber(Function) Flow.Subscriber} that - * will delegate {@link Flow.Subscriber#onNext(Object)} to the specified - * {@code onNextFunction} function. - *

- * The new subscriber's - * {@link Flow.Subscriber#onSubscribe(Flow.Subscription)} method - * automatically invokes {@link Flow.Subscription#request(long)} to request - * all events that are available in the subscription. - *

- * The caller-provided {@code onNextFunction} should return {@code false} in - * order to {@link Flow.Subscription#cancel() cancel} current subscription. + * Create a map of keys to string values from an object node. * - * @param onNextFunction function to be invoked during {@code onNext} - * processing - * @param the type of the items provided by the subscription - * @return {@code Subscriber} that delegates its {@code onNext} to the - * caller-provided function + * @param objectNode node to flatten + * @return a map of all nodes */ - public static Flow.Subscriber subscriber(Function onNextFunction) { - return new OnNextFunctionSubscriber<>(onNextFunction); + public static Map flattenNodes(ConfigNode.ObjectNode objectNode) { + return ConfigHelper.flattenNodes(ConfigKeyImpl.of(), objectNode) + .filter(e -> e.getValue() instanceof ValueNodeImpl) + .collect(Collectors.toMap( + e -> e.getKey().toString(), + e -> Config.Key.escapeName(((ValueNodeImpl) e.getValue()).get()) + )); } static Map createFullKeyToNodeMap(ConfigNode.ObjectNode objectNode) { @@ -89,55 +77,4 @@ static Stream> flattenNodes(ConfigKeyImpl k throw new IllegalArgumentException("Invalid node type."); } } - - /** - * Implementation of {@link ConfigHelper#subscriber(Function)}. - * - * @param the subscribed item type - * @see ConfigHelper#subscriber(Function) - */ - private static class OnNextFunctionSubscriber implements Flow.Subscriber { - private final Function onNextFunction; - private final Logger logger; - private Flow.Subscription subscription; - - private OnNextFunctionSubscriber(Function onNextFunction) { - this.onNextFunction = onNextFunction; - this.logger = Logger.getLogger(OnNextFunctionSubscriber.class.getName() + "." - + Integer.toHexString(System.identityHashCode(onNextFunction))); - } - - @Override - public void onSubscribe(Flow.Subscription subscription) { - logger.finest(() -> "onSubscribe: " + subscription); - - this.subscription = subscription; - subscription.request(Long.MAX_VALUE); - } - - @Override - public void onNext(T item) { - boolean cancel = !onNextFunction.apply(item); - - logger.finest(() -> "onNext: " + item + " => " + (cancel ? "CANCEL" : "FOLLOW")); - - if (cancel) { - subscription.cancel(); - } - } - - @Override - public void onError(Throwable throwable) { - logger.log(Level.WARNING, - throwable, - () -> "Config Changes support failed. " + throwable.getLocalizedMessage()); - } - - @Override - public void onComplete() { - logger.config("Config Changes support finished. There will no other Config reload."); - } - - } - } diff --git a/config/config/src/main/java/io/helidon/config/ConfigLeafImpl.java b/config/config/src/main/java/io/helidon/config/ConfigLeafImpl.java index d09f698a894..0853dcec606 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigLeafImpl.java +++ b/config/config/src/main/java/io/helidon/config/ConfigLeafImpl.java @@ -59,7 +59,7 @@ public ConfigValue> asList(Class type) throws ConfigMappingExcept } Optional value = value(); - if (!value.isPresent()) { + if (value.isEmpty()) { return ConfigValues.create(this, Optional::empty, aConfig -> aConfig.asList(type)); } @@ -89,7 +89,7 @@ public ConfigValue> asList(Class type) throws ConfigMappingExcept @Override public ConfigValue> asList(Function mapper) throws ConfigMappingException { Optional value = value(); - if (!value.isPresent()) { + if (value.isEmpty()) { return ConfigValues.create(this, Optional::empty, aConfig -> aConfig.asList(mapper)); } diff --git a/config/config/src/main/java/io/helidon/config/ConfigMappers.java b/config/config/src/main/java/io/helidon/config/ConfigMappers.java index 204f1a7ab96..52a0c72a134 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigMappers.java +++ b/config/config/src/main/java/io/helidon/config/ConfigMappers.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -44,10 +44,8 @@ import java.time.temporal.TemporalAccessor; import java.util.AbstractMap; import java.util.Calendar; -import java.util.Collections; import java.util.Date; import java.util.GregorianCalendar; -import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.Optional; @@ -81,100 +79,96 @@ private ConfigMappers() { } private static Map, Function> initEssentialMappers() { - Map, Function> essentials = new HashMap<>(); - essentials.put(Config.class, (node) -> node); - - essentials.put(String.class, wrap(value -> value)); - - essentials.put(OptionalInt.class, (node) -> { - if (!node.exists()) { - return OptionalInt.empty(); - } - - return OptionalInt.of(wrap(Integer::parseInt).apply(node)); - }); + return Map.of(Config.class, (node) -> node, + String.class, wrap(value -> value), + OptionalInt.class, ConfigMappers::optionalIntEssential, + OptionalLong.class, ConfigMappers::optionalLongEssential, + OptionalDouble.class, ConfigMappers::optionalDoubleEssential); + } - essentials.put(OptionalLong.class, (node) -> { - if (!node.exists()) { - return OptionalLong.empty(); - } + static Map, Function> essentialMappers() { + return ESSENTIAL_MAPPERS; + } - return OptionalLong.of(wrap(Long::parseLong).apply(node)); - }); + private static OptionalDouble optionalDoubleEssential(Config node) { + if (!node.exists()) { + return OptionalDouble.empty(); + } - essentials.put(OptionalDouble.class, (node) -> { - if (!node.exists()) { - return OptionalDouble.empty(); - } + return OptionalDouble.of(wrap(Double::parseDouble).apply(node)); + } - return OptionalDouble.of(wrap(Double::parseDouble).apply(node)); - }); + private static OptionalLong optionalLongEssential(Config node) { + if (!node.exists()) { + return OptionalLong.empty(); + } - return Collections.unmodifiableMap(essentials); + return OptionalLong.of(wrap(Long::parseLong).apply(node)); } - static Map, Function> essentialMappers() { - return ESSENTIAL_MAPPERS; + private static OptionalInt optionalIntEssential(Config node) { + if (!node.exists()) { + return OptionalInt.empty(); + } + + return OptionalInt.of(wrap(Integer::parseInt).apply(node)); } private static Map, Function> initBuiltInMappers() { - Map, Function> builtIns = new HashMap<>(); //primitive types - builtIns.put(Byte.class, wrap(ConfigMappers::toByte)); - builtIns.put(Short.class, wrap(ConfigMappers::toShort)); - builtIns.put(Integer.class, wrap(ConfigMappers::toInt)); - builtIns.put(Long.class, wrap(ConfigMappers::toLong)); - builtIns.put(Float.class, wrap(ConfigMappers::toFloat)); - builtIns.put(Double.class, wrap(ConfigMappers::toDouble)); - builtIns.put(Boolean.class, wrap(ConfigMappers::toBoolean)); - builtIns.put(Character.class, wrap(ConfigMappers::toChar)); - //java.lang - builtIns.put(Class.class, wrap(ConfigMappers::toClass)); - //javax.math - builtIns.put(BigDecimal.class, wrap(ConfigMappers::toBigDecimal)); - builtIns.put(BigInteger.class, wrap(ConfigMappers::toBigInteger)); - //java.time - builtIns.put(Duration.class, wrap(ConfigMappers::toDuration)); - builtIns.put(Period.class, wrap(ConfigMappers::toPeriod)); - builtIns.put(LocalDate.class, wrap(ConfigMappers::toLocalDate)); - builtIns.put(LocalDateTime.class, wrap(ConfigMappers::toLocalDateTime)); - builtIns.put(LocalTime.class, wrap(ConfigMappers::toLocalTime)); - builtIns.put(ZonedDateTime.class, wrap(ConfigMappers::toZonedDateTime)); - builtIns.put(ZoneId.class, wrap(ConfigMappers::toZoneId)); - builtIns.put(ZoneOffset.class, wrap(ConfigMappers::toZoneOffset)); - builtIns.put(Instant.class, wrap(ConfigMappers::toInstant)); - builtIns.put(OffsetTime.class, wrap(ConfigMappers::toOffsetTime)); - builtIns.put(OffsetDateTime.class, wrap(ConfigMappers::toOffsetDateTime)); - builtIns.put(YearMonth.class, wrap(YearMonth::parse)); - //java.io - builtIns.put(File.class, wrap(ConfigMappers::toFile)); - //java.nio - builtIns.put(Path.class, wrap(ConfigMappers::toPath)); - builtIns.put(Charset.class, wrap(ConfigMappers::toCharset)); - //java.net - builtIns.put(URI.class, wrap(ConfigMappers::toUri)); - builtIns.put(URL.class, wrap(ConfigMappers::toUrl)); - //java.util - builtIns.put(Pattern.class, wrap(ConfigMappers::toPattern)); - builtIns.put(UUID.class, wrap(ConfigMappers::toUUID)); - builtIns.put(Map.class, wrapMapper(ConfigMappers::toMap)); - builtIns.put(Properties.class, wrapMapper(ConfigMappers::toProperties)); - - // obsolete stuff - //noinspection UseOfObsoleteDateTimeApi,deprecation - builtIns.put(Date.class, wrap(ConfigMappers::toDate)); - //noinspection UseOfObsoleteDateTimeApi,deprecation - builtIns.put(Calendar.class, wrap(ConfigMappers::toCalendar)); - //noinspection UseOfObsoleteDateTimeApi,deprecation - builtIns.put(GregorianCalendar.class, wrap(ConfigMappers::toGregorianCalendar)); - //noinspection UseOfObsoleteDateTimeApi,deprecation - builtIns.put(TimeZone.class, wrap(ConfigMappers::toTimeZone)); - //noinspection UseOfObsoleteDateTimeApi,deprecation - builtIns.put(SimpleTimeZone.class, wrap(ConfigMappers::toSimpleTimeZone)); - - return Collections.unmodifiableMap(builtIns); + return Map.ofEntries(Map.entry(Byte.class, wrap(ConfigMappers::toByte)), + Map.entry(Short.class, wrap(ConfigMappers::toShort)), + Map.entry(Integer.class, wrap(ConfigMappers::toInt)), + Map.entry(Long.class, wrap(ConfigMappers::toLong)), + Map.entry(Float.class, wrap(ConfigMappers::toFloat)), + Map.entry(Double.class, wrap(ConfigMappers::toDouble)), + Map.entry(Boolean.class, wrap(ConfigMappers::toBoolean)), + Map.entry(Character.class, wrap(ConfigMappers::toChar)), + //java.lang + Map.entry(Class.class, wrap(ConfigMappers::toClass)), + //javax.math + Map.entry(BigDecimal.class, wrap(ConfigMappers::toBigDecimal)), + Map.entry(BigInteger.class, wrap(ConfigMappers::toBigInteger)), + //java.time + Map.entry(Duration.class, wrap(ConfigMappers::toDuration)), + Map.entry(Period.class, wrap(ConfigMappers::toPeriod)), + Map.entry(LocalDate.class, wrap(ConfigMappers::toLocalDate)), + Map.entry(LocalDateTime.class, wrap(ConfigMappers::toLocalDateTime)), + Map.entry(LocalTime.class, wrap(ConfigMappers::toLocalTime)), + Map.entry(ZonedDateTime.class, wrap(ConfigMappers::toZonedDateTime)), + Map.entry(ZoneId.class, wrap(ConfigMappers::toZoneId)), + Map.entry(ZoneOffset.class, wrap(ConfigMappers::toZoneOffset)), + Map.entry(Instant.class, wrap(ConfigMappers::toInstant)), + Map.entry(OffsetTime.class, wrap(ConfigMappers::toOffsetTime)), + Map.entry(OffsetDateTime.class, wrap(ConfigMappers::toOffsetDateTime)), + Map.entry(YearMonth.class, wrap(YearMonth::parse)), + //java.io + Map.entry(File.class, wrap(ConfigMappers::toFile)), + //java.nio + Map.entry(Path.class, wrap(ConfigMappers::toPath)), + Map.entry(Charset.class, wrap(ConfigMappers::toCharset)), + //java.net + Map.entry(URI.class, wrap(ConfigMappers::toUri)), + Map.entry(URL.class, wrap(ConfigMappers::toUrl)), + //java.util + Map.entry(Pattern.class, wrap(ConfigMappers::toPattern)), + Map.entry(UUID.class, wrap(ConfigMappers::toUUID)), + Map.entry(Map.class, wrapMapper(ConfigMappers::toMap)), + Map.entry(Properties.class, wrapMapper(ConfigMappers::toProperties)), + + // obsolete stuff + // noinspection UseOfObsoleteDateTimeApi + Map.entry(Date.class, wrap(ConfigMappers::toDate)), + // noinspection UseOfObsoleteDateTimeApi + Map.entry(Calendar.class, wrap(ConfigMappers::toCalendar)), + // noinspection UseOfObsoleteDateTimeApi + Map.entry(GregorianCalendar.class, wrap(ConfigMappers::toGregorianCalendar)), + // noinspection UseOfObsoleteDateTimeApi + Map.entry(TimeZone.class, wrap(ConfigMappers::toTimeZone)), + // noinspection UseOfObsoleteDateTimeApi + Map.entry(SimpleTimeZone.class, wrap(ConfigMappers::toSimpleTimeZone))); } static Map, Function> builtInMappers() { diff --git a/config/config/src/main/java/io/helidon/config/ConfigSourceMpRuntimeImpl.java b/config/config/src/main/java/io/helidon/config/ConfigSourceMpRuntimeImpl.java deleted file mode 100644 index edc1b88a694..00000000000 --- a/config/config/src/main/java/io/helidon/config/ConfigSourceMpRuntimeImpl.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2020 Oracle and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.helidon.config; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Optional; -import java.util.function.BiConsumer; -import java.util.logging.Level; - -import io.helidon.config.spi.ConfigNode; - -import org.eclipse.microprofile.config.spi.ConfigSource; - -import static io.helidon.config.AbstractConfigImpl.LOGGER; - -class ConfigSourceMpRuntimeImpl extends ConfigSourceRuntimeBase { - private final ConfigSource source; - - ConfigSourceMpRuntimeImpl(ConfigSource source) { - this.source = source; - } - - @Override - public boolean isLazy() { - // MP config sources are considered eager - return false; - } - - @Override - public void onChange(BiConsumer change) { - try { - // this is not a documented feature - // it is to enable MP config sources to be "mutable" in Helidon - // this requires some design decisions (and clarification of the MP Config Specification), as this - // is open to different interpretations for now - Method method = source.getClass().getMethod("registerChangeListener", BiConsumer.class); - BiConsumer mpListener = (key, value) -> change.accept(key, ConfigNode.ValueNode.create(value)); - - method.invoke(source, mpListener); - } catch (NoSuchMethodException e) { - LOGGER.finest("No registerChangeListener(BiConsumer) method found on " + source.getClass() + ", change" - + " support not enabled for this config source (" + source.getName() + ")"); - } catch (IllegalAccessException e) { - LOGGER.log(Level.WARNING, "Cannot invoke registerChangeListener(BiConsumer) method on " + source.getClass() + ", " - + "change support not enabled for this config source (" - + source.getName() + ")", e); - } catch (InvocationTargetException e) { - LOGGER.log(Level.WARNING, "Invocation of registerChangeListener(BiConsumer) method on " + source.getClass() - + " failed with an exception, " - + "change support not enabled for this config source (" - + source.getName() + ")", e); - } - } - - @Override - public Optional load() { - return Optional.of(ConfigUtils.mapToObjectNode(source.getProperties(), false)); - } - - @Override - public Optional node(String key) { - String value = source.getValue(key); - - if (null == value) { - return Optional.empty(); - } - - return Optional.of(ConfigNode.ValueNode.create(value)); - } - - @Override - public ConfigSource asMpSource() { - return source; - } - - @Override - public String description() { - return source.getName(); - } - - @Override - boolean changesSupported() { - // supported through a known method signature - return true; - } -} diff --git a/config/config/src/main/java/io/helidon/config/ConfigSourceRuntime.java b/config/config/src/main/java/io/helidon/config/ConfigSourceRuntime.java index 9f4208e3054..d96a69751b6 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigSourceRuntime.java +++ b/config/config/src/main/java/io/helidon/config/ConfigSourceRuntime.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,8 +20,6 @@ import io.helidon.config.spi.ConfigNode; -import org.eclipse.microprofile.config.spi.ConfigSource; - /** * The runtime of a config source. For a single {@link Config}, there is one source runtime for each configured * config source. @@ -54,13 +52,6 @@ public interface ConfigSourceRuntime { */ Optional node(String key); - /** - * Get the underlying config source as a MicroProfile {@link org.eclipse.microprofile.config.spi.ConfigSource}. - * - * @return MP Config source - */ - ConfigSource asMpSource(); - /** * Description of the underlying config source. * @return description of the source diff --git a/config/config/src/main/java/io/helidon/config/ConfigSourceRuntimeImpl.java b/config/config/src/main/java/io/helidon/config/ConfigSourceRuntimeImpl.java index b19fb600318..7f35b230971 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigSourceRuntimeImpl.java +++ b/config/config/src/main/java/io/helidon/config/ConfigSourceRuntimeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.Properties; import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.Consumer; @@ -50,7 +49,7 @@ * config source. * */ -public class ConfigSourceRuntimeImpl extends ConfigSourceRuntimeBase implements org.eclipse.microprofile.config.spi.ConfigSource { +class ConfigSourceRuntimeImpl implements ConfigSourceRuntime { private static final Logger LOGGER = Logger.getLogger(ConfigSourceRuntimeImpl.class.getName()); private final List> listeners = new LinkedList<>(); @@ -72,7 +71,6 @@ public class ConfigSourceRuntimeImpl extends ConfigSourceRuntimeBase implements // for eager sources, this is the data we get initially, everything else is handled through change listeners private Optional initialData; private Map loadedData; - private Map mpData; @SuppressWarnings("unchecked") ConfigSourceRuntimeImpl(BuilderImpl.ConfigContextImpl configContext, ConfigSource source) { @@ -182,7 +180,6 @@ public boolean isLazy() { return isLazy; } - @Override boolean changesSupported() { return changesSupported; } @@ -233,16 +230,11 @@ private synchronized void initialLoad() { this.initialData = loadedData; this.loadedData = new HashMap<>(); - mpData = new HashMap<>(); initialData.ifPresent(data -> { Map keyToNodeMap = ConfigHelper.createFullKeyToNodeMap(data); - keyToNodeMap.forEach((key, value) -> { - Optional directValue = value.value(); - directValue.ifPresent(stringValue -> mpData.put(key.toString(), stringValue)); - this.loadedData.put(key.toString(), value); - }); + keyToNodeMap.forEach((key, value) -> this.loadedData.put(key.toString(), value)); }); dataLoaded = true; @@ -254,61 +246,16 @@ public Optional node(String key) { return singleNodeFunction.apply(key); } - @Override - public org.eclipse.microprofile.config.spi.ConfigSource asMpSource() { - return this; - } @Override public String description() { return configSource.description(); } - /* - * MP Config related methods - */ - - @Override - public Map getProperties() { - if (isSystemProperties()) { - // this is a "hack" for MP TCK tests - // System properties act as a mutable source for the purpose of MicroProfile - Map result = new HashMap<>(); - Properties properties = System.getProperties(); - for (String key : properties.stringPropertyNames()) { - result.put(key, properties.getProperty(key)); - } - return result; - } - initialLoad(); - return new HashMap<>(mpData); - } - - @Override - public String getValue(String propertyName) { - initialLoad(); - return mpData.get(propertyName); - } - - @Override - public String getName() { - return configSource.description(); - } - /* Runtime impl base */ - @Override - boolean isSystemProperties() { - return configSource instanceof ConfigSources.SystemPropertiesConfigSource; - } - - @Override - boolean isEnvironmentVariables() { - return configSource instanceof ConfigSources.EnvironmentVariablesConfigSource; - } - private Function> objectNodeToSingleNode() { return key -> { if (null == loadedData) { @@ -340,10 +287,6 @@ private static void triggerChanges(BuilderImpl.ConfigContextImpl configContext, } - ConfigSource unwrap() { - return configSource; - } - private static final class PollingStrategyStarter implements Runnable { private final PollingStrategy pollingStrategy; private final PollingStrategyListener listener; diff --git a/config/config/src/main/java/io/helidon/config/ConfigSourcesRuntime.java b/config/config/src/main/java/io/helidon/config/ConfigSourcesRuntime.java index 103b5dc22f9..0c9959d60a9 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigSourcesRuntime.java +++ b/config/config/src/main/java/io/helidon/config/ConfigSourcesRuntime.java @@ -37,11 +37,11 @@ final class ConfigSourcesRuntime { private final List loadedData = new LinkedList<>(); - private List allSources; - private MergingStrategy mergingStrategy; - private Consumer> changeListener; + private final List allSources; + private final MergingStrategy mergingStrategy; + private volatile Consumer> changeListener; - ConfigSourcesRuntime(List allSources, + ConfigSourcesRuntime(List allSources, MergingStrategy mergingStrategy) { this.allSources = allSources; this.mergingStrategy = mergingStrategy; @@ -52,11 +52,7 @@ static ConfigSourcesRuntime empty() { return new ConfigSourcesRuntime(List.of(new ConfigSourceRuntimeImpl(null, ConfigSources.empty())), MergingStrategy.fallback()); } - - List allSources() { - return allSources; - } - + @Override public boolean equals(Object o) { if (this == o) { @@ -137,7 +133,7 @@ synchronized Optional latest() { synchronized Optional load() { - for (ConfigSourceRuntimeBase source : allSources) { + for (ConfigSourceRuntimeImpl source : allSources) { if (source.isLazy()) { loadedData.add(new RuntimeWithData(source, Optional.empty())); } else { @@ -197,10 +193,10 @@ private Stream streamKeys(ObjectNode objectNode) { } private static final class RuntimeWithData { - private final ConfigSourceRuntimeBase runtime; + private final ConfigSourceRuntimeImpl runtime; private Optional data; - private RuntimeWithData(ConfigSourceRuntimeBase runtime, Optional data) { + private RuntimeWithData(ConfigSourceRuntimeImpl runtime, Optional data) { this.runtime = runtime; this.data = data; } @@ -209,7 +205,7 @@ private void data(Optional data) { this.data = data; } - private ConfigSourceRuntimeBase runtime() { + private ConfigSourceRuntimeImpl runtime() { return runtime; } diff --git a/config/config/src/main/java/io/helidon/config/ConfigUtils.java b/config/config/src/main/java/io/helidon/config/ConfigUtils.java index a088b1129ab..2ffdcfd583f 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigUtils.java +++ b/config/config/src/main/java/io/helidon/config/ConfigUtils.java @@ -19,24 +19,14 @@ import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.charset.UnsupportedCharsetException; -import java.time.Duration; -import java.util.Comparator; -import java.util.Iterator; import java.util.Map; import java.util.Optional; import java.util.Properties; -import java.util.Spliterator; -import java.util.Spliterators; import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; import java.util.logging.Level; import java.util.logging.Logger; import java.util.stream.Collectors; -import java.util.stream.Stream; -import java.util.stream.StreamSupport; - -import javax.annotation.Priority; import io.helidon.config.spi.ConfigNode; @@ -51,68 +41,6 @@ private ConfigUtils() { throw new AssertionError("Instantiation not allowed."); } - /** - * Convert iterable items to an ordered serial stream. - * - * @param items items to be streamed. - * @param expected streamed item type. - * @return stream of items. - */ - static Stream asStream(Iterable items) { - return asStream(items.iterator()); - } - - /** - * Converts an iterator to a stream. - * - * @param type of the base items - * @param iterator iterator over the items - * @return stream of the items - */ - static Stream asStream(Iterator iterator) { - return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, Spliterator.ORDERED), false); - } - - /** - * Sorts items represented by an {@link Iterable} instance based on a {@code Priority} annotation attached to each - * item's Java type and return the sorted items as an ordered serial {@link Stream}. - *

- * Instances are sorted by {@code Priority.value()} attached directly to the instance of each item's class. - * If there is no {@code Priority} annotation attached to an item's class the {@code defaultPriority} value is used - * instead. Items with higher priority values have higher priority and take precedence (are returned sooner from - * the stream). - * - * @param items items to be ordered by priority and streamed. - * @param defaultPriority default priority to be used in case an item does not have a priority defined. - * @param item type. - * @return prioritized stream of items. - */ - static Stream asPrioritizedStream(Iterable items, int defaultPriority) { - return asStream(items).sorted(priorityComparator(defaultPriority)); - } - - /** - * Returns a comparator for two objects, the classes for which are - * optionally annotated with {@link Priority} and which applies a specified - * default priority if either or both classes lack the annotation. - * - * @param type of object being compared - * @param defaultPriority used if the classes for either or both objects - * lack the {@code Priority} annotation - * @return comparator - */ - static Comparator priorityComparator(int defaultPriority) { - return (service1, service2) -> { - int service1Priority = Optional.ofNullable(service1.getClass().getAnnotation(Priority.class)) - .map(Priority::value) - .orElse(defaultPriority); - int service2Priority = Optional.ofNullable(service2.getClass().getAnnotation(Priority.class)) - .map(Priority::value) - .orElse(defaultPriority); - return service2Priority - service1Priority; - }; - } - /** * Builds map into object node. *

@@ -187,55 +115,4 @@ static Charset getContentCharset(String contentEncoding) throws ConfigException throw new ConfigException("Unsupported response content-encoding '" + contentEncoding + "'.", ex); } } - - /** - * Allows to {@link #schedule()} execution of specified {@code command} using specified {@link ScheduledExecutorService}. - * Task is not executed immediately but scheduled with specified {@code delay}. - * It is possible to postpone an execution of the command by calling {@link #schedule()} again before the command is finished. - *

- * It can be used to implement Rx Debounce operator (http://reactivex.io/documentation/operators/debounce.html). - */ - static class ScheduledTask { - private final ScheduledExecutorService executorService; - private final Runnable command; - private final Duration delay; - private volatile ScheduledFuture scheduled; - private final Object lock = new Object(); - - /** - * Initialize task. - * - * @param executorService service to be used to schedule {@code command} execution on - * @param command the command to be executed on {@code executorService} - * @param delay the {@code command} is scheduled with specified delay - */ - ScheduledTask(ScheduledExecutorService executorService, Runnable command, Duration delay) { - this.executorService = executorService; - this.command = command; - this.delay = delay; - } - - /** - * Schedule execution of {@code command} on specified {@code executorService} with initial {@code delay}. - *

- * Scheduling can be repeated. Not finished task is canceled. - * - * @return whether a previously-scheduled action was canceled in scheduling this new new action - */ - public boolean schedule() { - boolean result = false; - synchronized (lock) { - if (scheduled != null) { - if (!scheduled.isCancelled() && !scheduled.isDone()) { - scheduled.cancel(false); - LOGGER.log(Level.FINER, String.format("Cancelling and rescheduling %s task.", command)); - result = true; - } - } - scheduled = executorService.schedule(command, delay.toMillis(), TimeUnit.MILLISECONDS); - } - return result; - } - } - } diff --git a/config/config/src/main/java/io/helidon/config/ConfigValue.java b/config/config/src/main/java/io/helidon/config/ConfigValue.java index b2a231025c2..d6bceaf9798 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigValue.java +++ b/config/config/src/main/java/io/helidon/config/ConfigValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -172,7 +172,7 @@ default Optional or(Supplier> supplier) { Objects.requireNonNull(supplier); Optional optional = asOptional(); - if (!optional.isPresent()) { + if (optional.isEmpty()) { Optional supplied = supplier.get(); Objects.requireNonNull(supplied); optional = supplied; @@ -348,6 +348,6 @@ default T orElseThrow(Supplier exceptionSuppl * @return the optional value as a {@code Stream} */ default Stream stream() { - return asOptional().map(Stream::of).orElseGet(Stream::empty); + return asOptional().stream(); } } diff --git a/config/config/src/main/java/io/helidon/config/ConfigValues.java b/config/config/src/main/java/io/helidon/config/ConfigValues.java index d89bf344015..3f83f72d06b 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigValues.java +++ b/config/config/src/main/java/io/helidon/config/ConfigValues.java @@ -39,7 +39,7 @@ private ConfigValues() { * @return a config value that is empty */ public static ConfigValue empty() { - return new ConfigValueBase(Config.Key.create("")) { + return new ConfigValueBase<>(Config.Key.create("")) { @Override public Optional asOptional() { return Optional.empty(); @@ -83,7 +83,7 @@ public String toString() { * @return a config value that uses the value provided */ public static ConfigValue simpleValue(T value) { - return new ConfigValueBase(Config.Key.create("")) { + return new ConfigValueBase<>(Config.Key.create("")) { @Override public Optional asOptional() { return Optional.ofNullable(value); diff --git a/config/config/src/main/java/io/helidon/config/ListNodeBuilderImpl.java b/config/config/src/main/java/io/helidon/config/ListNodeBuilderImpl.java index ee300645cc3..ad690ca0ff1 100644 --- a/config/config/src/main/java/io/helidon/config/ListNodeBuilderImpl.java +++ b/config/config/src/main/java/io/helidon/config/ListNodeBuilderImpl.java @@ -104,11 +104,6 @@ ListNodeBuilderImpl value(Optional value) { return this; } - @Override - protected String typeDescription() { - return "a LIST node"; - } - @Override protected Integer id(MergingKey key) { String name = key.first(); diff --git a/config/config/src/main/java/io/helidon/config/MpConfigBuilder.java b/config/config/src/main/java/io/helidon/config/MpConfigBuilder.java deleted file mode 100644 index e367a104814..00000000000 --- a/config/config/src/main/java/io/helidon/config/MpConfigBuilder.java +++ /dev/null @@ -1,422 +0,0 @@ -/* - * Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.helidon.config; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.ParameterizedType; -import java.lang.reflect.Type; -import java.net.URL; -import java.net.URLConnection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.ServiceLoader; -import java.util.Set; -import java.util.regex.Pattern; - -import io.helidon.common.serviceloader.Priorities; - -import org.eclipse.microprofile.config.Config; -import org.eclipse.microprofile.config.spi.ConfigBuilder; -import org.eclipse.microprofile.config.spi.ConfigSource; -import org.eclipse.microprofile.config.spi.ConfigSourceProvider; -import org.eclipse.microprofile.config.spi.Converter; - -/** - * Configuration builder. - */ -public class MpConfigBuilder implements ConfigBuilder { - private static final Pattern DISALLOWED_CHARS = Pattern.compile("[^a-zA-Z0-9_]"); - private static final String UNDERSCORE = "_"; - - private final BuilderImpl delegate = new BuilderImpl(); - - private boolean useDefaultSources = false; - private boolean useDiscoveredSources = false; - private boolean useDiscoveredConverters = false; - - private ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - private List sources = new LinkedList<>(); - private List converters = new LinkedList<>(); - - private boolean pureMp = true; - - MpConfigBuilder() { - delegate.disableSystemPropertiesSource(); - delegate.disableEnvironmentVariablesSource(); - delegate.disableSourceServices(); - delegate.disableMpMapperServices(); - } - - @Override - public ConfigBuilder addDefaultSources() { - delegate.mpAddDefaultSources(); - useDefaultSources = true; - return this; - } - - @Override - public ConfigBuilder addDiscoveredSources() { - delegate.mpAddDiscoveredSources(); - useDiscoveredSources = true; - return this; - } - - @Override - public ConfigBuilder addDiscoveredConverters() { - delegate.mpAddDiscoveredConverters(); - useDiscoveredConverters = true; - return this; - } - - @Override - public ConfigBuilder forClassLoader(ClassLoader loader) { - delegate.mpForClassLoader(loader); - this.classLoader = loader; - return this; - } - - @Override - public ConfigBuilder withSources(ConfigSource... sources) { - delegate.mpWithSources(sources); - for (ConfigSource source : sources) { - this.sources.add(new OrdinalSource(source)); - } - return this; - } - - @Override - public ConfigBuilder withConverter(Class aClass, int ordinal, Converter converter) { - delegate.mpWithConverter(aClass, ordinal, converter); - this.converters.add(new OrdinalConverter(converter, aClass, ordinal)); - return this; - } - - @Override - public ConfigBuilder withConverters(Converter... converters) { - delegate.mpWithConverters(converters); - for (Converter converter : converters) { - this.converters.add(new OrdinalConverter(converter)); - } - return this; - } - - @Override - public Config build() { - if (pureMp) { - if (useDefaultSources) { - sources.add(new OrdinalSource(new MpSystemPropertiesSource(), 400)); - sources.add(new OrdinalSource(new MpEnvironmentVariablesSource(), 300)); - // microprofile-config.properties - try { - classLoader.getResources("META-INF/microprofile-config.properties") - .asIterator() - .forEachRemaining(it -> { - sources.add(new OrdinalSource(new MpPropertiesSource(it))); - }); - } catch (IOException e) { - throw new IllegalStateException("Failed to read microprofile-config.properties from classpath"); - } - } - - // built-in converters - converters.add(new OrdinalConverter(MpConfigBuilder::toBoolean, Boolean.class, 1)); - converters.add(new OrdinalConverter(MpConfigBuilder::toBoolean, Boolean.TYPE, 1)); - converters.add(new OrdinalConverter(Byte::parseByte, Byte.class, 1)); - converters.add(new OrdinalConverter(Byte::parseByte, Byte.TYPE, 1)); - converters.add(new OrdinalConverter(Short::parseShort, Short.class, 1)); - converters.add(new OrdinalConverter(Short::parseShort, Short.TYPE, 1)); - converters.add(new OrdinalConverter(Integer::parseInt, Integer.class, 1)); - converters.add(new OrdinalConverter(Integer::parseInt, Integer.TYPE, 1)); - converters.add(new OrdinalConverter(Long::parseLong, Long.class, 1)); - converters.add(new OrdinalConverter(Long::parseLong, Long.TYPE, 1)); - converters.add(new OrdinalConverter(Float::parseFloat, Float.class, 1)); - converters.add(new OrdinalConverter(Float::parseFloat, Float.TYPE, 1)); - converters.add(new OrdinalConverter(Double::parseDouble, Double.class, 1)); - converters.add(new OrdinalConverter(Double::parseDouble, Double.TYPE, 1)); - converters.add(new OrdinalConverter(MpConfigBuilder::toChar, Character.class, 1)); - converters.add(new OrdinalConverter(MpConfigBuilder::toChar, Character.TYPE, 1)); - converters.add(new OrdinalConverter(MpConfigBuilder::toClass, Class.class, 1)); - - if (useDiscoveredConverters) { - ServiceLoader.load(Converter.class) - .forEach(it -> converters.add(new OrdinalConverter(it))); - } - - if (useDiscoveredSources) { - ServiceLoader.load(ConfigSource.class) - .forEach(it -> sources.add(new OrdinalSource(it))); - - ServiceLoader.load(ConfigSourceProvider.class) - .forEach(it -> { - it.getConfigSources(classLoader) - .forEach(source -> sources.add(new OrdinalSource(source))); - }); - } - - // now it is from lowest to highest - sources.sort(Comparator.comparingInt(o -> o.ordinal)); - converters.sort(Comparator.comparingInt(o -> o.ordinal)); - - // revert to have the first one the most significant - Collections.reverse(sources); - Collections.reverse(converters); - - List sources = new LinkedList<>(); - HashMap, Converter> converters = new HashMap<>(); - - this.sources.forEach(ordinal -> sources.add(ordinal.source)); - this.converters.forEach(ordinal -> converters.putIfAbsent(ordinal.type, ordinal.converter)); - - return new MpConfig(sources, converters); - } else { - return delegate.build(); - } - } - - ConfigBuilder metaConfig(io.helidon.config.Config metaConfig) { - pureMp = false; - delegate.config(metaConfig); - return this; - } - - private static Class toClass(String stringValue) { - try { - return Class.forName(stringValue); - } catch (ClassNotFoundException e) { - throw new IllegalArgumentException("Failed to convert property " + stringValue + " to class", e); - } - } - - private static char toChar(String stringValue) { - if (stringValue.length() != 1) { - throw new IllegalArgumentException("The string to map must be a single character, but is: " + stringValue); - } - return stringValue.charAt(0); - } - - private static Boolean toBoolean(String stringValue) { - final String lower = stringValue.toLowerCase(); - // according to microprofile config specification (section Built-in Converters) - switch (lower) { - case "true": - case "1": - case "yes": - case "y": - case "on": - return true; - default: - return false; - } - } - - private static class OrdinalSource { - private final int ordinal; - private final ConfigSource source; - - - private OrdinalSource(ConfigSource source) { - this.source = source; - this.ordinal = findOrdinal(source); - } - - private OrdinalSource(ConfigSource source, int ordinal) { - this.ordinal = ordinal; - this.source = source; - } - - private static int findOrdinal(ConfigSource source) { - int ordinal = source.getOrdinal(); - if (ordinal == ConfigSource.DEFAULT_ORDINAL) { - return Priorities.find(source, ConfigSource.DEFAULT_ORDINAL); - } - return ordinal; - } - } - - private static class OrdinalConverter { - private final int ordinal; - private final Class type; - private final Converter converter; - - private OrdinalConverter(Converter converter, Class aClass, int ordinal) { - this.ordinal = ordinal; - this.type = aClass; - this.converter = converter; - } - - private OrdinalConverter(Converter converter) { - this(converter, getConverterType(converter.getClass()), Priorities.find(converter, 100)); - } - } - - private static Class getConverterType(Class converterClass) { - Class type = doGetType(converterClass); - if (null == type) { - throw new IllegalArgumentException("Converter " + converterClass + " must be a ParameterizedType."); - } - return type; - } - - private static Class doGetType(Class clazz) { - if (clazz.equals(Object.class)) { - return null; - } - - Type[] genericInterfaces = clazz.getGenericInterfaces(); - for (Type genericInterface : genericInterfaces) { - if (genericInterface instanceof ParameterizedType) { - ParameterizedType pt = (ParameterizedType) genericInterface; - if (pt.getRawType().equals(Converter.class)) { - Type[] typeArguments = pt.getActualTypeArguments(); - if (typeArguments.length != 1) { - throw new IllegalStateException("Converter " + clazz + " must be a ParameterizedType."); - } - Type typeArgument = typeArguments[0]; - if (typeArgument instanceof Class) { - return (Class) typeArgument; - } - throw new IllegalStateException("Converter " + clazz + " must convert to a class, not " + typeArgument); - } - } - } - - return doGetType(clazz.getSuperclass()); - } - - private static class MpSystemPropertiesSource implements ConfigSource { - private final Properties props; - - private MpSystemPropertiesSource() { - this.props = System.getProperties(); - } - - @Override - public Map getProperties() { - Set strings = props.stringPropertyNames(); - - Map result = new HashMap<>(); - strings.forEach(it -> result.put(it, props.getProperty(it))); - return result; - } - - @Override - public String getValue(String propertyName) { - return props.getProperty(propertyName); - } - - @Override - public String getName() { - return "System Properties"; - } - } - - private static class MpEnvironmentVariablesSource implements ConfigSource { - private final Map env; - - private MpEnvironmentVariablesSource() { - this.env = System.getenv(); - System.out.println("Setting up evn with: " + env); - } - - @Override - public Map getProperties() { - return env; - } - - @Override - public String getValue(String propertyName) { - // According to the spec, we have three ways of looking for a property - // 1. Exact match - String result = env.get(propertyName); - if (null != result) { - System.out.println("Returning " + result + " for " + propertyName); - return result; - } - // 2. replace non alphanumeric characters with _ - String rule2 = rule2(propertyName); - result = env.get(rule2); - if (null != result) { - System.out.println("Returning " + result + " for " + rule2); - return result; - } - // 3. replace same as above, but uppercase - String rule3 = rule2.toUpperCase(); - result = env.get(rule3); - System.out.println("Returning " + result + " for " + rule3); - return result; - } - - @Override - public String getName() { - return "Environment Variables"; - } - - /** - * Rule #2 states: Replace each character that is neither alphanumeric nor _ with _ (i.e. com_ACME_size). - * - * @param propertyName name of property as requested by user - * @return name of environment variable we look for - */ - private static String rule2(String propertyName) { - return DISALLOWED_CHARS.matcher(propertyName).replaceAll(UNDERSCORE); - } - } - - private class MpPropertiesSource implements ConfigSource { - private final Map props = new HashMap<>(); - private final String name; - - private MpPropertiesSource(URL it) { - this.name = it.toString(); - - try { - URLConnection urlConnection = it.openConnection(); - try (InputStream inputStream = urlConnection.getInputStream()) { - Properties properties = new Properties(); - properties.load(inputStream); - - properties.stringPropertyNames() - .forEach(prop -> props.put(prop, properties.getProperty(prop))); - } - } catch (Exception e) { - throw new ConfigException("Failed to load ", e); - } - - } - - @Override - public Map getProperties() { - return Collections.unmodifiableMap(props); - } - - @Override - public String getValue(String propertyName) { - return props.get(propertyName); - } - - @Override - public String getName() { - return "Properties: " + name; - } - } -} diff --git a/config/config/src/main/java/io/helidon/config/ObjectNodeBuilderImpl.java b/config/config/src/main/java/io/helidon/config/ObjectNodeBuilderImpl.java index 11724e7da68..136b894f3d3 100644 --- a/config/config/src/main/java/io/helidon/config/ObjectNodeBuilderImpl.java +++ b/config/config/src/main/java/io/helidon/config/ObjectNodeBuilderImpl.java @@ -106,11 +106,6 @@ public ObjectNodeBuilderImpl addNode(String name, ConfigNode node) { return this; } - @Override - protected String typeDescription() { - return "an OBJECT node"; - } - @Override protected String id(MergingKey key) { return key.first(); diff --git a/config/config/src/main/java/io/helidon/config/ProviderImpl.java b/config/config/src/main/java/io/helidon/config/ProviderImpl.java index a26b90f06df..404134193b6 100644 --- a/config/config/src/main/java/io/helidon/config/ProviderImpl.java +++ b/config/config/src/main/java/io/helidon/config/ProviderImpl.java @@ -35,7 +35,6 @@ import java.util.stream.Stream; import io.helidon.config.spi.ConfigFilter; -import io.helidon.config.spi.ConfigNode; import io.helidon.config.spi.ConfigNode.ObjectNode; /** @@ -133,8 +132,7 @@ private synchronized AbstractConfigImpl build(Optional rootNode) { rootNode.orElseGet(ObjectNode::empty), targetFilter, this, - aliasGenerator, - configSource.allSources()); + aliasGenerator); AbstractConfigImpl config = factory.config(); // initialize filters initializeFilters(config, targetFilter); @@ -148,7 +146,7 @@ private synchronized AbstractConfigImpl build(Optional rootNode) { private ObjectNode resolveKeys(ObjectNode rootNode) { Function resolveTokenFunction = Function.identity(); if (keyResolving) { - Map flattenValueNodes = flattenNodes(rootNode); + Map flattenValueNodes = ConfigHelper.flattenNodes(rootNode); if (flattenValueNodes.isEmpty()) { return rootNode; @@ -166,15 +164,6 @@ private ObjectNode resolveKeys(ObjectNode rootNode) { return ObjectNodeBuilderImpl.create(rootNode, resolveTokenFunction).build(); } - private Map flattenNodes(ConfigNode node) { - return ConfigHelper.flattenNodes(ConfigKeyImpl.of(), node) - .filter(e -> e.getValue() instanceof ValueNodeImpl) - .collect(Collectors.toMap( - e -> e.getKey().toString(), - e -> Config.Key.escapeName(((ValueNodeImpl) e.getValue()).get()) - )); - } - private Map tokenToValueMap(Map flattenValueNodes) { return flattenValueNodes.keySet() .stream() @@ -253,7 +242,6 @@ private void initializeFilters(Config config, ChainConfigFilter chain) { filterProviders.stream() .map(providerFunction -> providerFunction.apply(config)) - .sorted(ConfigUtils.priorityComparator(ConfigFilter.PRIORITY)) .forEachOrdered(chain::addFilter); chain.filterProviders.stream() diff --git a/config/config/src/main/java/io/helidon/config/UrlOverrideSource.java b/config/config/src/main/java/io/helidon/config/UrlOverrideSource.java index 4a6232f1c23..65c1be68a12 100644 --- a/config/config/src/main/java/io/helidon/config/UrlOverrideSource.java +++ b/config/config/src/main/java/io/helidon/config/UrlOverrideSource.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2017, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/config/config/src/main/java/io/helidon/config/ValueResolvingFilter.java b/config/config/src/main/java/io/helidon/config/ValueResolvingFilter.java index 2602076f019..57ba026484f 100644 --- a/config/config/src/main/java/io/helidon/config/ValueResolvingFilter.java +++ b/config/config/src/main/java/io/helidon/config/ValueResolvingFilter.java @@ -141,7 +141,7 @@ public void init(Config config) { * either case save the result in a simple boolean for efficiency in * #apply. */ - if (!failOnMissingReferenceSetting.isPresent()) { + if (failOnMissingReferenceSetting.isEmpty()) { failOnMissingReferenceSetting = Optional.of( config .get(ConfigFilters.ValueResolvingBuilder.FAIL_ON_MISSING_REFERENCE_KEY_NAME) diff --git a/config/config/src/main/java/io/helidon/config/spi/ChangeWatcherProvider.java b/config/config/src/main/java/io/helidon/config/spi/ChangeWatcherProvider.java index 9251a9731a7..2a0f5bc292c 100644 --- a/config/config/src/main/java/io/helidon/config/spi/ChangeWatcherProvider.java +++ b/config/config/src/main/java/io/helidon/config/spi/ChangeWatcherProvider.java @@ -18,5 +18,5 @@ /** * Java service loader service to create a polling strategy factory based on meta configuration. */ -public interface ChangeWatcherProvider extends MetaConfigurableProvider { +public interface ChangeWatcherProvider extends MetaConfigurableProvider> { } diff --git a/config/config/src/main/java/io/helidon/config/spi/FallbackMergingStrategy.java b/config/config/src/main/java/io/helidon/config/spi/FallbackMergingStrategy.java index 9f6c7d9b0bf..48494a34126 100644 --- a/config/config/src/main/java/io/helidon/config/spi/FallbackMergingStrategy.java +++ b/config/config/src/main/java/io/helidon/config/spi/FallbackMergingStrategy.java @@ -50,14 +50,17 @@ public ObjectNode merge(List rootNodesParam) { return builder.build(); } - private static ObjectNode.Builder addNode(ObjectNode.Builder builder, String key, ConfigNode node) { + private static void addNode(ObjectNode.Builder builder, String key, ConfigNode node) { switch (node.nodeType()) { case OBJECT: - return builder.addObject(key, (ObjectNode) node); + builder.addObject(key, (ObjectNode) node); + return; case LIST: - return builder.addList(key, (ListNode) node); + builder.addList(key, (ListNode) node); + return; case VALUE: - return builder.addValue(key, (ValueNode) node); + builder.addValue(key, (ValueNode) node); + return; default: throw new IllegalArgumentException("Unsupported node type: " + node.getClass().getName()); } diff --git a/config/config/src/main/java/io/helidon/config/spi/OrderedProperties.java b/config/config/src/main/java/io/helidon/config/spi/OrderedProperties.java index 705c470dc64..ccda50b9f12 100644 --- a/config/config/src/main/java/io/helidon/config/spi/OrderedProperties.java +++ b/config/config/src/main/java/io/helidon/config/spi/OrderedProperties.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2018 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,9 +26,9 @@ */ final class OrderedProperties { - private LinkedHashMap map = new LinkedHashMap<>(); + private final LinkedHashMap map = new LinkedHashMap<>(); - private Properties properties = new Properties() { + private final Properties properties = new Properties() { @Override public synchronized Object put(Object key, Object value) { return map.put(key.toString(), value.toString()); diff --git a/config/config/src/main/java/io/helidon/config/spi/SpiHelper.java b/config/config/src/main/java/io/helidon/config/spi/SpiHelper.java index c2b73f79e85..43e783f66a4 100644 --- a/config/config/src/main/java/io/helidon/config/spi/SpiHelper.java +++ b/config/config/src/main/java/io/helidon/config/spi/SpiHelper.java @@ -25,7 +25,7 @@ private SpiHelper() { * * @see io.helidon.config.spi.ConfigNode.ObjectNode#empty() */ - public static final class EmptyObjectNodeHolder { + static final class EmptyObjectNodeHolder { private EmptyObjectNodeHolder() { throw new AssertionError("Instantiation not allowed."); diff --git a/config/config/src/main/java/module-info.java b/config/config/src/main/java/module-info.java index 3f385a4e806..c80d301ca72 100644 --- a/config/config/src/main/java/module-info.java +++ b/config/config/src/main/java/module-info.java @@ -17,7 +17,7 @@ import io.helidon.config.PropertiesConfigParser; /** - * config module. + * Helidon SE Config module. */ module io.helidon.config { @@ -27,9 +27,9 @@ requires transitive io.helidon.common; requires transitive io.helidon.common.reactive; - requires io.helidon.common.serviceloader; requires transitive io.helidon.common.media.type; - requires transitive microprofile.config.api; + + requires io.helidon.common.serviceloader; exports io.helidon.config; exports io.helidon.config.spi; @@ -41,13 +41,8 @@ uses io.helidon.config.spi.OverrideSourceProvider; uses io.helidon.config.spi.RetryPolicyProvider; uses io.helidon.config.spi.PollingStrategyProvider; - - uses org.eclipse.microprofile.config.spi.ConfigSource; - uses org.eclipse.microprofile.config.spi.ConfigSourceProvider; - uses org.eclipse.microprofile.config.spi.Converter; uses io.helidon.config.spi.ChangeWatcherProvider; provides io.helidon.config.spi.ConfigParser with PropertiesConfigParser; - provides org.eclipse.microprofile.config.spi.ConfigProviderResolver with io.helidon.config.MpConfigProviderResolver; } diff --git a/config/config/src/test/java/io/helidon/config/AutoLoadedConfigPriority.java b/config/config/src/test/java/io/helidon/config/AutoLoadedConfigPriority.java index a3eff0eb4d3..833bfcabba9 100644 --- a/config/config/src/test/java/io/helidon/config/AutoLoadedConfigPriority.java +++ b/config/config/src/test/java/io/helidon/config/AutoLoadedConfigPriority.java @@ -18,6 +18,8 @@ import io.helidon.config.spi.ConfigFilter; +import static io.helidon.config.FilterLoadingTest.ORIGINAL_VALUE_SUBJECT_TO_AUTO_FILTERING; + /** * Abstract superclass for making sure simple priority works. *

@@ -34,7 +36,11 @@ public abstract class AutoLoadedConfigPriority implements ConfigFilter { @Override public String apply(Config.Key key, String stringValue) { - if (key.toString().equals(KEY_SUBJECT_TO_AUTO_FILTERING)) { + // the original implementation was wrong (priorities were inversed and this test was wrong) + // the new approach makes sure the filter with higher priority modifies the value, and + // any filter down the filter chain sees the modified value, and ignores it + if (key.toString().equals(KEY_SUBJECT_TO_AUTO_FILTERING) + && stringValue.equals(ORIGINAL_VALUE_SUBJECT_TO_AUTO_FILTERING)) { return getExpectedValue(); } return stringValue; diff --git a/config/config/src/test/java/io/helidon/config/ConfigHelperTest.java b/config/config/src/test/java/io/helidon/config/ConfigHelperTest.java index 9de4ed4b182..e2d4e4d0a3b 100644 --- a/config/config/src/test/java/io/helidon/config/ConfigHelperTest.java +++ b/config/config/src/test/java/io/helidon/config/ConfigHelperTest.java @@ -16,51 +16,36 @@ package io.helidon.config; -import java.util.concurrent.Flow; -import java.util.function.Function; +import java.util.Map; + +import io.helidon.config.spi.ConfigNode; import org.junit.jupiter.api.Test; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; -/** - * Tests {@link ConfigHelper}. - */ -public class ConfigHelperTest { +class ConfigHelperTest { @Test - public void testSubscriber() { - //mocks - Function onNextFunction = mock(Function.class); - Flow.Subscription subscription = mock(Flow.Subscription.class); - - //create Subscriber - Flow.Subscriber subscriber = ConfigHelper.subscriber(onNextFunction); - - //onSubscribe - subscriber.onSubscribe(subscription); - // request(Long.MAX_VALUE) has been invoked - verify(subscription).request(Long.MAX_VALUE); - - //MOCK onNext - when(onNextFunction.apply(1L)).thenReturn(true); - when(onNextFunction.apply(2L)).thenReturn(true); - when(onNextFunction.apply(3L)).thenReturn(false); - // 2x onNext -> true - subscriber.onNext(1L); - subscriber.onNext(2L); - // function invoked 2x, cancel never - verify(onNextFunction, times(2)).apply(any()); - verify(subscription, never()).cancel(); - // 1x onNext -> false - subscriber.onNext(3L); - // function invoked 2+1x, cancel 1x - verify(onNextFunction, times(2 + 1)).apply(any()); - verify(subscription, times(1)).cancel(); + void testFlattenNodes() { + ConfigNode.ObjectNode node = ConfigNode.ObjectNode.builder() + .addValue("simple", "value") + .addList("list", ConfigNode.ListNode.builder() + .addValue("first") + .addValue("second") + .build()) + .addObject("object", ConfigNode.ObjectNode.builder() + .addValue("value", "value2") + .build()) + .build(); + + Map map = ConfigHelper.flattenNodes(node); + Map expected = Map.of( + "simple", "value", + "list.0", "first", + "list.1", "second", + "object.value", "value2" + ); + assertThat(map, is(expected)); } - -} +} \ No newline at end of file diff --git a/config/config/src/test/java/io/helidon/config/ConfigUtilsTest.java b/config/config/src/test/java/io/helidon/config/ConfigUtilsTest.java deleted file mode 100644 index db51e1aae2a..00000000000 --- a/config/config/src/test/java/io/helidon/config/ConfigUtilsTest.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright (c) 2020 Oracle and/or its affiliates. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.helidon.config; - -import java.time.Duration; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.stream.Collectors; - -import javax.annotation.Priority; - -import io.helidon.config.ConfigUtils.ScheduledTask; - -import org.hamcrest.Matchers; -import org.hamcrest.core.IsInstanceOf; -import org.junit.jupiter.api.Test; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.is; - -/** - * Tests {@link io.helidon.config.ConfigUtils}. - */ -public class ConfigUtilsTest { - - private void testAsStream(Iterable integers) { - List list = ConfigUtils.asStream(integers).sorted(Integer::compare).collect(Collectors.toList()); - assertThat(list, Matchers.hasSize(4)); - assertThat(list.get(0), equalTo(0)); - assertThat(list.get(1), equalTo(10)); - assertThat(list.get(2), equalTo(20)); - assertThat(list.get(3), equalTo(30)); - } - - @Test - public void testAsStream() { - testAsStream(Arrays.asList(20, 0, 30, 10)); - testAsStream(Arrays.asList(10, 30, 0, 20)); - testAsStream(Arrays.asList(0, 10, 20, 30)); - } - - private void testAsPrioritizedStream(Iterable providers) { - List list = ConfigUtils.asPrioritizedStream(providers, 0).collect(Collectors.toList()); - assertThat(list, Matchers.hasSize(4)); - assertThat(list.get(0), IsInstanceOf.instanceOf(Provider3.class)); - assertThat(list.get(1), IsInstanceOf.instanceOf(Provider1.class)); - assertThat(list.get(2), IsInstanceOf.instanceOf(Provider4.class)); - assertThat(list.get(3), IsInstanceOf.instanceOf(Provider2.class)); - } - - @Test - public void testAsPrioritizedStream() { - testAsPrioritizedStream(Arrays.asList(new Provider1(), new Provider2(), new Provider3(), new Provider4())); - testAsPrioritizedStream(Arrays.asList(new Provider4(), new Provider3(), new Provider2(), new Provider1())); - testAsPrioritizedStream(Arrays.asList(new Provider2(), new Provider4(), new Provider1(), new Provider3())); - } - - @Test - public void testScheduledTaskInterruptedRepeatedly() throws InterruptedException { - AtomicInteger counter = new AtomicInteger(); - ScheduledTask task = new ScheduledTask(Executors.newSingleThreadScheduledExecutor(), - counter::incrementAndGet, - Duration.ofMillis(80)); - task.schedule(); - task.schedule(); - task.schedule(); - task.schedule(); - task.schedule(); - - //not yet finished - assertThat(counter.get(), is(0)); - - TimeUnit.MILLISECONDS.sleep(120); - assertThat(counter.get(), is(1)); - } - - @Test - public void testScheduledTaskExecutedRepeatedly() throws InterruptedException { - CountDownLatch execLatch = new CountDownLatch(5); - ScheduledTask task = new ScheduledTask(Executors.newSingleThreadScheduledExecutor(), - execLatch::countDown, - Duration.ZERO); - /* - Because invoking 'schedule' can cancel an existing action, keep track - of cancelations in case the latch expires without reaching 0. - */ - final long RESCHEDULE_DELAY_MS = 5; - final int ACTIONS_TO_SCHEDULE = 5; - int cancelations = 0; - - for (int i = 0; i < ACTIONS_TO_SCHEDULE; i++ ) { - if (task.schedule()) { - cancelations++; - } - TimeUnit.MILLISECONDS.sleep(RESCHEDULE_DELAY_MS); - } - /* - The latch can either complete -- because all the scheduled actions finished -- - or it can expire at the timeout because at least one action did not finish, in - which case the remaining latch value should not exceed the number of actions - canceled. (Do not check for exact equality; some attempts to cancel - an action might occur after the action was deemed to be not-yet-run or in-progress - but actually runs to completion before the cancel is actually invoked. - */ - assertThat( - "Current execLatch count: " + execLatch.getCount() + ", cancelations: " - + "" + cancelations, - execLatch.await(3000, TimeUnit.MILLISECONDS) || execLatch.getCount() <= cancelations, - is(true)); - } - - // - // providers ... - // - - interface Provider { - } - - @Priority(20) - static class Provider1 implements Provider { - } - - static class Provider2 implements Provider { - } - - @Priority(30) - static class Provider3 implements Provider { - } - - @Priority(10) - static class Provider4 implements Provider { - } - -} diff --git a/config/config/src/test/java/io/helidon/config/FilterLoadingTest.java b/config/config/src/test/java/io/helidon/config/FilterLoadingTest.java index 8040c822823..d337a89a646 100644 --- a/config/config/src/test/java/io/helidon/config/FilterLoadingTest.java +++ b/config/config/src/test/java/io/helidon/config/FilterLoadingTest.java @@ -28,7 +28,7 @@ */ public class FilterLoadingTest { - private static final String ORIGINAL_VALUE_SUBJECT_TO_AUTO_FILTERING = "originalValue"; + static final String ORIGINAL_VALUE_SUBJECT_TO_AUTO_FILTERING = "originalValue"; private static final String ORIGINAL_VALUE_SUBJECT_TO_AUTO_FILTERING_VIA_PROVIDER = "originalValueForProviderTest"; private static final String UNAFFECTED_KEY = "key1"; diff --git a/config/encryption/pom.xml b/config/encryption/pom.xml index e3c2046e28a..d4bbd7a40c4 100644 --- a/config/encryption/pom.xml +++ b/config/encryption/pom.xml @@ -43,6 +43,15 @@ io.helidon.common helidon-common-key-util + + + io.helidon.config + helidon-config-mp + provided + true + io.helidon.config helidon-config-yaml diff --git a/config/encryption/src/main/java/io/helidon/config/encryption/EncryptionUtil.java b/config/encryption/src/main/java/io/helidon/config/encryption/EncryptionUtil.java index 20be8b44e4a..7ac4fa9a3bc 100644 --- a/config/encryption/src/main/java/io/helidon/config/encryption/EncryptionUtil.java +++ b/config/encryption/src/main/java/io/helidon/config/encryption/EncryptionUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -39,6 +39,7 @@ import io.helidon.common.pki.KeyConfig; import io.helidon.config.Config; import io.helidon.config.ConfigValue; +import io.helidon.config.mp.MpConfig; /** * Encryption utilities for secrets protection. @@ -280,6 +281,29 @@ static String decryptAes(char[] masterPassword, String encryptedBase64) throws C } } + static Optional resolveMasterPassword(boolean requireEncryption, org.eclipse.microprofile.config.Config config) { + Optional result = getEnv(ConfigProperties.MASTER_PASSWORD_ENV_VARIABLE) + .or(() -> { + Optional value = config.getOptionalValue(ConfigProperties.MASTER_PASSWORD_CONFIG_KEY, String.class); + if (value.isPresent()) { + if (requireEncryption) { + LOGGER.warning( + "Master password is configured as clear text in configuration when encryption is required. " + + "This value will be ignored. System property or environment variable expected!!!"); + return Optional.empty(); + } + } + return value; + }) + .map(String::toCharArray); + + if (result.isEmpty()) { + LOGGER.fine("Securing properties using master password is not available, as master password is not configured"); + } + + return result; + } + static Optional resolveMasterPassword(boolean requireEncryption, Config config) { Optional result = getEnv(ConfigProperties.MASTER_PASSWORD_ENV_VARIABLE) .or(() -> { @@ -303,6 +327,10 @@ static Optional resolveMasterPassword(boolean requireEncryption, Config return result; } + static Optional resolvePrivateKey(org.eclipse.microprofile.config.Config config){ + return resolvePrivateKey(MpConfig.toHelidonConfig(config).get("security.config.rsa")); + } + static Optional resolvePrivateKey(Config config) { // load configuration values KeyConfig.PemBuilder pemBuilder = KeyConfig.pemBuilder().config(config); diff --git a/config/encryption/src/main/java/io/helidon/config/encryption/MpEncryptionFilter.java b/config/encryption/src/main/java/io/helidon/config/encryption/MpEncryptionFilter.java new file mode 100644 index 00000000000..fb3089401a3 --- /dev/null +++ b/config/encryption/src/main/java/io/helidon/config/encryption/MpEncryptionFilter.java @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.encryption; + +import java.security.PrivateKey; +import java.security.interfaces.RSAPrivateKey; +import java.util.HashSet; +import java.util.NoSuchElementException; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +import io.helidon.common.HelidonFeatures; +import io.helidon.config.mp.spi.MpConfigFilter; + +import org.eclipse.microprofile.config.Config; + +/** + * Provides possibility to decrypt passwords from configuration sources. + * Configuration can be used to enforce encryption (e.g. we will fail on clear-text value). + *

+ * Password in properties must be stored as follows: + *

    + *
  • ${AES=base64} - encrypted password using a master password (must be provided to Prime through configuration, system + * property or environment variable)
  • + *
  • ${RSA=base64} - encrypted password using a public key (private key must be available to Prime instance, + * its location must be provided to prime through configuration, system property or environment variable)
  • + *
  • ${ALIAS=alias_name} - reference to another property, that is encrypted
  • + *
  • ${CLEAR=text} - clear-text password. Intentionally denoting this value as a protectable one, so we can enforce encryption + * (e.g. in prod)
  • + *
+ * Example: + *
+ * google_client_secret=${AES=mYRkg+4Q4hua1kvpCCI2hg==}
+ * service_password=${RSA=mYRkg+4Q4hua1kvpCCI2hg==}
+ * another_password=${ALIAS=service_password}
+ * cleartext_password=${CLEAR=known_password}
+ * 
+ * + * @see ConfigProperties#PRIVATE_KEYSTORE_PATH_ENV_VARIABLE + * @see ConfigProperties#MASTER_PASSWORD_ENV_VARIABLE + * @see ConfigProperties#MASTER_PASSWORD_CONFIG_KEY + * @see ConfigProperties#REQUIRE_ENCRYPTION_ENV_VARIABLE + */ +public final class MpEncryptionFilter implements MpConfigFilter { + private static final String PREFIX_LEGACY_AES = "${AES="; + private static final String PREFIX_LEGACY_RSA = "${RSA="; + static final String PREFIX_GCM = "${GCM="; + static final String PREFIX_RSA = "${RSA-P="; + private static final Logger LOGGER = Logger.getLogger(MpEncryptionFilter.class.getName()); + private static final String PREFIX_ALIAS = "${ALIAS="; + private static final String PREFIX_CLEAR = "${CLEAR="; + + static { + HelidonFeatures.register("Config", "Encryption"); + } + + private PrivateKey privateKey; + private char[] masterPassword; + + private boolean requireEncryption; + + private MpConfigFilter clearFilter; + private MpConfigFilter rsaFilter; + private MpConfigFilter aesFilter; + private MpConfigFilter aliasFilter; + + /** + * This constructor is only for use by {@link io.helidon.config.mp.spi.MpConfigFilter} service loader. + */ + @Deprecated + public MpEncryptionFilter() { + } + + @Override + public void init(org.eclipse.microprofile.config.Config config) { + this.requireEncryption = EncryptionUtil.getEnv(ConfigProperties.REQUIRE_ENCRYPTION_ENV_VARIABLE) + .map(Boolean::parseBoolean) + .or(() -> config.getOptionalValue(ConfigProperties.REQUIRE_ENCRYPTION_CONFIG_KEY, Boolean.class)) + .orElse(true); + + this.masterPassword = EncryptionUtil.resolveMasterPassword(requireEncryption, config) + .orElse(null); + this.privateKey = EncryptionUtil.resolvePrivateKey(config) + .orElse(null); + + if (null != privateKey && !(privateKey instanceof RSAPrivateKey)) { + throw new ConfigEncryptionException("Private key must be an RSA private key, but is: " + + privateKey.getClass().getName()); + } + + MpConfigFilter noOp = (key, stringValue) -> stringValue; + + aesFilter = (null == masterPassword ? noOp : (key, stringValue) -> decryptAes(masterPassword, stringValue)); + rsaFilter = (null == privateKey ? noOp : (key, stringValue) -> decryptRsa(privateKey, stringValue)); + clearFilter = this::clearText; + aliasFilter = (key, stringValue) -> aliased(stringValue, config); + + } + + @Override + public String apply(String propertyName, String value) { + return maybeDecode(propertyName, value); + } + + private static String removePlaceholder(String prefix, String value) { + return value.substring(prefix.length(), value.length() - 1); + } + + private String maybeDecode(String propertyName, String value) { + Set processedValues = new HashSet<>(); + + do { + processedValues.add(value); + if (!value.startsWith("${") && !value.endsWith("}")) { + //this is not encoded, safely return + return value; + } + value = aliasFilter.apply(propertyName, value); + value = clearFilter.apply(propertyName, value); + value = rsaFilter.apply(propertyName, value); + value = aesFilter.apply(propertyName, value); + } while (!processedValues.contains(value)); + + return value; + } + + private String clearText(String propertyName, String value) { + // cleartext_password=${CLEAR=known_password} + if (value.startsWith(PREFIX_CLEAR)) { + if (requireEncryption) { + throw new ConfigEncryptionException("Key \"" + propertyName + "\" is a clear text password, yet encryption is " + + "required"); + } + return removePlaceholder(PREFIX_CLEAR, value); + } + + return value; + } + + private String aliased(String value, Config config) { + + if (value.startsWith(PREFIX_ALIAS)) { + // another_password=${ALIAS=service_password} + String alias = removePlaceholder(PREFIX_ALIAS, value); + + return config.getOptionalValue(alias, String.class) + .orElseThrow(() -> new NoSuchElementException("Aliased key not found. Value: " + value)); + } + + return value; + } + + private String decryptRsa(PrivateKey privateKey, String value) { + // service_password=${RSA=mYRkg+4Q4hua1kvpCCI2hg==} + if (value.startsWith(PREFIX_LEGACY_RSA)) { + LOGGER.log(Level.WARNING, () -> "You are using legacy RSA encryption. Please re-encrypt the value with RSA-P."); + String b64Value = removePlaceholder(PREFIX_LEGACY_RSA, value); + try { + return EncryptionUtil.decryptRsaLegacy(privateKey, b64Value); + } catch (ConfigEncryptionException e) { + LOGGER.log(Level.FINEST, e, () -> "Failed to decrypt " + value); + return value; + } + } else if (value.startsWith(PREFIX_RSA)) { + String b64Value = removePlaceholder(PREFIX_RSA, value); + try { + return EncryptionUtil.decryptRsa(privateKey, b64Value); + } catch (ConfigEncryptionException e) { + LOGGER.log(Level.FINEST, e, () -> "Failed to decrypt " + value); + return value; + } + } + + return value; + } + + private String decryptAes(char[] masterPassword, String value) { + // google_client_secret=${AES=mYRkg+4Q4hua1kvpCCI2hg==} + + if (value.startsWith(PREFIX_LEGACY_AES)) { + LOGGER.log(Level.WARNING, () -> "You are using legacy AES encryption. Please re-encrypt the value with GCM."); + String b64Value = value.substring(PREFIX_LEGACY_AES.length(), value.length() - 1); + try { + return EncryptionUtil.decryptAesLegacy(masterPassword, b64Value); + } catch (ConfigEncryptionException e) { + LOGGER.log(Level.FINEST, e, () -> "Failed to decrypt " + value); + return value; + } + } else if (value.startsWith(PREFIX_GCM)) { + String b64Value = value.substring(PREFIX_GCM.length(), value.length() - 1); + try { + return EncryptionUtil.decryptAes(masterPassword, b64Value); + } catch (ConfigEncryptionException e) { + LOGGER.log(Level.FINEST, e, () -> "Failed to decrypt " + value); + return value; + } + } + + return value; + } +} diff --git a/config/encryption/src/main/java/module-info.java b/config/encryption/src/main/java/module-info.java index 2a3e186b0aa..7ddafa9482d 100644 --- a/config/encryption/src/main/java/module-info.java +++ b/config/encryption/src/main/java/module-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,7 +24,10 @@ requires transitive io.helidon.common.pki; requires transitive io.helidon.config; + requires static io.helidon.config.mp; + exports io.helidon.config.encryption; provides io.helidon.config.spi.ConfigFilter with io.helidon.config.encryption.EncryptionFilterService; + provides io.helidon.config.mp.spi.MpConfigFilter with io.helidon.config.encryption.MpEncryptionFilter; } diff --git a/config/encryption/src/main/resources/META-INF/services/io.helidon.config.mp.spi.MpConfigFilter b/config/encryption/src/main/resources/META-INF/services/io.helidon.config.mp.spi.MpConfigFilter new file mode 100644 index 00000000000..a35947c05d7 --- /dev/null +++ b/config/encryption/src/main/resources/META-INF/services/io.helidon.config.mp.spi.MpConfigFilter @@ -0,0 +1,17 @@ +# +# Copyright (c) 2020 Oracle and/or its affiliates. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +io.helidon.config.encryption.MpEncryptionFilter diff --git a/config/pom.xml b/config/pom.xml index 9c3cad4825e..9921045b569 100644 --- a/config/pom.xml +++ b/config/pom.xml @@ -46,6 +46,7 @@ testing test-infrastructure tests + config-mp diff --git a/config/tests/pom.xml b/config/tests/pom.xml index 8e9f97c090a..fce3466f866 100644 --- a/config/tests/pom.xml +++ b/config/tests/pom.xml @@ -58,6 +58,5 @@ test-mappers-2-complex test-meta-source test-parsers-1-complex - test-mp-reference diff --git a/config/yaml/pom.xml b/config/yaml/pom.xml index c8941a4de73..54e9566e862 100644 --- a/config/yaml/pom.xml +++ b/config/yaml/pom.xml @@ -50,6 +50,12 @@ jakarta.annotation jakarta.annotation-api + + org.eclipse.microprofile.config + microprofile-config-api + provided + true + io.helidon.config helidon-config-testing diff --git a/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java b/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java new file mode 100644 index 00000000000..ebca6417521 --- /dev/null +++ b/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java @@ -0,0 +1,186 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.yaml; + +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.helidon.config.ConfigException; + +import org.eclipse.microprofile.config.spi.ConfigSource; +import org.yaml.snakeyaml.Yaml; + +/** + * MicroProfile {@link org.eclipse.microprofile.config.spi.ConfigSource} that can be used + * to add YAML files from classpath or file system using the + * {@link org.eclipse.microprofile.config.spi.ConfigProviderResolver#getBuilder()}. + *

+ * The YAML file is transformed to a flat map as follows: + *

Object nodes

+ * Each node in the tree is dot separated. + *
+ * server:
+ *     host: "localhost"
+ *     port: 8080
+ * 
+ * Will be transformed to the following properties: + *
+ * server.host=localhost
+ * server.port=8080
+ * 
+ *

List nodes (arrays)

+ * Each node will be indexed (0 based) + *
+ * providers:
+ *   - abac:
+ *       enabled: true
+ * names: ["first", "second", "third"]
+ * 
+ * Will be transformed to the following properties: + *
+ * providers.0.abac.enabled=true
+ * names.0=first
+ * names.1=second
+ * names.2=third
+ * 
+ * + */ +public class YamlMpConfigSource implements ConfigSource { + private final Map properties; + private final String name; + + private YamlMpConfigSource(String name, Map properties) { + this.properties = properties; + this.name = "yaml: " + name; + } + + /** + * Load a YAML config source from file system. + * + * @param path path to the YAML file + * @return config source loaded from the file + * @see #create(java.net.URL) + */ + public static ConfigSource create(Path path) { + try { + return create(path.toUri().toURL()); + } catch (MalformedURLException e) { + throw new ConfigException("Failed to load YAML config source from path: " + path.toAbsolutePath(), e); + } + } + + /** + * Load a YAML config source from URL. + * The URL may be any URL which is support by the used JVM. + * + * @param url url of the resource + * @return config source loaded from the URL + */ + public static ConfigSource create(URL url) { + try (InputStreamReader reader = new InputStreamReader(url.openConnection().getInputStream(), StandardCharsets.UTF_8)) { + return create(url.toString(), reader); + } catch (Exception e) { + throw new ConfigException("Failed to configure YAML config source", e); + } + } + + /** + * Create from YAML content as a reader. + * This method will NOT close the reader. + * + * @param name name of the config source + * @param content reader with the YAML content + * @return config source loaded from the content + */ + public static ConfigSource create(String name, Reader content) { + Map yamlMap; + Yaml yaml = new Yaml(); + yamlMap = yaml.loadAs(content, Map.class); + if (yamlMap == null) { // empty source + return new YamlMpConfigSource(name, Map.of()); + } + + return new YamlMpConfigSource(name, fromMap(yamlMap)); + + } + + @Override + public Map getProperties() { + return Collections.unmodifiableMap(properties); + } + + @Override + public String getValue(String propertyName) { + return properties.get(propertyName); + } + + @Override + public String getName() { + return name; + } + + private static Map fromMap(Map yamlMap) { + Map result = new HashMap<>(); + process(result, "", yamlMap); + + return result; + } + + private static void process(Map resultMap, String prefix, Map yamlMap) { + yamlMap.forEach((key, value) -> { + processNext(resultMap, prefix(prefix, key.toString()), value); + }); + } + + private static void process(Map resultMap, String prefix, List yamlList) { + int counter = 0; + for (Object value : yamlList) { + processNext(resultMap, prefix(prefix, String.valueOf(counter)), value); + + counter++; + } + } + + private static void processNext(Map resultMap, + String prefix, + Object value) { + if (value instanceof List) { + process(resultMap, prefix, (List) value); + } else if (value instanceof Map) { + process(resultMap, prefix, (Map) value); + } else { + String stringValue = (null == value) ? "" : value.toString(); + resultMap.put(prefix, stringValue); + } + } + + private static String prefix(String prefix, String stringKey) { + if (prefix.isEmpty()) { + return stringKey; + } + + return prefix + "." + stringKey; + } +} diff --git a/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSourceProvider.java b/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSourceProvider.java new file mode 100644 index 00000000000..ad38f09eaab --- /dev/null +++ b/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSourceProvider.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.yaml; + +import java.io.IOException; +import java.net.URL; +import java.util.Enumeration; +import java.util.LinkedList; +import java.util.List; + +import io.helidon.config.ConfigException; + +import org.eclipse.microprofile.config.spi.ConfigSource; +import org.eclipse.microprofile.config.spi.ConfigSourceProvider; + +/** + * YAML config source provider for MicroProfile config that supports file {@code application.yaml}. + * This class should not be used directly - it is loaded automatically by Java service loader. + */ +public class YamlMpConfigSourceProvider implements ConfigSourceProvider { + @Override + public Iterable getConfigSources(ClassLoader classLoader) { + Enumeration resources; + try { + resources = classLoader.getResources("application.yaml"); + } catch (IOException e) { + throw new ConfigException("Failed to read resources from classpath", e); + } + + List result = new LinkedList<>(); + while (resources.hasMoreElements()) { + URL url = resources.nextElement(); + result.add(YamlMpConfigSource.create(url)); + } + + return result; + } +} diff --git a/config/yaml/src/main/java/module-info.java b/config/yaml/src/main/java/module-info.java index 40b384f0ed2..f6d2155f0fd 100644 --- a/config/yaml/src/main/java/module-info.java +++ b/config/yaml/src/main/java/module-info.java @@ -15,6 +15,7 @@ */ import io.helidon.config.yaml.YamlConfigParser; +import io.helidon.config.yaml.YamlMpConfigSourceProvider; /** * YAML Parser implementation. @@ -27,9 +28,11 @@ requires transitive io.helidon.config; requires io.helidon.common; + requires static microprofile.config.api; exports io.helidon.config.yaml; provides io.helidon.config.spi.ConfigParser with YamlConfigParser; + provides org.eclipse.microprofile.config.spi.ConfigSourceProvider with YamlMpConfigSourceProvider; } diff --git a/config/yaml/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSourceProvider b/config/yaml/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSourceProvider new file mode 100644 index 00000000000..53d463485ba --- /dev/null +++ b/config/yaml/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSourceProvider @@ -0,0 +1,17 @@ +# +# Copyright (c) 2020 Oracle and/or its affiliates. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +io.helidon.config.yaml.YamlMpConfigSourceProvider \ No newline at end of file diff --git a/config/yaml/src/test/java/io/helidon/config/yaml/YamlMpConfigSourceTest.java b/config/yaml/src/test/java/io/helidon/config/yaml/YamlMpConfigSourceTest.java new file mode 100644 index 00000000000..d8f6a876985 --- /dev/null +++ b/config/yaml/src/test/java/io/helidon/config/yaml/YamlMpConfigSourceTest.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.config.yaml; + +import java.io.StringReader; + +import org.eclipse.microprofile.config.spi.ConfigSource; +import org.junit.jupiter.api.Test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.MatcherAssert.assertThat; + +public class YamlMpConfigSourceTest { + private static final String TEST_1 = "server:\n" + + " host: \"localhost\"\n" + + " port: 8080\n"; + + private static final String TEST_2 = "providers:\n" + + " - abac:\n" + + " enabled: true\n" + + "names: [\"first\", \"second\", \"third\"]"; + @Test + void testObjectNode() { + ConfigSource source = YamlMpConfigSource.create("testObjectNode", new StringReader(TEST_1)); + assertThat(source.getValue("server.host"), is("localhost")); + assertThat(source.getValue("server.port"), is("8080")); + } + + @Test + void testListNode() { + ConfigSource source = YamlMpConfigSource.create("testObjectNode", new StringReader(TEST_2)); + assertThat(source.getValue("providers.0.abac.enabled"), is("true")); + assertThat(source.getValue("names.0"), is("first")); + assertThat(source.getValue("names.1"), is("second")); + assertThat(source.getValue("names.2"), is("third")); + } +} diff --git a/integrations/graal/native-image-extension/pom.xml b/integrations/graal/native-image-extension/pom.xml index b58b2388f14..05603cb630d 100644 --- a/integrations/graal/native-image-extension/pom.xml +++ b/integrations/graal/native-image-extension/pom.xml @@ -41,6 +41,10 @@ io.helidon.webserver helidon-webserver
+ + io.helidon.config + helidon-config-mp + org.glassfish jakarta.json diff --git a/integrations/graal/native-image-extension/src/main/java/io/helidon/integrations/graal/nativeimage/extension/HelidonReflectionFeature.java b/integrations/graal/native-image-extension/src/main/java/io/helidon/integrations/graal/nativeimage/extension/HelidonReflectionFeature.java index 28cbf970a1a..7633fd29514 100644 --- a/integrations/graal/native-image-extension/src/main/java/io/helidon/integrations/graal/nativeimage/extension/HelidonReflectionFeature.java +++ b/integrations/graal/native-image-extension/src/main/java/io/helidon/integrations/graal/nativeimage/extension/HelidonReflectionFeature.java @@ -39,7 +39,7 @@ import javax.json.JsonReaderFactory; import javax.json.stream.JsonParsingException; -import io.helidon.config.MpConfigProviderResolver; +import io.helidon.config.mp.MpConfigProviderResolver; import com.oracle.svm.core.annotate.AutomaticFeature; import com.oracle.svm.core.jdk.proxy.DynamicProxyRegistry; diff --git a/messaging/connectors/kafka/pom.xml b/messaging/connectors/kafka/pom.xml index df2a07e3ded..1a537da6955 100644 --- a/messaging/connectors/kafka/pom.xml +++ b/messaging/connectors/kafka/pom.xml @@ -48,6 +48,10 @@ io.helidon.config helidon-config + + io.helidon.config + helidon-config-mp + io.helidon.common helidon-common-context diff --git a/messaging/connectors/kafka/src/main/java/io/helidon/messaging/connectors/kafka/KafkaConnector.java b/messaging/connectors/kafka/src/main/java/io/helidon/messaging/connectors/kafka/KafkaConnector.java index 5b54916cef1..5bf2b8333ad 100644 --- a/messaging/connectors/kafka/src/main/java/io/helidon/messaging/connectors/kafka/KafkaConnector.java +++ b/messaging/connectors/kafka/src/main/java/io/helidon/messaging/connectors/kafka/KafkaConnector.java @@ -30,6 +30,7 @@ import io.helidon.common.configurable.ScheduledThreadPoolSupplier; import io.helidon.config.Config; +import io.helidon.config.mp.MpConfig; import org.eclipse.microprofile.reactive.messaging.Message; import org.eclipse.microprofile.reactive.messaging.spi.Connector; @@ -89,14 +90,18 @@ void terminate(@Observes @BeforeDestroyed(ApplicationScoped.class) Object event) @Override public PublisherBuilder> getPublisherBuilder(org.eclipse.microprofile.config.Config config) { - KafkaPublisher publisher = KafkaPublisher.builder().config((Config) config).scheduler(scheduler).build(); + KafkaPublisher publisher = KafkaPublisher.builder() + .config(MpConfig.toHelidonConfig(config)) + .scheduler(scheduler) + .build(); + resources.add(publisher); return ReactiveStreams.fromPublisher(publisher); } @Override public SubscriberBuilder, Void> getSubscriberBuilder(org.eclipse.microprofile.config.Config config) { - return ReactiveStreams.fromSubscriber(KafkaSubscriber.create((Config) config)); + return ReactiveStreams.fromSubscriber(KafkaSubscriber.create(MpConfig.toHelidonConfig(config))); } /** diff --git a/messaging/connectors/kafka/src/main/java/module-info.java b/messaging/connectors/kafka/src/main/java/module-info.java index af86e645c89..4d555eeafe5 100644 --- a/messaging/connectors/kafka/src/main/java/module-info.java +++ b/messaging/connectors/kafka/src/main/java/module-info.java @@ -22,10 +22,12 @@ requires static kafka.clients; requires org.reactivestreams; requires transitive io.helidon.config; + requires io.helidon.config.mp; requires transitive microprofile.reactive.messaging.api; requires transitive microprofile.reactive.streams.operators.api; requires io.helidon.common.context; requires io.helidon.common.configurable; + requires microprofile.config.api; exports io.helidon.messaging.connectors.kafka; } \ No newline at end of file diff --git a/metrics/metrics/pom.xml b/metrics/metrics/pom.xml index f40f5c8a3b5..b2ff82e3f35 100644 --- a/metrics/metrics/pom.xml +++ b/metrics/metrics/pom.xml @@ -46,6 +46,10 @@ io.helidon.common helidon-common-metrics + + io.helidon.config + helidon-config-mp + org.eclipse.microprofile.metrics microprofile-metrics-api diff --git a/metrics/metrics/src/main/java/module-info.java b/metrics/metrics/src/main/java/module-info.java index 02e483bc7e6..92197c1c702 100644 --- a/metrics/metrics/src/main/java/module-info.java +++ b/metrics/metrics/src/main/java/module-info.java @@ -29,6 +29,8 @@ requires io.helidon.webserver; requires io.helidon.media.jsonp.server; requires java.json; + requires io.helidon.config.mp; + requires microprofile.config.api; provides io.helidon.common.metrics.InternalBridge with io.helidon.metrics.InternalBridgeImpl; diff --git a/microprofile/cdi/pom.xml b/microprofile/cdi/pom.xml index 486d39bd87a..c83504c286e 100644 --- a/microprofile/cdi/pom.xml +++ b/microprofile/cdi/pom.xml @@ -44,7 +44,7 @@ io.helidon.config - helidon-config + helidon-config-mp io.helidon.common diff --git a/microprofile/cdi/src/main/java/io/helidon/microprofile/cdi/HelidonContainerImpl.java b/microprofile/cdi/src/main/java/io/helidon/microprofile/cdi/HelidonContainerImpl.java index bd19330799a..f7485f9d34e 100644 --- a/microprofile/cdi/src/main/java/io/helidon/microprofile/cdi/HelidonContainerImpl.java +++ b/microprofile/cdi/src/main/java/io/helidon/microprofile/cdi/HelidonContainerImpl.java @@ -43,9 +43,10 @@ import io.helidon.common.HelidonFlavor; import io.helidon.common.context.Context; import io.helidon.common.context.Contexts; -import io.helidon.config.Config; -import io.helidon.config.MpConfigProviderResolver; +import io.helidon.config.mp.MpConfig; +import io.helidon.config.mp.MpConfigProviderResolver; +import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.ConfigProvider; import org.jboss.weld.AbstractCDI; import org.jboss.weld.bean.builtin.BeanManagerProxy; @@ -151,7 +152,9 @@ public Collection getResources(String name) { }; setResourceLoader(resourceLoader); - Config config = (Config) ConfigProvider.getConfig(); + Config mpConfig = ConfigProvider.getConfig(); + io.helidon.config.Config config = MpConfig.toHelidonConfig(mpConfig); + Map properties = config.get("cdi") .detach() .asMap() @@ -263,7 +266,7 @@ private HelidonContainerImpl doStart() { bm = CDI.current().getBeanManager(); } - Config config = (Config) ConfigProvider.getConfig(); + org.eclipse.microprofile.config.Config config = ConfigProvider.getConfig(); MpConfigProviderResolver.runtimeStart(config); @@ -316,7 +319,8 @@ public void close() throws SecurityException { now = System.currentTimeMillis() - now; LOGGER.fine("Container started in " + now + " millis (this excludes the initialization time)"); - HelidonFeatures.print(HelidonFlavor.MP, config.get("features.print-details").asBoolean().orElse(false)); + HelidonFeatures.print(HelidonFlavor.MP, + config.getOptionalValue("features.print-details", Boolean.class).orElse(false)); // shutdown hook should be added after all initialization is done, otherwise a race condition may happen Runtime.getRuntime().addShutdownHook(shutdownHook); diff --git a/microprofile/cdi/src/main/java/module-info.java b/microprofile/cdi/src/main/java/module-info.java index fa9cdeb696d..7c113dbb62d 100644 --- a/microprofile/cdi/src/main/java/module-info.java +++ b/microprofile/cdi/src/main/java/module-info.java @@ -29,6 +29,7 @@ requires io.helidon.common; requires io.helidon.config; + requires io.helidon.config.mp; requires weld.core.impl; requires weld.spi; @@ -36,6 +37,7 @@ requires weld.se.core; requires io.helidon.common.context; requires jakarta.inject.api; + requires microprofile.config.api; exports io.helidon.microprofile.cdi; diff --git a/microprofile/cdi/src/test/java/io/helidon/microprofile/cdi/HelidonContainerInitializerTest.java b/microprofile/cdi/src/test/java/io/helidon/microprofile/cdi/HelidonContainerInitializerTest.java index c1ffb069aa9..1b5dc850f83 100644 --- a/microprofile/cdi/src/test/java/io/helidon/microprofile/cdi/HelidonContainerInitializerTest.java +++ b/microprofile/cdi/src/test/java/io/helidon/microprofile/cdi/HelidonContainerInitializerTest.java @@ -23,9 +23,9 @@ import javax.enterprise.inject.se.SeContainerInitializer; import javax.enterprise.inject.spi.CDI; -import io.helidon.config.Config; -import io.helidon.config.ConfigSources; +import io.helidon.config.mp.MpConfigSources; +import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.spi.ConfigProviderResolver; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; @@ -59,7 +59,11 @@ void resetConfig() { @Test void testRestart() { // this is a reproducer for bug 1554 - Config config = Config.create(ConfigSources.create(Map.of(HelidonContainerInitializer.CONFIG_ALLOW_INITIALIZER, "true"))); + Config config = ConfigProviderResolver.instance() + .getBuilder() + .withSources(MpConfigSources.create(Map.of(HelidonContainerInitializer.CONFIG_ALLOW_INITIALIZER, "true"))) + .build(); + configResolver.registerConfig((org.eclipse.microprofile.config.Config) config, cl); // now we can start using SeContainerInitializer SeContainer container = SeContainerInitializer.newInstance() @@ -79,7 +83,11 @@ void testRestart() { @Test void testRestart2() { // this is a reproducer for bug 1554 - Config config = Config.create(ConfigSources.create(Map.of(HelidonContainerInitializer.CONFIG_ALLOW_INITIALIZER, "true"))); + Config config = ConfigProviderResolver.instance() + .getBuilder() + .withSources(MpConfigSources.create(Map.of(HelidonContainerInitializer.CONFIG_ALLOW_INITIALIZER, "true"))) + .build(); + configResolver.registerConfig((org.eclipse.microprofile.config.Config) config, cl); // now we can start using SeContainerInitializer SeContainerInitializer seContainerInitializer = SeContainerInitializer.newInstance(); @@ -103,8 +111,13 @@ void testSeInitializerFails() { assertThrows(IllegalStateException.class, SeContainerInitializer::newInstance); - Config config = Config.create(ConfigSources.create(Map.of(HelidonContainerInitializer.CONFIG_ALLOW_INITIALIZER, "true"))); - configResolver.registerConfig((org.eclipse.microprofile.config.Config) config, cl); + Config config = ConfigProviderResolver.instance() + .getBuilder() + .withSources(MpConfigSources + .create(Map.of(HelidonContainerInitializer.CONFIG_ALLOW_INITIALIZER, "true"))) + .build(); + + configResolver.registerConfig(config, cl); SeContainerInitializer seContainerInitializer = SeContainerInitializer.newInstance(); assertThat(seContainerInitializer, instanceOf(HelidonContainerInitializer.class)); diff --git a/microprofile/cdi/src/test/java/io/helidon/microprofile/cdi/MainTest.java b/microprofile/cdi/src/test/java/io/helidon/microprofile/cdi/MainTest.java index 0864bad2c91..484e888f8b1 100644 --- a/microprofile/cdi/src/test/java/io/helidon/microprofile/cdi/MainTest.java +++ b/microprofile/cdi/src/test/java/io/helidon/microprofile/cdi/MainTest.java @@ -23,10 +23,10 @@ import javax.enterprise.inject.spi.BeanManager; import javax.enterprise.inject.spi.CDI; -import io.helidon.config.Config; -import io.helidon.config.ConfigSources; -import io.helidon.config.MpConfigProviderResolver; +import io.helidon.config.mp.MpConfigProviderResolver; +import io.helidon.config.mp.MpConfigSources; +import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.spi.ConfigProviderResolver; import org.junit.jupiter.api.Test; @@ -68,13 +68,18 @@ void testEvents() { assertThat(extension.events(), contains(TestExtension.BUILD_TIME_START, TestExtension.BUILD_TIME_END)); - Config config = Config.create(ConfigSources.create(Map.of("key", "value"))); + + Config config = ConfigProviderResolver.instance() + .getBuilder() + .withSources(MpConfigSources.create(Map.of("key", "value"))) + .build(); + ConfigProviderResolver.instance() - .registerConfig((org.eclipse.microprofile.config.Config) config, Thread.currentThread().getContextClassLoader()); + .registerConfig(config, Thread.currentThread().getContextClassLoader()); instance.start(); - Config runtimeConfig = extension.runtimeConfig(); + Object runtimeConfig = extension.runtimeConfig(); assertThat(runtimeConfig, instanceOf(MpConfigProviderResolver.ConfigDelegate.class)); assertThat(((MpConfigProviderResolver.ConfigDelegate) runtimeConfig).delegate(), sameInstance(config)); diff --git a/microprofile/config/pom.xml b/microprofile/config/pom.xml index e0c53d548a8..336010d22fc 100644 --- a/microprofile/config/pom.xml +++ b/microprofile/config/pom.xml @@ -37,20 +37,21 @@ io.helidon.config - helidon-config + helidon-config-mp - org.eclipse.microprofile.config - microprofile-config-api + io.helidon.config + helidon-config-yaml + runtime io.helidon.config - helidon-config-object-mapping + helidon-config-encryption runtime - io.helidon.microprofile.cdi - helidon-microprofile-cdi + io.helidon.config + helidon-config-object-mapping runtime @@ -64,6 +65,11 @@ jakarta.inject-api provided + + io.helidon.microprofile.cdi + helidon-microprofile-cdi + test + io.helidon.microprofile.bundles internal-test-libs diff --git a/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java b/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java index 31e41bedba8..fdcc1070e00 100644 --- a/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java +++ b/microprofile/config/src/main/java/io/helidon/microprofile/config/ConfigCdiExtension.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -63,7 +63,9 @@ import io.helidon.common.HelidonFeatures; import io.helidon.common.HelidonFlavor; import io.helidon.common.NativeImageHelper; -import io.helidon.config.MpConfig; +import io.helidon.config.mp.MpConfig; +import io.helidon.config.mp.MpConfigImpl; +import io.helidon.config.mp.MpConfigProviderResolver; import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.ConfigProvider; @@ -77,7 +79,7 @@ public class ConfigCdiExtension implements Extension { private static final Logger LOGGER = Logger.getLogger(ConfigCdiExtension.class.getName()); private static final Pattern SPLIT_PATTERN = Pattern.compile("(? new SerializableConfig()); abd.addBean() - .addTransitiveTypeClosure(Config.class) - .beanClass(Config.class) + .addTransitiveTypeClosure(io.helidon.config.Config.class) + .beanClass(io.helidon.config.Config.class) .scope(ApplicationScoped.class) - .createWith(creationalContext -> (Config) ConfigProvider.getConfig()); + .createWith(creationalContext -> { + Config config = ConfigProvider.getConfig(); + if (config instanceof io.helidon.config.Config) { + return config; + } else { + return MpConfig.toHelidonConfig(config); + } + }); Set types = ips.stream() .map(InjectionPoint::getType) @@ -258,6 +267,10 @@ any java class (except for parameterized types) */ FieldTypes fieldTypes = FieldTypes.create(type); org.eclipse.microprofile.config.Config config = ConfigProvider.getConfig(); + if (config instanceof MpConfigProviderResolver.ConfigDelegate) { + // get the actual instance to have access to Helidon specific methods + config = ((MpConfigProviderResolver.ConfigDelegate) config).delegate(); + } String defaultValue = defaultValue(annotation); Object value = configValue(config, fieldTypes, configKey, defaultValue); @@ -298,11 +311,13 @@ private static T convert(String key, Config config, String value, Class t if (String.class.equals(type)) { return (T) value; } - if (config instanceof io.helidon.config.Config) { - return ((io.helidon.config.Config) config).convert(type, value); - } - if (config instanceof MpConfig) { - return ((MpConfig) config).convert(key, type, value); + if (config instanceof MpConfigImpl) { + return ((MpConfigImpl) config).getConverter(type) + .orElseThrow(() -> new IllegalArgumentException("Did not find converter for type " + + type.getName() + + ", for key " + + key)) + .convert(value); } throw new IllegalArgumentException("Helidon CDI MP Config implementation requires Helidon config instance. " diff --git a/microprofile/config/src/main/java/io/helidon/microprofile/config/package-info.java b/microprofile/config/src/main/java/io/helidon/microprofile/config/package-info.java index 3012b0c9534..9c29b6f5e29 100644 --- a/microprofile/config/src/main/java/io/helidon/microprofile/config/package-info.java +++ b/microprofile/config/src/main/java/io/helidon/microprofile/config/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,6 +15,6 @@ */ /** - * Helidon implementation of microprofile config. + * Helidon implementation of microprofile config for CDI. */ package io.helidon.microprofile.config; diff --git a/microprofile/config/src/main/java/module-info.java b/microprofile/config/src/main/java/module-info.java index 7ebf104d009..15ce3099d00 100644 --- a/microprofile/config/src/main/java/module-info.java +++ b/microprofile/config/src/main/java/module-info.java @@ -23,7 +23,10 @@ requires jakarta.inject.api; requires io.helidon.common; requires io.helidon.config; - requires microprofile.config.api; + requires transitive microprofile.config.api; + requires io.helidon.config.mp; + requires java.annotation; + requires io.helidon.common.serviceloader; exports io.helidon.microprofile.config; diff --git a/microprofile/config/src/test/resources/META-INF/microprofile-config.properties b/microprofile/config/src/test/resources/META-INF/microprofile-config.properties index 0dcc20a6d59..2fd4f3c5f50 100644 --- a/microprofile/config/src/test/resources/META-INF/microprofile-config.properties +++ b/microprofile/config/src/test/resources/META-INF/microprofile-config.properties @@ -14,6 +14,7 @@ # limitations under the License. # -# needed to run unit tests independently (without beans.xml) +# needed to run unit tests independently based on explicit beans using SeContainerInitializer mp.initializer.allow=true mp.initializer.warn=false + diff --git a/microprofile/messaging/src/main/java/io/helidon/microprofile/messaging/AdHocConfigBuilder.java b/microprofile/messaging/src/main/java/io/helidon/microprofile/messaging/AdHocConfigBuilder.java index 1681915fcc1..6ad32f3f53d 100644 --- a/microprofile/messaging/src/main/java/io/helidon/microprofile/messaging/AdHocConfigBuilder.java +++ b/microprofile/messaging/src/main/java/io/helidon/microprofile/messaging/AdHocConfigBuilder.java @@ -21,7 +21,9 @@ import java.util.Map; import io.helidon.config.Config; -import io.helidon.config.ConfigSources; +import io.helidon.config.mp.MpConfigSources; + +import org.eclipse.microprofile.config.spi.ConfigProviderResolver; /** * Detached configuration of a single connector. @@ -49,13 +51,9 @@ AdHocConfigBuilder putAll(Config configToPut) { } org.eclipse.microprofile.config.Config build() { - Config newConfig = Config.builder(ConfigSources.create(configuration)) - .disableEnvironmentVariablesSource() - .disableSystemPropertiesSource() - .disableFilterServices() - .disableSourceServices() - .disableParserServices() + return ConfigProviderResolver.instance() + .getBuilder() + .withSources(MpConfigSources.create(configuration)) .build(); - return (org.eclipse.microprofile.config.Config) newConfig; } } diff --git a/microprofile/messaging/src/main/java/module-info.java b/microprofile/messaging/src/main/java/module-info.java index fc875b97ad9..c6e6189efad 100644 --- a/microprofile/messaging/src/main/java/module-info.java +++ b/microprofile/messaging/src/main/java/module-info.java @@ -25,6 +25,7 @@ requires static jakarta.activation; requires jakarta.interceptor.api; requires io.helidon.config; + requires io.helidon.config.mp; requires io.helidon.microprofile.config; requires io.helidon.microprofile.server; requires io.helidon.microprofile.reactive; diff --git a/microprofile/messaging/src/test/java/io/helidon/microprofile/messaging/AbstractCDITest.java b/microprofile/messaging/src/test/java/io/helidon/microprofile/messaging/AbstractCDITest.java index 49d38cc82fa..98c58ce4beb 100644 --- a/microprofile/messaging/src/test/java/io/helidon/microprofile/messaging/AbstractCDITest.java +++ b/microprofile/messaging/src/test/java/io/helidon/microprofile/messaging/AbstractCDITest.java @@ -16,8 +16,6 @@ package io.helidon.microprofile.messaging; -import java.io.IOException; -import java.io.InputStream; import java.lang.annotation.Annotation; import java.util.Arrays; import java.util.Collections; @@ -28,38 +26,24 @@ import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; -import java.util.logging.LogManager; import java.util.stream.Stream; import javax.enterprise.inject.se.SeContainer; import javax.enterprise.inject.se.SeContainerInitializer; import javax.enterprise.inject.spi.CDI; -import io.helidon.config.Config; -import io.helidon.config.ConfigSources; -import io.helidon.microprofile.server.Server; +import io.helidon.config.mp.MpConfigSources; import io.helidon.microprofile.server.ServerCdiExtension; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - +import org.eclipse.microprofile.config.Config; import org.eclipse.microprofile.config.spi.ConfigProviderResolver; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; -public abstract class AbstractCDITest { - - static Server singleServerReference; - - static { - try (InputStream is = AbstractCDITest.class.getResourceAsStream("/logging.properties")) { - LogManager.getLogManager().readConfiguration(is); - } catch (IOException e) { - fail(e); - } - } +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; +public abstract class AbstractCDITest { protected SeContainer cdiContainer; protected Map cdiConfig() { @@ -81,7 +65,6 @@ public void setUp() { @AfterEach public void tearDown() { try { - singleServerReference.stop(); cdiContainer.close(); } catch (Throwable t) { //emergency cleanup see #1446 @@ -111,18 +94,13 @@ protected static SeContainer startCdiContainer(Map p, Class.. private static SeContainer startCdiContainer(Map p, Set> beanClasses) { p = new HashMap<>(p); p.put("mp.initializer.allow", "true"); - Config config = Config.builder() - .sources(ConfigSources.create(p)) + Config config = ConfigProviderResolver.instance().getBuilder() + .withSources(MpConfigSources.create(p)) .build(); - final Server.Builder builder = Server.builder(); - assertNotNull(builder); - builder.config(config); - singleServerReference = builder.build(); ConfigProviderResolver.instance() - .registerConfig((org.eclipse.microprofile.config.Config) config, Thread.currentThread().getContextClassLoader()); + .registerConfig(config, Thread.currentThread().getContextClassLoader()); final SeContainerInitializer initializer = SeContainerInitializer.newInstance(); - assertNotNull(initializer); initializer.addBeanClasses(beanClasses.toArray(new Class[0])); return initializer.initialize(); } diff --git a/microprofile/server/pom.xml b/microprofile/server/pom.xml index a329a4abc58..57d92b99377 100644 --- a/microprofile/server/pom.xml +++ b/microprofile/server/pom.xml @@ -32,10 +32,6 @@ Server of the microprofile implementation - - org.eclipse.microprofile.config - microprofile-config-api - io.helidon.microprofile.cdi helidon-microprofile-cdi @@ -74,7 +70,6 @@ io.helidon.microprofile.config helidon-microprofile-config - runtime diff --git a/microprofile/server/src/main/java/io/helidon/microprofile/server/JaxRsCdiExtension.java b/microprofile/server/src/main/java/io/helidon/microprofile/server/JaxRsCdiExtension.java index b78d9dea45f..aef46e89588 100644 --- a/microprofile/server/src/main/java/io/helidon/microprofile/server/JaxRsCdiExtension.java +++ b/microprofile/server/src/main/java/io/helidon/microprofile/server/JaxRsCdiExtension.java @@ -104,9 +104,7 @@ public List applicationsToRun() throws IllegalStateException { if (applications.isEmpty() && applicationMetas.isEmpty()) { // create a synthetic application from all resource classes // the classes set must be created before the lambda, as resources are cleared later on - if (resources.isEmpty()) { - LOGGER.warning("There are no JAX-RS applications or resources. Maybe you forgot META-INF/beans.xml file?"); - } else { + if (!resources.isEmpty()) { Set> classes = new HashSet<>(resources); applicationMetas.add(JaxRsApplication.builder() .synthetic(true) diff --git a/microprofile/server/src/main/java/io/helidon/microprofile/server/Server.java b/microprofile/server/src/main/java/io/helidon/microprofile/server/Server.java index d17f689cda1..4cfea7e8918 100644 --- a/microprofile/server/src/main/java/io/helidon/microprofile/server/Server.java +++ b/microprofile/server/src/main/java/io/helidon/microprofile/server/Server.java @@ -30,6 +30,8 @@ import io.helidon.common.configurable.ServerThreadPoolSupplier; import io.helidon.common.context.Contexts; +import io.helidon.config.mp.MpConfig; +import io.helidon.config.mp.MpConfigSources; import io.helidon.microprofile.cdi.HelidonContainer; import org.eclipse.microprofile.config.Config; @@ -207,7 +209,7 @@ private Server doBuild() { if (null == defaultExecutorService) { defaultExecutorService = ServerThreadPoolSupplier.builder() .name("server") - .config(((io.helidon.config.Config) config) + .config(MpConfig.toHelidonConfig(config) .get("server.executor-service")) .build(); } @@ -317,7 +319,11 @@ public Builder port(int port) { * @return modified builder */ public Builder config(io.helidon.config.Config config) { - this.config = (Config) config; + this.config = ConfigProviderResolver.instance() + .getBuilder() + .withSources(MpConfigSources.create(config)) + .build(); + return this; } diff --git a/microprofile/server/src/main/java/io/helidon/microprofile/server/ServerCdiExtension.java b/microprofile/server/src/main/java/io/helidon/microprofile/server/ServerCdiExtension.java index 1cb357e3d45..150b302c577 100644 --- a/microprofile/server/src/main/java/io/helidon/microprofile/server/ServerCdiExtension.java +++ b/microprofile/server/src/main/java/io/helidon/microprofile/server/ServerCdiExtension.java @@ -159,8 +159,12 @@ private void startServer(@Observes @Priority(PLATFORM_AFTER + 100) @Initialized( private void registerJaxRsApplications(BeanManager beanManager, ServerConfiguration serverConfig) { JaxRsCdiExtension jaxRs = beanManager.getExtension(JaxRsCdiExtension.class); - jaxRs.applicationsToRun() - .forEach(it -> addApplication(serverConfig, jaxRs, it)); + List jaxRsApplications = jaxRs.applicationsToRun(); + if (jaxRsApplications.isEmpty()) { + LOGGER.warning("There are no JAX-RS applications or resources. Maybe you forgot META-INF/beans.xml file?"); + } else { + jaxRsApplications.forEach(it -> addApplication(serverConfig, jaxRs, it)); + } } private void registerDefaultRedirect() { @@ -256,7 +260,7 @@ private void addApplication(ServerConfiguration serverConfig, JaxRsCdiExtension } Routing.Builder routing = routingBuilder(namedRouting, routingNameRequired, serverConfig, - applicationMeta.appName()); + applicationMeta.appName()); JerseySupport jerseySupport = jaxRs.toJerseySupport(jaxRsExecutorService, applicationMeta); if (contextRoot.isPresent()) { @@ -281,19 +285,19 @@ private void addApplication(ServerConfiguration serverConfig, JaxRsCdiExtension */ @SuppressWarnings("OptionalUsedAsFieldOrParameterType") public Routing.Builder routingBuilder(Optional namedRouting, boolean routingNameRequired, - ServerConfiguration serverConfig, String appName) { + ServerConfiguration serverConfig, String appName) { if (namedRouting.isPresent()) { String socket = namedRouting.get(); if (null == serverConfig.socket(socket)) { if (routingNameRequired) { throw new IllegalStateException("Application " - + appName - + " requires routing " - + socket - + " to exist, yet such a socket is not configured for web server"); + + appName + + " requires routing " + + socket + + " to exist, yet such a socket is not configured for web server"); } else { LOGGER.info("Routing " + socket + " does not exist, using default routing for application " - + appName); + + appName); return serverRoutingBuilder(); } @@ -319,7 +323,6 @@ private void registerWebServerServices(BeanManager beanManager, } } - private static List> prioritySort(Set> beans) { List> prioritized = new ArrayList<>(beans); prioritized.sort((o1, o2) -> { diff --git a/microprofile/server/src/main/java/module-info.java b/microprofile/server/src/main/java/module-info.java index 52bbffc4696..5158ce58fb9 100644 --- a/microprofile/server/src/main/java/module-info.java +++ b/microprofile/server/src/main/java/module-info.java @@ -26,6 +26,8 @@ requires transitive io.helidon.microprofile.cdi; + requires io.helidon.config.mp; + requires io.helidon.microprofile.config; requires transitive jakarta.enterprise.cdi.api; requires transitive java.ws.rs; requires jakarta.interceptor.api; @@ -35,6 +37,7 @@ // there is now a hardcoded dependency on Weld, to configure additional bean defining annotation requires java.management; + requires microprofile.config.api; exports io.helidon.microprofile.server; diff --git a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonContainerConfiguration.java b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonContainerConfiguration.java index 1f8466065fd..877d933cf6c 100644 --- a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonContainerConfiguration.java +++ b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonContainerConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, 2019 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -35,11 +35,8 @@ */ public class HelidonContainerConfiguration implements ContainerConfiguration { private String appClassName = null; - private String resourceClassName = null; private int port = 8080; private boolean deleteTmp = true; - private boolean addResourcesToApps = false; - private boolean replaceConfigSourcesWithMp = false; private boolean useRelativePath = false; public String getApp() { @@ -50,14 +47,6 @@ public void setApp(String app) { this.appClassName = app; } - public String getResource() { - return resourceClassName; - } - - public void setResource(String resource) { - this.resourceClassName = resource; - } - public int getPort() { return port; } @@ -82,22 +71,6 @@ public void setUseRelativePath(boolean b) { this.useRelativePath = b; } - public boolean getAddResourcesToApps() { - return addResourcesToApps; - } - - public void setAddResourcesToApps(boolean addResourcesToApps) { - this.addResourcesToApps = addResourcesToApps; - } - - public void setReplaceConfigSourcesWithMp(boolean replaceConfigSourcesWithMp) { - this.replaceConfigSourcesWithMp = replaceConfigSourcesWithMp; - } - - public boolean getReplaceConfigSourcesWithMp() { - return replaceConfigSourcesWithMp; - } - @Override public void validate() throws ConfigurationException { if ((port <= 0) || (port > Short.MAX_VALUE)) { diff --git a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java index 038be3fde32..91a4182aeb9 100644 --- a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java +++ b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java @@ -22,6 +22,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -29,17 +31,11 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.Properties; -import java.util.Set; -import java.util.TreeSet; import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.function.Consumer; -import java.util.function.Supplier; import java.util.logging.Level; import java.util.logging.Logger; @@ -47,11 +43,13 @@ import javax.enterprise.inject.spi.CDI; import javax.enterprise.inject.spi.DefinitionException; -import io.helidon.config.Config; -import io.helidon.config.ConfigSources; -import io.helidon.config.spi.ConfigSource; +import io.helidon.config.mp.MpConfigSources; import io.helidon.microprofile.server.Server; +import io.helidon.microprofile.server.ServerCdiExtension; +import org.eclipse.microprofile.config.Config; +import org.eclipse.microprofile.config.spi.ConfigProviderResolver; +import org.eclipse.microprofile.config.spi.ConfigSource; import org.jboss.arquillian.container.spi.client.container.DeployableContainer; import org.jboss.arquillian.container.spi.client.container.DeploymentException; import org.jboss.arquillian.container.spi.client.protocol.ProtocolDescription; @@ -108,12 +106,25 @@ public void setup(HelidonContainerConfiguration configuration) { @Override public void start() { - dummyServer = Server.builder().build(); + try { + if (!CDI.current() + .getBeanManager() + .getExtension(ServerCdiExtension.class) + .started()) { + dummyServer = Server.builder().build(); + } + } catch (IllegalStateException e) { + // CDI not running + dummyServer = Server.builder().build(); + } } @Override public void stop() { // No-op + if (null != dummyServer) { + dummyServer.stop(); + } } @Override @@ -140,53 +151,30 @@ public ProtocolMetaData deploy(Archive archive) throws DeploymentException { } LOGGER.info("Running Arquillian tests in directory: " + context.deployDir.toAbsolutePath()); - // Copy the archive into deployDir. Save off the class names for all classes included in the - // "classes" dir. Later I will visit each of these and see if they are JAX-RS Resources or - // Applications, so I can add those to the Server automatically. - final Set classNames = new TreeSet<>(); - copyArchiveToDeployDir(archive, context.deployDir, p -> { - if (p.endsWith(".class")) { - final int prefixLength = isJavaArchive ? 1 : "/WEB-INF/classes/".length(); - classNames.add(p.substring(prefixLength, p.lastIndexOf(".class")).replace('/', '.')); - } - }); + copyArchiveToDeployDir(archive, context.deployDir); - // If the configuration specified a Resource to load, add that to the set of class names - if (containerConfig.getResource() != null) { - classNames.add(containerConfig.getResource()); - } - - // If the configuration specified an Application to load, add that to the set of class names. - // The "Main" method (see Main.template) will go through all these classes and discover whether - // they are apps or resources and call the right builder methods on the Server.Builder. - if (containerConfig.getApp() != null) { - classNames.add(containerConfig.getApp()); - } - - URL[] classPath; + List classPath = new ArrayList<>(); Path rootDir = context.deployDir.resolve(""); if (isJavaArchive) { ensureBeansXml(rootDir); - classPath = new URL[] { - rootDir.toUri().toURL() - }; + classPath.add(rootDir); } else { // Prepare the launcher files Path webInfDir = context.deployDir.resolve("WEB-INF"); Path classesDir = webInfDir.resolve("classes"); Path libDir = webInfDir.resolve("lib"); ensureBeansXml(classesDir); - classPath = getServerClasspath(classesDir, libDir, rootDir); + addServerClasspath(classPath, classesDir, libDir, rootDir); } - startServer(context, classPath, classNames); + startServer(context, classPath.toArray(new Path[0])); } catch (IOException e) { LOGGER.log(Level.INFO, "Failed to start container", e); throw new DeploymentException("Failed to copy the archive assets into the deployment directory", e); } catch (ReflectiveOperationException e) { LOGGER.log(Level.INFO, "Failed to start container", e); - throw new DefinitionException(e.getCause()); // validation exceptions + throw new DefinitionException(e); // validation exceptions } // Server has started, so we're done. @@ -196,50 +184,18 @@ public ProtocolMetaData deploy(Archive archive) throws DeploymentException { return new ProtocolMetaData(); } - void startServer(RunContext context, URL[] classPath, Set classNames) + void startServer(RunContext context, Path[] classPath) throws ReflectiveOperationException { Optional.ofNullable((SeContainer) CDI.current()) .ifPresent(SeContainer::close); stopAll(); - context.classLoader = new MyClassloader(new URLClassLoader(classPath)); + context.classLoader = new MyClassloader(new URLClassLoader(toUrls(classPath))); context.oldClassLoader = Thread.currentThread().getContextClassLoader(); Thread.currentThread().setContextClassLoader(context.classLoader); - List> configSources = new LinkedList<>(); - configSources.add(ConfigSources.file(context.deployDir.resolve("META-INF/microprofile-config.properties").toString()) - .optional()); - // The following line supports MP OpenAPI, which allows an alternate - // location for the config file. - configSources.add(ConfigSources.file( - context.deployDir.resolve("WEB-INF/classes/META-INF/microprofile-config.properties").toString()) - .optional()); - configSources.add(ConfigSources.file(context.deployDir.resolve("arquillian.properties").toString()).optional()); - configSources.add(ConfigSources.file(context.deployDir.resolve("application.properties").toString()).optional()); - configSources.add(ConfigSources.file(context.deployDir.resolve("application.yaml").toString()).optional()); - configSources.add(ConfigSources.classpath("tck-application.yaml").optional()); - - // workaround for tck-fault-tolerance - if (containerConfig.getReplaceConfigSourcesWithMp()) { - URL mpConfigProps = context.classLoader.getResource("META-INF/microprofile-config.properties"); - if (mpConfigProps != null) { - try { - Properties props = new Properties(); - props.load(mpConfigProps.openStream()); - configSources.clear(); - configSources.add(ConfigSources.create(props)); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } - - Config config = Config.builder() - .sources(configSources) - .build(); - context.runnerClass = context.classLoader .loadClass("io.helidon.microprofile.arquillian.ServerRunner"); @@ -255,34 +211,79 @@ void startServer(RunContext context, URL[] classPath, Set classNames) } }); + // Configuration needs to be explicit, as some TCK libraries contain an unfortunate + // META-INF/microprofile-config.properties (such as JWT-Auth) + Config config = ConfigProviderResolver.instance() + .getBuilder() + .withSources(findMpConfigSources(classPath)) + .addDiscoveredConverters() + // will read application.yaml + .addDiscoveredSources() + .build(); + context.runnerClass - .getDeclaredMethod("start", Config.class, HelidonContainerConfiguration.class, Set.class, ClassLoader.class) - .invoke(context.runner, config, containerConfig, classNames, context.classLoader); + .getDeclaredMethod("start", Config.class, Integer.TYPE) + .invoke(context.runner, config, containerConfig.getPort()); } - URL[] getServerClasspath(Path classesDir, Path libDir, Path rootDir) throws IOException { - List urls = new ArrayList<>(); + private URL[] toUrls(Path[] classPath) { + List result = new ArrayList<>(); + for (Path path : classPath) { + try { + result.add(path.toUri().toURL()); + } catch (MalformedURLException e) { + throw new IllegalStateException("Classpath failed to be constructed for path: " + path); + } + } + + return result.toArray(new URL[0]); + } + + private ConfigSource[] findMpConfigSources(Path[] classPath) { + String location = "META-INF/microprofile-config.properties"; + List sources = new ArrayList<>(5); + + for (Path path : classPath) { + if (Files.isDirectory(path)) { + Path mpConfig = path.resolve(location); + if (Files.exists(mpConfig)) { + sources.add(MpConfigSources.create(mpConfig)); + } + } else { + // this must be a jar file (classpath is either jar file or a directory) + FileSystem fs; + try { + fs = FileSystems.newFileSystem(path, Thread.currentThread().getContextClassLoader()); + Path mpConfig = fs.getPath(location); + if (Files.exists(mpConfig)) { + sources.add(MpConfigSources.create(path + "!" + mpConfig, mpConfig)); + } + } catch (IOException e) { + // ignored + } + } + } + + // add the expected sysprops and env vars + sources.add(MpConfigSources.environmentVariables()); + sources.add(MpConfigSources.systemProperties()); + + return sources.toArray(new ConfigSource[0]); + } + + void addServerClasspath(List classpath, Path classesDir, Path libDir, Path rootDir) throws IOException { // classes directory - urls.add(classesDir.toUri().toURL()); + classpath.add(classesDir); // lib directory - need to find each jar file if (Files.exists(libDir)) { Files.list(libDir) .filter(path -> path.getFileName().toString().endsWith(".jar")) - .forEach(path -> { - try { - urls.add(path.toUri().toURL()); - } catch (MalformedURLException e) { - throw new HelidonArquillianException("Failed to get URL from library on path: " - + path.toAbsolutePath(), e); - } - }); + .forEach(classpath::add); } - urls.add(rootDir.toUri().toURL()); - - return urls.toArray(new URL[0]); + classpath.add(rootDir); } private void ensureBeansXml(Path classesDir) throws IOException { @@ -302,7 +303,6 @@ private void ensureBeansXml(Path classesDir) throws IOException { Files.copy(beanXmlTemplate, beansPath); } - } } @@ -372,11 +372,10 @@ public void undeploy(Descriptor descriptor) { * * @param archive The archive to deploy. This cannot be null. * @param deployDir The directory to deploy to. This cannot be null. - * @param callback The callback to invoke per item. This can be null. * @throws IOException if there is an I/O failure related to copying the archive assets to the deployment * directory. If this happens, the entire setup is bad and must be terminated. */ - private void copyArchiveToDeployDir(Archive archive, Path deployDir, Consumer callback) throws IOException { + private void copyArchiveToDeployDir(Archive archive, Path deployDir) throws IOException { Map archiveContents = archive.getContent(); for (Map.Entry entry : archiveContents.entrySet()) { ArchivePath path = entry.getKey(); @@ -393,11 +392,6 @@ private void copyArchiveToDeployDir(Archive archive, Path deployDir, Consumer } // Copy the asset to the destination location Files.copy(n.getAsset().openStream(), f, StandardCopyOption.REPLACE_EXISTING); - // Invoke the callback if one was registered - String p = n.getPath().get(); - if (callback != null) { - callback.accept(p); - } } } } @@ -438,8 +432,9 @@ static class MyClassloader extends ClassLoader implements Closeable { public InputStream getResourceAsStream(String name) { InputStream stream = wrapped.getResourceAsStream(name); if ((null == stream) && name.startsWith("/")) { - return wrapped.getResourceAsStream(name.substring(1)); + stream = wrapped.getResourceAsStream(name.substring(1)); } + return stream; } diff --git a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java index 83a5c5aa5a2..b9786116926 100644 --- a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java +++ b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java @@ -16,32 +16,28 @@ package io.helidon.microprofile.arquillian; -import java.util.LinkedList; -import java.util.List; -import java.util.Set; import java.util.logging.Logger; import javax.enterprise.inject.se.SeContainer; import javax.enterprise.inject.spi.CDI; import javax.ws.rs.ApplicationPath; -import javax.ws.rs.Path; -import javax.ws.rs.core.Application; -import io.helidon.config.Config; import io.helidon.microprofile.server.Server; import io.helidon.microprofile.server.ServerCdiExtension; -import org.glassfish.jersey.server.ResourceConfig; +import org.eclipse.microprofile.config.Config; +import org.eclipse.microprofile.config.spi.ConfigProviderResolver; /** * Runner to start server using reflection (as we need to run in a different classloader). + * As we invoke this from a different classloader, the class must be public. */ -class ServerRunner { +public class ServerRunner { private static final Logger LOGGER = Logger.getLogger(ServerRunner.class.getName()); private Server server; - ServerRunner() { + public ServerRunner() { } private static String getContextRoot(Class application) { @@ -53,22 +49,25 @@ private static String getContextRoot(Class application) { return value.startsWith("/") ? value : "/" + value; } - void start(Config config, HelidonContainerConfiguration containerConfig, Set classNames, ClassLoader cl) { - Server.Builder builder = Server.builder() - .port(containerConfig.getPort()) - .config(config); + public void start(Config config, int port) { + // attempt a stop + stop(); + ConfigProviderResolver.instance() + .registerConfig(config, Thread.currentThread().getContextClassLoader()); - handleClasses(cl, classNames, builder, containerConfig.getAddResourcesToApps()); + server = Server.builder() + .port(port) + .config(config) + .build() + // this is a blocking operation, we will be released once the server is started + // or it fails to start + .start(); - server = builder.build(); - // this is a blocking operation, we will be released once the server is started - // or it fails to start - server.start(); LOGGER.finest(() -> "Started server"); } - void stop() { + public void stop() { if (null != server) { LOGGER.finest(() -> "Stopping server"); server.stop(); @@ -92,47 +91,4 @@ private static void stopCdiContainer() { //noop container is not running } } - - @SuppressWarnings("unchecked") - private void handleClasses(ClassLoader classLoader, - Set classNames, - Server.Builder builder, - boolean addResourcesToApps) { - - // first create classes end get all applications - List> applicationClasses = new LinkedList<>(); - List> resourceClasses = new LinkedList<>(); - - for (String className : classNames) { - try { - LOGGER.finest(() -> "Will attempt to add class: " + className); - final Class c = classLoader.loadClass(className); - if (Application.class.isAssignableFrom(c)) { - LOGGER.finest(() -> "Adding application class: " + c.getName()); - applicationClasses.add(c); - } else if (c.isAnnotationPresent(Path.class) && !c.isInterface()) { - LOGGER.finest(() -> "Adding resource class: " + c.getName()); - resourceClasses.add(c); - } else { - LOGGER.finest(() -> "Class " + c.getName() + " is neither annotated with Path nor an application."); - } - } catch (NoClassDefFoundError | ClassNotFoundException e) { - throw new HelidonArquillianException("Failed to load class to be added to server: " + className, e); - } - } - - // workaround for tck-jwt-auth - if (addResourcesToApps) { - for (Class aClass : applicationClasses) { - ResourceConfig resourceConfig = ResourceConfig.forApplicationClass((Class) aClass); - resourceClasses.forEach(resourceConfig::register); - builder.addApplication(getContextRoot(aClass), resourceConfig); - } - if (applicationClasses.isEmpty()) { - for (Class resourceClass : resourceClasses) { - builder.addResourceClass(resourceClass); - } - } - } - } } diff --git a/microprofile/tests/tck/tck-health/src/test/resources/tck-application.yaml b/microprofile/tests/tck/tck-health/src/test/resources/application.yaml similarity index 100% rename from microprofile/tests/tck/tck-health/src/test/resources/tck-application.yaml rename to microprofile/tests/tck/tck-health/src/test/resources/application.yaml diff --git a/microprofile/tests/tck/tck-jwt-auth/src/test/resources/application.yaml b/microprofile/tests/tck/tck-jwt-auth/src/test/resources/application.yaml new file mode 100644 index 00000000000..88d3ffb3851 --- /dev/null +++ b/microprofile/tests/tck/tck-jwt-auth/src/test/resources/application.yaml @@ -0,0 +1,4 @@ +# Configure this source as the least important one +config_ordinal: 0 +mp.jwt.verify.issuer: "https://server.example.com" +helidon.mp.jwt.verify.publickey.location: "/publicKey.pem" \ No newline at end of file diff --git a/microprofile/tests/tck/tck-jwt-auth/src/test/resources/arquillian.xml b/microprofile/tests/tck/tck-jwt-auth/src/test/resources/arquillian.xml index 85e4f16f094..be0905730f5 100644 --- a/microprofile/tests/tck/tck-jwt-auth/src/test/resources/arquillian.xml +++ b/microprofile/tests/tck/tck-jwt-auth/src/test/resources/arquillian.xml @@ -26,10 +26,4 @@ target/deployments 8080 - - - - true - - \ No newline at end of file diff --git a/microprofile/tests/tck/tck-messaging/src/test/resources/arquillian.xml b/microprofile/tests/tck/tck-messaging/src/test/resources/arquillian.xml index dd777b90178..e7e46418d50 100644 --- a/microprofile/tests/tck/tck-messaging/src/test/resources/arquillian.xml +++ b/microprofile/tests/tck/tck-messaging/src/test/resources/arquillian.xml @@ -18,13 +18,12 @@ --> target/deployments - -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y - + diff --git a/microprofile/tests/tck/tck-metrics/pom.xml b/microprofile/tests/tck/tck-metrics/pom.xml index 3caf6fbd653..54777b91442 100644 --- a/microprofile/tests/tck/tck-metrics/pom.xml +++ b/microprofile/tests/tck/tck-metrics/pom.xml @@ -49,26 +49,12 @@ org.eclipse.microprofile.metrics microprofile-metrics-rest-tck - ${version.lib.microprofile-metrics-api} test - - - org.jboss.arquillian.junit - arquillian-junit-container - - org.eclipse.microprofile.metrics microprofile-metrics-api-tck - ${version.lib.microprofile-metrics-api} test - - - org.jboss.arquillian.junit - arquillian-junit-container - - org.hamcrest diff --git a/microprofile/tests/tck/tck-opentracing/src/test/resources/tck-application.yaml b/microprofile/tests/tck/tck-opentracing/src/test/resources/application.yaml similarity index 100% rename from microprofile/tests/tck/tck-opentracing/src/test/resources/tck-application.yaml rename to microprofile/tests/tck/tck-opentracing/src/test/resources/application.yaml diff --git a/microprofile/tests/tck/tck-opentracing/src/test/resources/arquillian.xml b/microprofile/tests/tck/tck-opentracing/src/test/resources/arquillian.xml index 6c1253f8261..d5bf34f9c31 100644 --- a/microprofile/tests/tck/tck-opentracing/src/test/resources/arquillian.xml +++ b/microprofile/tests/tck/tck-opentracing/src/test/resources/arquillian.xml @@ -26,10 +26,4 @@ target/deployments 8080 - - - - true - - \ No newline at end of file diff --git a/microprofile/tests/tck/tck-rest-client/pom.xml b/microprofile/tests/tck/tck-rest-client/pom.xml index f8465a329f8..5f83aea1c34 100644 --- a/microprofile/tests/tck/tck-rest-client/pom.xml +++ b/microprofile/tests/tck/tck-rest-client/pom.xml @@ -34,13 +34,6 @@ helidon-arquillian ${project.version} test - - - - jakarta.json.bind - jakarta.json.bind-api - - org.eclipse.microprofile.rest.client diff --git a/microprofile/tests/tck/tck-rest-client/src/test/java/io/helidon/microprofile/restclient/tck/RestClientExtension.java b/microprofile/tests/tck/tck-rest-client/src/test/java/io/helidon/microprofile/restclient/tck/RestClientExtension.java new file mode 100644 index 00000000000..ce89fc491b3 --- /dev/null +++ b/microprofile/tests/tck/tck-rest-client/src/test/java/io/helidon/microprofile/restclient/tck/RestClientExtension.java @@ -0,0 +1,31 @@ +/* + * Copyright (c) 2018, 2020 Oracle and/or its affiliates. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.helidon.microprofile.restclient.tck; + +import org.jboss.arquillian.container.test.impl.enricher.resource.URLResourceProvider; +import org.jboss.arquillian.core.spi.LoadableExtension; +import org.jboss.arquillian.test.spi.enricher.resource.ResourceProvider; + +/** + * LoadableExtension that will load the HealthResourceProvider. + */ +public class RestClientExtension implements LoadableExtension { + @Override + public void register(ExtensionBuilder extensionBuilder) { + extensionBuilder.override(ResourceProvider.class, URLResourceProvider.class, UrlResourceProvider.class); + } +} diff --git a/microprofile/tests/tck/tck-rest-client/src/test/java/io/helidon/microprofile/restclient/tck/UrlResourceProvider.java b/microprofile/tests/tck/tck-rest-client/src/test/java/io/helidon/microprofile/restclient/tck/UrlResourceProvider.java new file mode 100644 index 00000000000..55e306aff5b --- /dev/null +++ b/microprofile/tests/tck/tck-rest-client/src/test/java/io/helidon/microprofile/restclient/tck/UrlResourceProvider.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.helidon.microprofile.restclient.tck; + +import java.lang.annotation.Annotation; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; + +import org.jboss.arquillian.test.api.ArquillianResource; +import org.jboss.arquillian.test.spi.enricher.resource.ResourceProvider; + +/** + * TCKs use addition when creating URL for a client. The default Arquillian implementation returns url without the trailing + * /. + */ +public class UrlResourceProvider implements ResourceProvider { + @Override + public Object lookup(ArquillianResource arquillianResource, Annotation... annotations) { + try { + return URI.create("http://localhost:8080/").toURL(); + } catch (MalformedURLException e) { + return null; + } + } + + @Override + public boolean canProvide(Class type) { + return URL.class.isAssignableFrom(type); + } +} diff --git a/microprofile/tests/tck/tck-rest-client/src/test/resources/arquillian.xml b/microprofile/tests/tck/tck-rest-client/src/test/resources/arquillian.xml index d37c6decc55..696fee786d4 100644 --- a/microprofile/tests/tck/tck-rest-client/src/test/resources/arquillian.xml +++ b/microprofile/tests/tck/tck-rest-client/src/test/resources/arquillian.xml @@ -27,8 +27,6 @@ - false - true false diff --git a/tests/integration/kafka/src/test/java/io/helidon/messaging/connectors/kafka/KafkaCdiExtensionTest.java b/tests/integration/kafka/src/test/java/io/helidon/messaging/connectors/kafka/KafkaCdiExtensionTest.java index ed9393d6c48..1108260e7c8 100644 --- a/tests/integration/kafka/src/test/java/io/helidon/messaging/connectors/kafka/KafkaCdiExtensionTest.java +++ b/tests/integration/kafka/src/test/java/io/helidon/messaging/connectors/kafka/KafkaCdiExtensionTest.java @@ -17,14 +17,6 @@ package io.helidon.messaging.connectors.kafka; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; - -import com.salesforce.kafka.test.junit5.SharedKafkaTestResource; - import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.Arrays; @@ -49,9 +41,11 @@ import io.helidon.config.Config; import io.helidon.config.ConfigSources; -import io.helidon.config.MpConfigProviderResolver; +import io.helidon.config.mp.MpConfigProviderResolver; +import io.helidon.config.mp.MpConfigSources; import io.helidon.microprofile.messaging.MessagingCdiExtension; +import com.salesforce.kafka.test.junit5.SharedKafkaTestResource; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.Producer; import org.apache.kafka.clients.producer.ProducerRecord; @@ -59,6 +53,7 @@ import org.apache.kafka.common.serialization.LongSerializer; import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; +import org.eclipse.microprofile.config.spi.ConfigProviderResolver; import org.eclipse.microprofile.reactive.messaging.spi.Connector; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; @@ -66,6 +61,12 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; + class KafkaCdiExtensionTest { private static final Logger LOGGER = Logger.getLogger(KafkaCdiExtensionTest.class.getName()); @@ -481,11 +482,13 @@ private Instance getInstance(Class beanType, Annotation annotation){ private SeContainer startCdiContainer(Map p, Set> beanClasses) { p.put("mp.initializer.allow", "true"); - Config config = Config.builder() - .sources(ConfigSources.create(p)) + org.eclipse.microprofile.config.Config config = ConfigProviderResolver.instance() + .getBuilder() + .withSources(MpConfigSources.create(p)) .build(); + MpConfigProviderResolver.instance() - .registerConfig((org.eclipse.microprofile.config.Config) config, + .registerConfig(config, Thread.currentThread().getContextClassLoader()); final SeContainerInitializer initializer = SeContainerInitializer.newInstance(); assertNotNull(initializer); diff --git a/microprofile/tests/tck/tck-jwt-auth/src/test/resources/tck-application.yaml b/tests/integration/security/gh1487/src/main/resources/logging.properties similarity index 58% rename from microprofile/tests/tck/tck-jwt-auth/src/test/resources/tck-application.yaml rename to tests/integration/security/gh1487/src/main/resources/logging.properties index 637a0afbc9e..9d84702edcc 100644 --- a/microprofile/tests/tck/tck-jwt-auth/src/test/resources/tck-application.yaml +++ b/tests/integration/security/gh1487/src/main/resources/logging.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2018 Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2020 Oracle and/or its affiliates. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,16 +14,10 @@ # limitations under the License. # -mp: - jwt: - verify: - issuer: "https://server.example.com" +# Send messages to the console +handlers=io.helidon.common.HelidonConsoleHandler -security: - providers: - - mp-jwt-auth: - atn-token: - # must use helidon specific configuration, as otherwise MP validation could fail if public key location is defined - # as well - verify-key: "/publicKey.pem" - - abac: \ No newline at end of file +# Global logging level. Can be overridden by specific loggers +.level=WARNING + +AUDIT.level=FINEST diff --git a/webserver/webserver/src/main/java/io/helidon/webserver/NettyWebServer.java b/webserver/webserver/src/main/java/io/helidon/webserver/NettyWebServer.java index 15739bb6d7d..5a19a50b266 100644 --- a/webserver/webserver/src/main/java/io/helidon/webserver/NettyWebServer.java +++ b/webserver/webserver/src/main/java/io/helidon/webserver/NettyWebServer.java @@ -16,6 +16,7 @@ package io.helidon.webserver; +import java.net.BindException; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.HashMap; @@ -214,8 +215,16 @@ public synchronized CompletionStage start() { if (!channelFuture.isSuccess()) { LOGGER.info(() -> "Channel '" + name + "' startup failed with message '" + channelFuture.cause().getMessage() + "'."); - channelsUpFuture.completeExceptionally(new IllegalStateException("Channel startup failed: " + name, + Throwable cause = channelFuture.cause(); + + String message = "Channel startup failed: " + name; + if (cause instanceof BindException) { + message = message + ", failed to listen on " + configuration.bindAddress() + ":" + port; + } + + channelsUpFuture.completeExceptionally(new IllegalStateException(message, channelFuture.cause())); + return; } @@ -274,7 +283,7 @@ public synchronized CompletionStage start() { private void started(WebServer server) { if (EXIT_ON_STARTED) { - LOGGER.info(String.format("Exiting, -D%s set.", EXIT_ON_STARTED_KEY)); + LOGGER.info(String.format("Exiting, -D%s set.", EXIT_ON_STARTED_KEY)); System.exit(0); } else { startFuture.complete(server); @@ -330,7 +339,7 @@ private CompletionStage shutdownThreadGroups() { } else { StringBuilder sb = new StringBuilder(); sb.append(workerFuture.cause() != null ? "Worker Group problem: " + workerFuture.cause().getMessage() : "") - .append(bossFuture.cause() != null ? "Boss Group problem: " + bossFuture.cause().getMessage() : ""); + .append(bossFuture.cause() != null ? "Boss Group problem: " + bossFuture.cause().getMessage() : ""); threadGroupsShutdownFuture .completeExceptionally(new IllegalStateException("Unable to shutdown Netty thread groups: " + sb)); } From 9bb22d526254dc2ed2686947eae8e93f8da15757 Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Mon, 4 May 2020 18:19:40 +0200 Subject: [PATCH 04/12] Checkstyle fixes. Signed-off-by: Tomas Langer --- .../java/io/helidon/config/mp/MpConfig.java | 5 +- .../io/helidon/config/mp/MpConfigImpl.java | 4 +- .../io/helidon/config/mp/MpConfigSources.java | 5 +- .../io/helidon/config/mp/MpHelidonSource.java | 5 +- .../config/yaml/YamlMpConfigSource.java | 1 - examples/todo-app/frontend/package-lock.json | 2901 +++++++++-------- .../microprofile/arquillian/ServerRunner.java | 9 + 7 files changed, 1483 insertions(+), 1447 deletions(-) diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfig.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfig.java index 99477b7da1c..8b6fb7f9d4b 100644 --- a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfig.java +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfig.java @@ -27,7 +27,10 @@ /** * Utilities for Helidon MicroProfile Config implementation. */ -public class MpConfig { +public final class MpConfig { + private MpConfig() { + } + /** * This method allows use to use Helidon Config on top of an MP config. * There is a limitation - the converters configured with MP config will not be available, unless diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java index 33b341249f9..ac55c0c65e2 100644 --- a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java @@ -165,8 +165,8 @@ public Iterable getConfigSources() { /** * Return the {@link Converter} used by this instance to produce instances of the specified type from string values. * - * This method is from a future version of MP Config specification and may changed before it - * is released. It is nevertheless needed to process annotations with default values. + * This method is from a future version of MP Config specification and may changed before it + * is released. It is nevertheless needed to process annotations with default values. * * @param the conversion type * @param forType the type to be produced by the converter diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigSources.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigSources.java index f31db2a8306..c0c6a3b2fb6 100644 --- a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigSources.java +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigSources.java @@ -55,7 +55,10 @@ *
  • {@link #create(io.helidon.config.Config)} - create a MicroProfile config source from Helidon SE Config instance
  • * */ -public class MpConfigSources { +public final class MpConfigSources { + private MpConfigSources() { + } + /** * In memory config source based on the provided map. * The config source queries the map each time {@link org.eclipse.microprofile.config.spi.ConfigSource#getValue(String)} diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonSource.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonSource.java index 95f9227c211..0f1ea6cb5e4 100644 --- a/config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonSource.java +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpHelidonSource.java @@ -34,7 +34,10 @@ import org.eclipse.microprofile.config.spi.ConfigSource; -class MpHelidonSource { +final class MpHelidonSource { + private MpHelidonSource() { + } + static ConfigSource create(io.helidon.config.spi.ConfigSource source) { source.init(it -> { throw new UnsupportedOperationException( diff --git a/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java b/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java index ebca6417521..a08b3a50507 100644 --- a/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java +++ b/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java @@ -65,7 +65,6 @@ * names.1=second * names.2=third * - * */ public class YamlMpConfigSource implements ConfigSource { private final Map properties; diff --git a/examples/todo-app/frontend/package-lock.json b/examples/todo-app/frontend/package-lock.json index 8bcc0076441..ee392fc651c 100644 --- a/examples/todo-app/frontend/package-lock.json +++ b/examples/todo-app/frontend/package-lock.json @@ -20,7 +20,7 @@ "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "dev": true, "requires": { - "acorn": "4.0.13" + "acorn": "^4.0.3" }, "dependencies": { "acorn": { @@ -37,10 +37,10 @@ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ajv-keywords": { @@ -55,9 +55,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "alphanum-sort": { @@ -84,8 +84,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "3.1.10", - "normalize-path": "2.1.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" }, "dependencies": { "normalize-path": { @@ -94,7 +94,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } } } @@ -111,7 +111,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -144,9 +144,9 @@ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "assert": { @@ -155,7 +155,7 @@ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { - "object-assign": "4.1.1", + "object-assign": "^4.1.1", "util": "0.10.3" }, "dependencies": { @@ -194,7 +194,7 @@ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "lodash": "4.17.15" + "lodash": "^4.17.14" } }, "async-each": { @@ -215,12 +215,12 @@ "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000992", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "browserslist": "^1.7.6", + "caniuse-db": "^1.0.30000634", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^5.2.16", + "postcss-value-parser": "^3.2.3" } }, "babel-code-frame": { @@ -229,9 +229,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.3", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "balanced-match": { @@ -246,13 +246,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "1.0.1", - "class-utils": "0.3.6", - "component-emitter": "1.3.0", - "define-property": "1.0.0", - "isobject": "3.0.1", - "mixin-deep": "1.3.2", - "pascalcase": "0.1.1" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { "define-property": { @@ -261,7 +261,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -270,7 +270,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -279,7 +279,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -288,9 +288,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -343,7 +343,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" }, "dependencies": { @@ -361,16 +361,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "1.1.0", - "array-unique": "0.3.2", - "extend-shallow": "2.0.1", - "fill-range": "4.0.0", - "isobject": "3.0.1", - "repeat-element": "1.1.3", - "snapdragon": "0.8.2", - "snapdragon-node": "2.1.1", - "split-string": "3.1.0", - "to-regex": "3.0.2" + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -379,7 +379,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -396,12 +396,12 @@ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { @@ -410,9 +410,9 @@ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.2.0", - "browserify-des": "1.0.2", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { @@ -421,10 +421,10 @@ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { @@ -433,8 +433,8 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.1.0" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -443,13 +443,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "elliptic": "6.5.1", - "inherits": "2.0.4", - "parse-asn1": "5.1.4" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -458,7 +458,7 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.10" + "pako": "~1.0.5" } }, "browserslist": { @@ -467,8 +467,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "1.0.30000992", - "electron-to-chromium": "1.3.252" + "caniuse-db": "^1.0.30000639", + "electron-to-chromium": "^1.2.7" } }, "buffer": { @@ -477,9 +477,9 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "1.3.1", - "ieee754": "1.1.13", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, "buffer-from": { @@ -506,19 +506,19 @@ "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "dev": true, "requires": { - "bluebird": "3.5.5", - "chownr": "1.1.2", - "glob": "7.1.4", - "graceful-fs": "4.2.2", - "lru-cache": "4.1.5", - "mississippi": "2.0.0", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.7.1", - "ssri": "5.3.0", - "unique-filename": "1.1.1", - "y18n": "4.0.0" + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.1", + "mississippi": "^2.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^5.2.4", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" } }, "cache-base": { @@ -527,15 +527,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "1.0.0", - "component-emitter": "1.3.0", - "get-value": "2.0.6", - "has-value": "1.0.0", - "isobject": "3.0.1", - "set-value": "2.0.1", - "to-object-path": "0.3.0", - "union-value": "1.0.1", - "unset-value": "1.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, "caller-callsite": { @@ -544,7 +544,7 @@ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { - "callsites": "2.0.0" + "callsites": "^2.0.0" } }, "caller-path": { @@ -553,7 +553,7 @@ "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, "requires": { - "caller-callsite": "2.0.0" + "caller-callsite": "^2.0.0" } }, "callsites": { @@ -568,8 +568,8 @@ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "dev": true, "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, "camelcase": { @@ -584,10 +584,10 @@ "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000992", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "browserslist": "^1.3.6", + "caniuse-db": "^1.0.30000529", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, "caniuse-db": { @@ -608,8 +608,8 @@ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -618,11 +618,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "chokidar": { @@ -631,18 +631,18 @@ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { - "anymatch": "2.0.0", - "async-each": "1.0.3", - "braces": "2.3.2", - "fsevents": "1.2.9", - "glob-parent": "3.1.0", - "inherits": "2.0.4", - "is-binary-path": "1.0.1", - "is-glob": "4.0.1", - "normalize-path": "3.0.0", - "path-is-absolute": "1.0.1", - "readdirp": "2.2.1", - "upath": "1.2.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" } }, "chownr": { @@ -657,8 +657,8 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "clap": { @@ -667,7 +667,7 @@ "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.1.3" } }, "class-utils": { @@ -676,10 +676,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "define-property": "0.2.5", - "isobject": "3.0.1", - "static-extend": "0.1.2" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { "define-property": { @@ -688,7 +688,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -699,7 +699,7 @@ "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "dev": true, "requires": { - "source-map": "0.6.1" + "source-map": "~0.6.0" }, "dependencies": { "source-map": { @@ -716,8 +716,8 @@ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" } }, @@ -739,7 +739,7 @@ "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "dev": true, "requires": { - "q": "1.5.1" + "q": "^1.1.2" } }, "code-point-at": { @@ -754,8 +754,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "1.0.0", - "object-visit": "1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, "color": { @@ -764,9 +764,9 @@ "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "dev": true, "requires": { - "clone": "1.0.4", - "color-convert": "1.9.3", - "color-string": "0.3.0" + "clone": "^1.0.2", + "color-convert": "^1.3.0", + "color-string": "^0.3.0" } }, "color-convert": { @@ -790,7 +790,7 @@ "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.0.0" } }, "colormin": { @@ -799,9 +799,9 @@ "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "dev": true, "requires": { - "color": "0.11.4", + "color": "^0.11.0", "css-color-names": "0.0.4", - "has": "1.0.3" + "has": "^1.0.1" } }, "colors": { @@ -840,10 +840,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "1.1.1", - "inherits": "2.0.4", - "readable-stream": "2.3.6", - "typedarray": "0.0.6" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { "readable-stream": { @@ -852,13 +852,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -873,7 +873,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -884,7 +884,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "0.1.4" + "date-now": "^0.1.4" } }, "constants-browserify": { @@ -899,12 +899,12 @@ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.7.1", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, "copy-descriptor": { @@ -925,10 +925,10 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "import-fresh": "2.0.0", - "is-directory": "0.3.1", - "js-yaml": "3.13.1", - "parse-json": "4.0.0" + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" }, "dependencies": { "esprima": { @@ -943,8 +943,8 @@ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } } } @@ -955,8 +955,8 @@ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.5.1" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { @@ -965,11 +965,11 @@ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.4", - "md5.js": "1.3.5", - "ripemd160": "2.0.2", - "sha.js": "2.4.11" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { @@ -978,12 +978,12 @@ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.2.0", - "inherits": "2.0.4", - "ripemd160": "2.0.2", - "safe-buffer": "5.2.0", - "sha.js": "2.4.11" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-spawn": { @@ -992,9 +992,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.5", - "shebang-command": "1.2.0", - "which": "1.3.1" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "crypto-browserify": { @@ -1003,17 +1003,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "1.0.1", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.3", - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "diffie-hellman": "5.0.3", - "inherits": "2.0.4", - "pbkdf2": "3.0.17", - "public-encrypt": "4.0.3", - "randombytes": "2.1.0", - "randomfill": "1.0.4" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, "css-color-names": { @@ -1028,8 +1028,8 @@ "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "dev": true, "requires": { - "postcss": "7.0.18", - "timsort": "0.3.0" + "postcss": "^7.0.1", + "timsort": "^0.3.0" }, "dependencies": { "ansi-styles": { @@ -1038,7 +1038,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -1047,9 +1047,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -1058,7 +1058,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -1075,9 +1075,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -1092,7 +1092,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -1103,20 +1103,20 @@ "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.1", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.2.3", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.2.1", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.1", - "source-list-map": "2.0.1" + "babel-code-frame": "^6.26.0", + "css-selector-tokenizer": "^0.7.0", + "cssnano": "^3.10.0", + "icss-utils": "^2.1.0", + "loader-utils": "^1.0.2", + "lodash.camelcase": "^4.3.0", + "object-assign": "^4.1.1", + "postcss": "^5.0.6", + "postcss-modules-extract-imports": "^1.2.0", + "postcss-modules-local-by-default": "^1.2.0", + "postcss-modules-scope": "^1.1.0", + "postcss-modules-values": "^1.3.0", + "postcss-value-parser": "^3.3.0", + "source-list-map": "^2.0.0" } }, "css-select": { @@ -1125,10 +1125,10 @@ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "dev": true, "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.3", + "boolbase": "~1.0.0", + "css-what": "2.1", "domutils": "1.5.1", - "nth-check": "1.0.2" + "nth-check": "~1.0.1" } }, "css-select-base-adapter": { @@ -1143,9 +1143,9 @@ "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", "dev": true, "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.2", - "regexpu-core": "1.0.0" + "cssesc": "^0.1.0", + "fastparse": "^1.1.1", + "regexpu-core": "^1.0.0" } }, "css-tree": { @@ -1155,7 +1155,7 @@ "dev": true, "requires": { "mdn-data": "2.0.4", - "source-map": "0.5.7" + "source-map": "^0.5.3" } }, "css-unit-converter": { @@ -1182,38 +1182,38 @@ "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "dev": true, "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.3", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.3", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.1", - "postcss-zindex": "2.2.0" + "autoprefixer": "^6.3.1", + "decamelize": "^1.1.2", + "defined": "^1.0.0", + "has": "^1.0.1", + "object-assign": "^4.0.1", + "postcss": "^5.0.14", + "postcss-calc": "^5.2.0", + "postcss-colormin": "^2.1.8", + "postcss-convert-values": "^2.3.4", + "postcss-discard-comments": "^2.0.4", + "postcss-discard-duplicates": "^2.0.1", + "postcss-discard-empty": "^2.0.1", + "postcss-discard-overridden": "^0.1.1", + "postcss-discard-unused": "^2.2.1", + "postcss-filter-plugins": "^2.0.0", + "postcss-merge-idents": "^2.1.5", + "postcss-merge-longhand": "^2.0.1", + "postcss-merge-rules": "^2.0.3", + "postcss-minify-font-values": "^1.0.2", + "postcss-minify-gradients": "^1.0.1", + "postcss-minify-params": "^1.0.4", + "postcss-minify-selectors": "^2.0.4", + "postcss-normalize-charset": "^1.1.0", + "postcss-normalize-url": "^3.0.7", + "postcss-ordered-values": "^2.1.0", + "postcss-reduce-idents": "^2.2.2", + "postcss-reduce-initial": "^1.0.0", + "postcss-reduce-transforms": "^1.0.3", + "postcss-svgo": "^2.1.1", + "postcss-unique-selectors": "^2.0.2", + "postcss-value-parser": "^3.2.3", + "postcss-zindex": "^2.0.1" } }, "cssnano-preset-default": { @@ -1222,36 +1222,36 @@ "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", "dev": true, "requires": { - "css-declaration-sorter": "4.0.1", - "cssnano-util-raw-cache": "4.0.1", - "postcss": "7.0.18", - "postcss-calc": "7.0.1", - "postcss-colormin": "4.0.3", - "postcss-convert-values": "4.0.1", - "postcss-discard-comments": "4.0.2", - "postcss-discard-duplicates": "4.0.2", - "postcss-discard-empty": "4.0.1", - "postcss-discard-overridden": "4.0.1", - "postcss-merge-longhand": "4.0.11", - "postcss-merge-rules": "4.0.3", - "postcss-minify-font-values": "4.0.2", - "postcss-minify-gradients": "4.0.2", - "postcss-minify-params": "4.0.2", - "postcss-minify-selectors": "4.0.2", - "postcss-normalize-charset": "4.0.1", - "postcss-normalize-display-values": "4.0.2", - "postcss-normalize-positions": "4.0.2", - "postcss-normalize-repeat-style": "4.0.2", - "postcss-normalize-string": "4.0.2", - "postcss-normalize-timing-functions": "4.0.2", - "postcss-normalize-unicode": "4.0.1", - "postcss-normalize-url": "4.0.1", - "postcss-normalize-whitespace": "4.0.2", - "postcss-ordered-values": "4.1.2", - "postcss-reduce-initial": "4.0.3", - "postcss-reduce-transforms": "4.0.2", - "postcss-svgo": "4.0.2", - "postcss-unique-selectors": "4.0.1" + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" }, "dependencies": { "ansi-styles": { @@ -1260,7 +1260,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "browserslist": { @@ -1269,9 +1269,9 @@ "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000989", - "electron-to-chromium": "1.3.252", - "node-releases": "1.1.29" + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" } }, "caniuse-api": { @@ -1280,10 +1280,10 @@ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "requires": { - "browserslist": "4.7.0", - "caniuse-lite": "1.0.30000989", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, "chalk": { @@ -1292,9 +1292,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -1303,7 +1303,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -1314,9 +1314,9 @@ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, "requires": { - "@types/q": "1.5.2", - "chalk": "2.4.2", - "q": "1.5.1" + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" } }, "color": { @@ -1325,8 +1325,8 @@ "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "dev": true, "requires": { - "color-convert": "1.9.3", - "color-string": "1.5.3" + "color-convert": "^1.9.1", + "color-string": "^1.5.2" } }, "color-string": { @@ -1335,8 +1335,8 @@ "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", "dev": true, "requires": { - "color-name": "1.1.3", - "simple-swizzle": "0.2.2" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, "css-select": { @@ -1345,10 +1345,10 @@ "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", "dev": true, "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.3", - "domutils": "1.7.0", - "nth-check": "1.0.2" + "boolbase": "^1.0.0", + "css-what": "^2.1.2", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, "cssesc": { @@ -1372,8 +1372,8 @@ "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", "dev": true, "requires": { - "mdn-data": "1.1.4", - "source-map": "0.5.7" + "mdn-data": "~1.1.0", + "source-map": "^0.5.3" } }, "source-map": { @@ -1390,8 +1390,8 @@ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { - "dom-serializer": "0.2.1", - "domelementtype": "1.3.1" + "dom-serializer": "0", + "domelementtype": "1" } }, "esprima": { @@ -1412,7 +1412,7 @@ "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", "dev": true, "requires": { - "html-comment-regex": "1.1.2" + "html-comment-regex": "^1.1.0" } }, "js-yaml": { @@ -1421,8 +1421,8 @@ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "4.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "mdn-data": { @@ -1443,9 +1443,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "postcss-calc": { @@ -1454,10 +1454,10 @@ "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", "dev": true, "requires": { - "css-unit-converter": "1.1.1", - "postcss": "7.0.18", - "postcss-selector-parser": "5.0.0", - "postcss-value-parser": "3.3.1" + "css-unit-converter": "^1.1.1", + "postcss": "^7.0.5", + "postcss-selector-parser": "^5.0.0-rc.4", + "postcss-value-parser": "^3.3.1" } }, "postcss-colormin": { @@ -1466,11 +1466,11 @@ "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dev": true, "requires": { - "browserslist": "4.7.0", - "color": "3.1.2", - "has": "1.0.3", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-convert-values": { @@ -1479,8 +1479,8 @@ "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "dev": true, "requires": { - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-discard-comments": { @@ -1489,7 +1489,7 @@ "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" } }, "postcss-discard-duplicates": { @@ -1498,7 +1498,7 @@ "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" } }, "postcss-discard-empty": { @@ -1507,7 +1507,7 @@ "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" } }, "postcss-discard-overridden": { @@ -1516,7 +1516,7 @@ "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" } }, "postcss-merge-longhand": { @@ -1526,9 +1526,9 @@ "dev": true, "requires": { "css-color-names": "0.0.4", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1", - "stylehacks": "4.0.3" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" } }, "postcss-merge-rules": { @@ -1537,12 +1537,12 @@ "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "dev": true, "requires": { - "browserslist": "4.7.0", - "caniuse-api": "3.0.0", - "cssnano-util-same-parent": "4.0.1", - "postcss": "7.0.18", - "postcss-selector-parser": "3.1.1", - "vendors": "1.0.3" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" }, "dependencies": { "postcss-selector-parser": { @@ -1551,9 +1551,9 @@ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "dev": true, "requires": { - "dot-prop": "4.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } @@ -1564,8 +1564,8 @@ "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "requires": { - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-minify-gradients": { @@ -1574,10 +1574,10 @@ "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, "requires": { - "cssnano-util-get-arguments": "4.0.0", - "is-color-stop": "1.1.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-minify-params": { @@ -1586,12 +1586,12 @@ "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "browserslist": "4.7.0", - "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" } }, "postcss-minify-selectors": { @@ -1600,10 +1600,10 @@ "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.3", - "postcss": "7.0.18", - "postcss-selector-parser": "3.1.1" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { "postcss-selector-parser": { @@ -1612,9 +1612,9 @@ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "dev": true, "requires": { - "dot-prop": "4.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } @@ -1625,7 +1625,7 @@ "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" } }, "postcss-normalize-url": { @@ -1634,10 +1634,10 @@ "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "dev": true, "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "3.3.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-ordered-values": { @@ -1646,9 +1646,9 @@ "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "dev": true, "requires": { - "cssnano-util-get-arguments": "4.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-reduce-initial": { @@ -1657,10 +1657,10 @@ "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "dev": true, "requires": { - "browserslist": "4.7.0", - "caniuse-api": "3.0.0", - "has": "1.0.3", - "postcss": "7.0.18" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" } }, "postcss-reduce-transforms": { @@ -1669,10 +1669,10 @@ "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "dev": true, "requires": { - "cssnano-util-get-match": "4.0.0", - "has": "1.0.3", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" } }, "postcss-selector-parser": { @@ -1681,9 +1681,9 @@ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "cssesc": "2.0.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-svgo": { @@ -1692,10 +1692,10 @@ "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "dev": true, "requires": { - "is-svg": "3.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1", - "svgo": "1.3.0" + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" } }, "postcss-unique-selectors": { @@ -1704,9 +1704,9 @@ "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "postcss": "7.0.18", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" } }, "source-map": { @@ -1721,7 +1721,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } }, "svgo": { @@ -1730,19 +1730,19 @@ "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", "dev": true, "requires": { - "chalk": "2.4.2", - "coa": "2.0.2", - "css-select": "2.0.2", - "css-select-base-adapter": "0.1.1", + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", "css-tree": "1.0.0-alpha.33", - "csso": "3.5.1", - "js-yaml": "3.13.1", - "mkdirp": "0.5.1", - "object.values": "1.1.0", - "sax": "1.2.4", - "stable": "0.1.8", - "unquote": "1.1.1", - "util.promisify": "1.0.0" + "csso": "^3.5.1", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" } } } @@ -1765,7 +1765,7 @@ "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "dev": true, "requires": { - "postcss": "7.0.18" + "postcss": "^7.0.0" }, "dependencies": { "ansi-styles": { @@ -1774,7 +1774,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -1783,9 +1783,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -1794,7 +1794,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -1811,9 +1811,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -1828,7 +1828,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -1845,8 +1845,8 @@ "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "dev": true, "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" + "clap": "^1.0.9", + "source-map": "^0.5.3" } }, "cyclist": { @@ -1861,8 +1861,8 @@ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { - "es5-ext": "0.10.51", - "type": "1.0.3" + "es5-ext": "^0.10.50", + "type": "^1.0.1" } }, "date-now": { @@ -1898,7 +1898,7 @@ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "object-keys": "1.1.1" + "object-keys": "^1.0.12" } }, "define-property": { @@ -1907,8 +1907,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "1.0.2", - "isobject": "3.0.1" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1917,7 +1917,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -1926,7 +1926,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -1935,9 +1935,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -1960,8 +1960,8 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "diffie-hellman": { @@ -1970,9 +1970,9 @@ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.1.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "dom-converter": { @@ -1981,7 +1981,7 @@ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "requires": { - "utila": "0.4.0" + "utila": "~0.4" } }, "dom-serializer": { @@ -1990,8 +1990,8 @@ "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", "dev": true, "requires": { - "domelementtype": "2.0.1", - "entities": "2.0.0" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" }, "dependencies": { "domelementtype": { @@ -2020,7 +2020,7 @@ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { - "domelementtype": "1.3.1" + "domelementtype": "1" } }, "domutils": { @@ -2029,8 +2029,8 @@ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "dom-serializer": "0.2.1", - "domelementtype": "1.3.1" + "dom-serializer": "0", + "domelementtype": "1" } }, "dot-prop": { @@ -2039,7 +2039,7 @@ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "duplexify": { @@ -2048,10 +2048,10 @@ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.4", - "readable-stream": "2.3.6", - "stream-shift": "1.0.0" + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" }, "dependencies": { "readable-stream": { @@ -2060,13 +2060,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -2081,7 +2081,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -2098,13 +2098,13 @@ "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.7", - "hmac-drbg": "1.0.1", - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, "emojis-list": { @@ -2119,7 +2119,7 @@ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "enhanced-resolve": { @@ -2128,10 +2128,10 @@ "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.9" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "object-assign": "^4.0.1", + "tapable": "^0.2.7" }, "dependencies": { "tapable": { @@ -2154,7 +2154,7 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "1.0.1" + "prr": "~1.0.1" } }, "error-ex": { @@ -2163,7 +2163,7 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "es-abstract": { @@ -2172,16 +2172,16 @@ "integrity": "sha512-cp/Tb1oA/rh2X7vqeSOvM+TSo3UkJLX70eNihgVEvnzwAgikjkTFr/QVgRCaxjm0knCNQzNoxxxcw2zO2LJdZA==", "dev": true, "requires": { - "es-to-primitive": "1.2.0", - "function-bind": "1.1.1", - "has": "1.0.3", - "has-symbols": "1.0.0", - "is-callable": "1.1.4", - "is-regex": "1.0.4", - "object-inspect": "1.6.0", - "object-keys": "1.1.1", - "string.prototype.trimleft": "2.0.0", - "string.prototype.trimright": "2.0.0" + "es-to-primitive": "^1.2.0", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.0", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-inspect": "^1.6.0", + "object-keys": "^1.1.1", + "string.prototype.trimleft": "^2.0.0", + "string.prototype.trimright": "^2.0.0" } }, "es-to-primitive": { @@ -2190,9 +2190,9 @@ "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { - "is-callable": "1.1.4", - "is-date-object": "1.0.1", - "is-symbol": "1.0.2" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, "es5-ext": { @@ -2201,9 +2201,9 @@ "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.2", - "next-tick": "1.0.0" + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.1", + "next-tick": "^1.0.0" } }, "es6-iterator": { @@ -2212,9 +2212,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51", - "es6-symbol": "3.1.2" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -2223,12 +2223,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.2", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-set": { @@ -2237,11 +2237,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" }, "dependencies": { "es6-symbol": { @@ -2250,8 +2250,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51" + "d": "1", + "es5-ext": "~0.10.14" } } } @@ -2262,8 +2262,8 @@ "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51" + "d": "^1.0.1", + "es5-ext": "^0.10.51" } }, "es6-templates": { @@ -2272,8 +2272,8 @@ "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", "dev": true, "requires": { - "recast": "0.11.23", - "through": "2.3.8" + "recast": "~0.11.12", + "through": "~2.3.6" } }, "es6-weak-map": { @@ -2282,10 +2282,10 @@ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.2" + "d": "1", + "es5-ext": "^0.10.46", + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.1" } }, "escape-string-regexp": { @@ -2300,10 +2300,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.3", - "esrecurse": "4.2.1", - "estraverse": "4.3.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "esprima": { @@ -2318,7 +2318,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.3.0" + "estraverse": "^4.1.0" } }, "estraverse": { @@ -2339,8 +2339,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.1", - "es5-ext": "0.10.51" + "d": "1", + "es5-ext": "~0.10.14" } }, "events": { @@ -2355,8 +2355,8 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "1.3.5", - "safe-buffer": "5.2.0" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { @@ -2365,13 +2365,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "expand-brackets": { @@ -2380,13 +2380,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "posix-character-classes": "0.1.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -2395,7 +2395,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -2404,7 +2404,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -2415,8 +2415,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "1.0.0", - "is-extendable": "1.0.1" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -2425,7 +2425,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -2436,14 +2436,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "0.3.2", - "define-property": "1.0.0", - "expand-brackets": "2.1.4", - "extend-shallow": "2.0.1", - "fragment-cache": "0.2.1", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "define-property": { @@ -2452,7 +2452,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "extend-shallow": { @@ -2461,7 +2461,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } }, "is-accessor-descriptor": { @@ -2470,7 +2470,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -2479,7 +2479,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -2488,9 +2488,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -2507,10 +2507,10 @@ "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "dev": true, "requires": { - "async": "2.6.3", - "loader-utils": "1.2.3", - "schema-utils": "0.3.0", - "webpack-sources": "1.4.3" + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.3.0", + "webpack-sources": "^1.0.1" } }, "fast-deep-equal": { @@ -2537,10 +2537,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-number": "3.0.0", - "repeat-string": "1.6.1", - "to-regex-range": "2.1.1" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" }, "dependencies": { "extend-shallow": { @@ -2549,7 +2549,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -2560,9 +2560,9 @@ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "1.3.0", - "pkg-dir": "2.0.0" + "commondir": "^1.0.1", + "make-dir": "^1.0.0", + "pkg-dir": "^2.0.0" } }, "find-up": { @@ -2571,7 +2571,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "flatten": { @@ -2586,8 +2586,8 @@ "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.6" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" }, "dependencies": { "readable-stream": { @@ -2596,13 +2596,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -2617,7 +2617,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -2634,7 +2634,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "0.2.2" + "map-cache": "^0.2.2" } }, "from2": { @@ -2643,8 +2643,8 @@ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.6" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" }, "dependencies": { "readable-stream": { @@ -2653,13 +2653,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -2674,7 +2674,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -2685,10 +2685,10 @@ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" }, "dependencies": { "readable-stream": { @@ -2697,13 +2697,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -2718,7 +2718,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -2736,8 +2736,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.14.0", - "node-pre-gyp": "0.12.0" + "nan": "^2.12.1", + "node-pre-gyp": "^0.12.0" }, "dependencies": { "abbrev": { @@ -2749,7 +2749,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -2763,21 +2764,23 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.6" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -2790,17 +2793,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -2814,7 +2820,7 @@ "dev": true, "optional": true, "requires": { - "ms": "2.1.1" + "ms": "^2.1.1" } }, "deep-extend": { @@ -2841,7 +2847,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.3.5" + "minipass": "^2.2.1" } }, "fs.realpath": { @@ -2856,14 +2862,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.3" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { @@ -2872,12 +2878,12 @@ "dev": true, "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "has-unicode": { @@ -2892,7 +2898,7 @@ "dev": true, "optional": true, "requires": { - "safer-buffer": "2.1.2" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -2901,7 +2907,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "3.0.4" + "minimatch": "^3.0.4" } }, "inflight": { @@ -2910,14 +2916,15 @@ "dev": true, "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -2929,8 +2936,9 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "isarray": { @@ -2943,22 +2951,25 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.1.2", - "yallist": "3.0.3" + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" } }, "minizlib": { @@ -2967,13 +2978,14 @@ "dev": true, "optional": true, "requires": { - "minipass": "2.3.5" + "minipass": "^2.2.1" } }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2990,9 +3002,9 @@ "dev": true, "optional": true, "requires": { - "debug": "4.1.1", - "iconv-lite": "0.4.24", - "sax": "1.2.4" + "debug": "^4.1.0", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, "node-pre-gyp": { @@ -3001,16 +3013,16 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.3", - "mkdirp": "0.5.1", - "needle": "2.3.0", - "nopt": "4.0.1", - "npm-packlist": "1.4.1", - "npmlog": "4.1.2", - "rc": "1.2.8", - "rimraf": "2.6.3", - "semver": "5.7.0", - "tar": "4.4.8" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" } }, "nopt": { @@ -3019,8 +3031,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.5" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npm-bundled": { @@ -3035,8 +3047,8 @@ "dev": true, "optional": true, "requires": { - "ignore-walk": "3.0.1", - "npm-bundled": "1.0.6" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" } }, "npmlog": { @@ -3045,16 +3057,17 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.5", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -3066,8 +3079,9 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -3088,8 +3102,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { @@ -3110,10 +3124,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.6.0", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -3130,13 +3144,13 @@ "dev": true, "optional": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "2.0.0", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "rimraf": { @@ -3145,13 +3159,14 @@ "dev": true, "optional": true, "requires": { - "glob": "7.1.3" + "glob": "^7.1.3" } }, "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -3187,10 +3202,11 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -3199,15 +3215,16 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } }, "strip-ansi": { "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -3222,13 +3239,13 @@ "dev": true, "optional": true, "requires": { - "chownr": "1.1.1", - "fs-minipass": "1.2.5", - "minipass": "2.3.5", - "minizlib": "1.2.1", - "mkdirp": "0.5.1", - "safe-buffer": "5.1.2", - "yallist": "3.0.3" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" } }, "util-deprecate": { @@ -3243,18 +3260,20 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, @@ -3288,12 +3307,12 @@ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.4", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-parent": { @@ -3302,8 +3321,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "3.1.0", - "path-dirname": "1.0.2" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { "is-glob": { @@ -3312,7 +3331,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.0" } } } @@ -3329,7 +3348,7 @@ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -3338,7 +3357,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -3359,9 +3378,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "1.0.0", - "isobject": "3.0.1" + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" } }, "has-values": { @@ -3370,8 +3389,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "kind-of": { @@ -3380,7 +3399,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -3391,8 +3410,8 @@ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "hash.js": { @@ -3401,8 +3420,8 @@ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { - "inherits": "2.0.4", - "minimalistic-assert": "1.0.1" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, "he": { @@ -3423,9 +3442,9 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.7", - "minimalistic-assert": "1.0.1", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, "hosted-git-info": { @@ -3458,11 +3477,11 @@ "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", "dev": true, "requires": { - "es6-templates": "0.2.3", - "fastparse": "1.1.2", - "html-minifier": "3.5.21", - "loader-utils": "1.2.3", - "object-assign": "4.1.1" + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" } }, "html-minifier": { @@ -3471,13 +3490,13 @@ "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", "dev": true, "requires": { - "camel-case": "3.0.0", - "clean-css": "4.2.1", - "commander": "2.17.1", - "he": "1.2.0", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.4.10" + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" } }, "html-webpack-plugin": { @@ -3486,12 +3505,12 @@ "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", "dev": true, "requires": { - "html-minifier": "3.5.21", - "loader-utils": "0.2.17", - "lodash": "4.17.15", - "pretty-error": "2.1.1", - "tapable": "1.1.3", - "toposort": "1.0.7", + "html-minifier": "^3.2.3", + "loader-utils": "^0.2.16", + "lodash": "^4.17.3", + "pretty-error": "^2.0.2", + "tapable": "^1.0.0", + "toposort": "^1.0.0", "util.promisify": "1.0.0" }, "dependencies": { @@ -3513,10 +3532,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "big.js": "^3.1.3", + "emojis-list": "^2.0.0", + "json5": "^0.5.0", + "object-assign": "^4.0.1" } } } @@ -3527,12 +3546,12 @@ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { - "domelementtype": "1.3.1", - "domhandler": "2.4.2", - "domutils": "1.5.1", - "entities": "1.1.2", - "inherits": "2.0.4", - "readable-stream": "3.4.0" + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" }, "dependencies": { "entities": { @@ -3561,7 +3580,7 @@ "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "dev": true, "requires": { - "postcss": "6.0.23" + "postcss": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -3570,7 +3589,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -3579,9 +3598,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -3596,9 +3615,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "source-map": { @@ -3613,7 +3632,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -3636,8 +3655,8 @@ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "requires": { - "caller-path": "2.0.0", - "resolve-from": "3.0.0" + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" } }, "imurmurhash": { @@ -3658,8 +3677,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3692,7 +3711,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-arrayish": { @@ -3707,7 +3726,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.13.1" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -3728,12 +3747,12 @@ "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", "dev": true, "requires": { - "css-color-names": "0.0.4", - "hex-color-regex": "1.1.0", - "hsl-regex": "1.0.0", - "hsla-regex": "1.0.0", - "rgb-regex": "1.0.1", - "rgba-regex": "1.0.0" + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" } }, "is-data-descriptor": { @@ -3742,7 +3761,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-date-object": { @@ -3757,9 +3776,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "0.1.6", - "is-data-descriptor": "0.1.4", - "kind-of": "5.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "dependencies": { "kind-of": { @@ -3794,7 +3813,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -3803,7 +3822,7 @@ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-extglob": "^2.1.1" } }, "is-number": { @@ -3812,7 +3831,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-obj": { @@ -3833,7 +3852,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "is-regex": { @@ -3842,7 +3861,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.3" + "has": "^1.0.1" } }, "is-resolvable": { @@ -3863,7 +3882,7 @@ "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "dev": true, "requires": { - "html-comment-regex": "1.1.2" + "html-comment-regex": "^1.1.0" } }, "is-symbol": { @@ -3872,7 +3891,7 @@ "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "dev": true, "requires": { - "has-symbols": "1.0.0" + "has-symbols": "^1.0.0" } }, "is-windows": { @@ -3922,8 +3941,8 @@ "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "dev": true, "requires": { - "argparse": "1.0.10", - "esprima": "2.7.3" + "argparse": "^1.0.7", + "esprima": "^2.6.0" } }, "jsesc": { @@ -3956,7 +3975,7 @@ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "minimist": "1.2.0" + "minimist": "^1.2.0" }, "dependencies": { "minimist": { @@ -3973,7 +3992,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "knockout": { @@ -3987,8 +4006,8 @@ "integrity": "sha512-CZc+m2xZm51J8qSwdODeiiNeqh8CYkKEq6Rw8IkE4i/4yqf2cJhjQPsA6BtAV970ePRNhwEOXhy2U5xc5Jwh9Q==", "dev": true, "requires": { - "lodash": "4.17.15", - "webpack-sources": "1.4.3" + "lodash": "^4.17.4", + "webpack-sources": "^1.0.1" } }, "lazy-cache": { @@ -4003,7 +4022,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "load-json-file": { @@ -4012,10 +4031,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" }, "dependencies": { "parse-json": { @@ -4024,7 +4043,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.2" + "error-ex": "^1.2.0" } }, "pify": { @@ -4047,9 +4066,9 @@ "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "dev": true, "requires": { - "big.js": "5.2.2", - "emojis-list": "2.1.0", - "json5": "1.0.1" + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" } }, "locate-path": { @@ -4058,8 +4077,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { @@ -4104,8 +4123,8 @@ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-dir": { @@ -4114,7 +4133,7 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" } }, "map-cache": { @@ -4129,7 +4148,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "1.0.1" + "object-visit": "^1.0.0" } }, "math-expression-evaluator": { @@ -4144,9 +4163,9 @@ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "mdn-data": { @@ -4161,7 +4180,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.2.0" + "mimic-fn": "^1.0.0" } }, "memory-fs": { @@ -4170,8 +4189,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "0.1.7", - "readable-stream": "2.3.6" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" }, "dependencies": { "readable-stream": { @@ -4180,13 +4199,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -4201,7 +4220,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -4212,19 +4231,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "braces": "2.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "extglob": "2.0.4", - "fragment-cache": "0.2.1", - "kind-of": "6.0.2", - "nanomatch": "1.2.13", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" }, "dependencies": { "kind-of": { @@ -4241,8 +4260,8 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mimic-fn": { @@ -4269,7 +4288,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.11" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -4284,16 +4303,16 @@ "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "dev": true, "requires": { - "concat-stream": "1.6.2", - "duplexify": "3.7.1", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.1.1", - "from2": "2.3.0", - "parallel-transform": "1.2.0", - "pump": "2.0.1", - "pumpify": "1.5.1", - "stream-each": "1.2.3", - "through2": "2.0.5" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^2.0.1", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" } }, "mixin-deep": { @@ -4302,8 +4321,8 @@ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { - "for-in": "1.0.2", - "is-extendable": "1.0.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { "is-extendable": { @@ -4312,7 +4331,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "2.0.4" + "is-plain-object": "^2.0.4" } } } @@ -4332,12 +4351,12 @@ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.7.1", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" } }, "ms": { @@ -4359,17 +4378,17 @@ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "arr-diff": "4.0.0", - "array-unique": "0.3.2", - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "fragment-cache": "0.2.1", - "is-windows": "1.0.2", - "kind-of": "6.0.2", - "object.pick": "1.3.0", - "regex-not": "1.0.2", - "snapdragon": "0.8.2", - "to-regex": "3.0.2" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { "kind-of": { @@ -4398,7 +4417,7 @@ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { - "lower-case": "1.1.4" + "lower-case": "^1.1.1" } }, "node-libs-browser": { @@ -4407,29 +4426,29 @@ "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { - "assert": "1.5.0", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.2.0", - "events": "3.0.0", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", "path-browserify": "0.0.1", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.6", - "stream-browserify": "2.0.2", - "stream-http": "2.8.3", - "string_decoder": "1.3.0", - "timers-browserify": "2.0.11", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.11.1", - "vm-browserify": "1.1.0" + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" }, "dependencies": { "punycode": { @@ -4444,13 +4463,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" }, "dependencies": { "string_decoder": { @@ -4459,7 +4478,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -4478,7 +4497,7 @@ "integrity": "sha512-R5bDhzh6I+tpi/9i2hrrvGJ3yKPYzlVOORDkXhnZuwi5D3q1I5w4vYy24PJXTcLk9Q0kws9TO77T75bcK8/ysQ==", "dev": true, "requires": { - "semver": "5.7.1" + "semver": "^5.3.0" } }, "normalize-package-data": { @@ -4487,10 +4506,10 @@ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "hosted-git-info": "2.8.4", - "resolve": "1.12.0", - "semver": "5.7.1", - "validate-npm-package-license": "3.0.4" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -4511,10 +4530,10 @@ "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" } }, "npm-run-path": { @@ -4523,7 +4542,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "nth-check": { @@ -4532,7 +4551,7 @@ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { - "boolbase": "1.0.0" + "boolbase": "~1.0.0" } }, "num2fraction": { @@ -4559,9 +4578,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "0.1.1", - "define-property": "0.2.5", - "kind-of": "3.2.2" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "dependencies": { "define-property": { @@ -4570,7 +4589,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -4593,7 +4612,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.0" } }, "object.getownpropertydescriptors": { @@ -4602,8 +4621,8 @@ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.14.1" + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" } }, "object.pick": { @@ -4612,7 +4631,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "3.0.1" + "isobject": "^3.0.1" } }, "object.values": { @@ -4621,10 +4640,10 @@ "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", "dev": true, "requires": { - "define-properties": "1.1.3", - "es-abstract": "1.14.1", - "function-bind": "1.1.1", - "has": "1.0.3" + "define-properties": "^1.1.3", + "es-abstract": "^1.12.0", + "function-bind": "^1.1.1", + "has": "^1.0.3" } }, "once": { @@ -4633,7 +4652,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "optimize-css-assets-webpack-plugin": { @@ -4642,8 +4661,8 @@ "integrity": "sha512-FSoF15xKSEM2qCE3/y2gH92PysJSBY58Wx/hmSdIzVSOd0vg+FRS28NWZADId1wh6PDlbVt0lfPduV0IBufItQ==", "dev": true, "requires": { - "cssnano": "4.1.10", - "last-call-webpack-plugin": "2.1.2" + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^2.1.2" }, "dependencies": { "ansi-styles": { @@ -4652,7 +4671,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -4661,9 +4680,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -4672,7 +4691,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4683,10 +4702,10 @@ "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", "dev": true, "requires": { - "cosmiconfig": "5.2.1", - "cssnano-preset-default": "4.0.7", - "is-resolvable": "1.1.0", - "postcss": "7.0.18" + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" } }, "has-flag": { @@ -4701,9 +4720,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -4718,7 +4737,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -4735,9 +4754,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "p-finally": { @@ -4752,7 +4771,7 @@ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "1.0.0" + "p-try": "^1.0.0" } }, "p-locate": { @@ -4761,7 +4780,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.3.0" + "p-limit": "^1.1.0" } }, "p-try": { @@ -4782,9 +4801,9 @@ "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "cyclist": "1.0.1", - "inherits": "2.0.4", - "readable-stream": "2.3.6" + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" }, "dependencies": { "readable-stream": { @@ -4793,13 +4812,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -4814,7 +4833,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -4825,7 +4844,7 @@ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "dev": true, "requires": { - "no-case": "2.3.2" + "no-case": "^2.2.0" } }, "parse-asn1": { @@ -4834,12 +4853,12 @@ "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "dev": true, "requires": { - "asn1.js": "4.10.1", - "browserify-aes": "1.2.0", - "create-hash": "1.2.0", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.17", - "safe-buffer": "5.2.0" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, "parse-json": { @@ -4848,8 +4867,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.2", - "json-parse-better-errors": "1.0.2" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "pascalcase": { @@ -4900,7 +4919,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "2.3.0" + "pify": "^2.0.0" }, "dependencies": { "pify": { @@ -4917,11 +4936,11 @@ "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { - "create-hash": "1.2.0", - "create-hmac": "1.1.7", - "ripemd160": "2.0.2", - "safe-buffer": "5.2.0", - "sha.js": "2.4.11" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "pify": { @@ -4936,7 +4955,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "2.1.0" + "find-up": "^2.1.0" } }, "posix-character-classes": { @@ -4951,10 +4970,10 @@ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { - "chalk": "1.1.3", - "js-base64": "2.5.1", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" }, "dependencies": { "supports-color": { @@ -4963,7 +4982,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -4974,9 +4993,9 @@ "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" + "postcss": "^5.0.2", + "postcss-message-helpers": "^2.0.0", + "reduce-css-calc": "^1.2.6" } }, "postcss-colormin": { @@ -4985,9 +5004,9 @@ "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "dev": true, "requires": { - "colormin": "1.1.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "colormin": "^1.0.5", + "postcss": "^5.0.13", + "postcss-value-parser": "^3.2.3" } }, "postcss-convert-values": { @@ -4996,8 +5015,8 @@ "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "postcss": "^5.0.11", + "postcss-value-parser": "^3.1.2" } }, "postcss-discard-comments": { @@ -5006,7 +5025,7 @@ "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" } }, "postcss-discard-duplicates": { @@ -5015,7 +5034,7 @@ "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" } }, "postcss-discard-empty": { @@ -5024,7 +5043,7 @@ "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.14" } }, "postcss-discard-overridden": { @@ -5033,7 +5052,7 @@ "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.16" } }, "postcss-discard-unused": { @@ -5042,8 +5061,8 @@ "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "dev": true, "requires": { - "postcss": "5.2.18", - "uniqs": "2.0.0" + "postcss": "^5.0.14", + "uniqs": "^2.0.0" } }, "postcss-filter-plugins": { @@ -5052,7 +5071,7 @@ "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" } }, "postcss-merge-idents": { @@ -5061,9 +5080,9 @@ "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "dev": true, "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "has": "^1.0.1", + "postcss": "^5.0.10", + "postcss-value-parser": "^3.1.1" } }, "postcss-merge-longhand": { @@ -5072,7 +5091,7 @@ "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" } }, "postcss-merge-rules": { @@ -5081,11 +5100,11 @@ "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.3" + "browserslist": "^1.5.2", + "caniuse-api": "^1.5.2", + "postcss": "^5.0.4", + "postcss-selector-parser": "^2.2.2", + "vendors": "^1.0.0" } }, "postcss-message-helpers": { @@ -5100,9 +5119,9 @@ "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "dev": true, "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "object-assign": "^4.0.1", + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" } }, "postcss-minify-gradients": { @@ -5111,8 +5130,8 @@ "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "postcss": "^5.0.12", + "postcss-value-parser": "^3.3.0" } }, "postcss-minify-params": { @@ -5121,10 +5140,10 @@ "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.2", + "postcss-value-parser": "^3.0.2", + "uniqs": "^2.0.0" } }, "postcss-minify-selectors": { @@ -5133,10 +5152,10 @@ "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" + "alphanum-sort": "^1.0.2", + "has": "^1.0.1", + "postcss": "^5.0.14", + "postcss-selector-parser": "^2.0.0" } }, "postcss-modules-extract-imports": { @@ -5145,7 +5164,7 @@ "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", "dev": true, "requires": { - "postcss": "6.0.23" + "postcss": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -5154,7 +5173,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5163,9 +5182,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -5180,9 +5199,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "source-map": { @@ -5197,7 +5216,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5208,8 +5227,8 @@ "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "dev": true, "requires": { - "css-selector-tokenizer": "0.7.1", - "postcss": "6.0.23" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -5218,7 +5237,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5227,9 +5246,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -5244,9 +5263,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "source-map": { @@ -5261,7 +5280,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5272,8 +5291,8 @@ "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "dev": true, "requires": { - "css-selector-tokenizer": "0.7.1", - "postcss": "6.0.23" + "css-selector-tokenizer": "^0.7.0", + "postcss": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -5282,7 +5301,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5291,9 +5310,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -5308,9 +5327,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "source-map": { @@ -5325,7 +5344,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5336,8 +5355,8 @@ "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "dev": true, "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.23" + "icss-replace-symbols": "^1.1.0", + "postcss": "^6.0.1" }, "dependencies": { "ansi-styles": { @@ -5346,7 +5365,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5355,9 +5374,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "has-flag": { @@ -5372,9 +5391,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "5.5.0" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, "source-map": { @@ -5389,7 +5408,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5400,7 +5419,7 @@ "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.5" } }, "postcss-normalize-display-values": { @@ -5409,9 +5428,9 @@ "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "dev": true, "requires": { - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -5420,7 +5439,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5429,9 +5448,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -5440,7 +5459,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5457,9 +5476,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -5474,7 +5493,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5485,10 +5504,10 @@ "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "dev": true, "requires": { - "cssnano-util-get-arguments": "4.0.0", - "has": "1.0.3", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -5497,7 +5516,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5506,9 +5525,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -5517,7 +5536,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5534,9 +5553,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -5551,7 +5570,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5562,10 +5581,10 @@ "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "dev": true, "requires": { - "cssnano-util-get-arguments": "4.0.0", - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -5574,7 +5593,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5583,9 +5602,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -5594,7 +5613,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5611,9 +5630,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -5628,7 +5647,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5639,9 +5658,9 @@ "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "dev": true, "requires": { - "has": "1.0.3", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -5650,7 +5669,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5659,9 +5678,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -5670,7 +5689,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5687,9 +5706,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -5704,7 +5723,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5715,9 +5734,9 @@ "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "dev": true, "requires": { - "cssnano-util-get-match": "4.0.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -5726,7 +5745,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5735,9 +5754,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -5746,7 +5765,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5763,9 +5782,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -5780,7 +5799,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5791,9 +5810,9 @@ "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "dev": true, "requires": { - "browserslist": "4.7.0", - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -5802,7 +5821,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "browserslist": { @@ -5811,9 +5830,9 @@ "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000989", - "electron-to-chromium": "1.3.252", - "node-releases": "1.1.29" + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" } }, "chalk": { @@ -5822,9 +5841,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -5833,7 +5852,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5850,9 +5869,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -5867,7 +5886,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5878,10 +5897,10 @@ "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "dev": true, "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "is-absolute-url": "^2.0.0", + "normalize-url": "^1.4.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3" } }, "postcss-normalize-whitespace": { @@ -5890,8 +5909,8 @@ "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "dev": true, "requires": { - "postcss": "7.0.18", - "postcss-value-parser": "3.3.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -5900,7 +5919,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "chalk": { @@ -5909,9 +5928,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -5920,7 +5939,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5937,9 +5956,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "source-map": { @@ -5954,7 +5973,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -5965,8 +5984,8 @@ "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.1" } }, "postcss-reduce-idents": { @@ -5975,8 +5994,8 @@ "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "postcss": "^5.0.4", + "postcss-value-parser": "^3.0.2" } }, "postcss-reduce-initial": { @@ -5985,7 +6004,7 @@ "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^5.0.4" } }, "postcss-reduce-transforms": { @@ -5994,9 +6013,9 @@ "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "dev": true, "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1" + "has": "^1.0.1", + "postcss": "^5.0.8", + "postcss-value-parser": "^3.0.1" } }, "postcss-selector-parser": { @@ -6005,9 +6024,9 @@ "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "dev": true, "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "postcss-svgo": { @@ -6016,10 +6035,10 @@ "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "dev": true, "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.1", - "svgo": "0.7.2" + "is-svg": "^2.0.0", + "postcss": "^5.0.14", + "postcss-value-parser": "^3.2.3", + "svgo": "^0.7.0" } }, "postcss-unique-selectors": { @@ -6028,9 +6047,9 @@ "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" } }, "postcss-value-parser": { @@ -6045,9 +6064,9 @@ "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "dev": true, "requires": { - "has": "1.0.3", - "postcss": "5.2.18", - "uniqs": "2.0.0" + "has": "^1.0.1", + "postcss": "^5.0.4", + "uniqs": "^2.0.0" } }, "prepend-http": { @@ -6062,8 +6081,8 @@ "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "dev": true, "requires": { - "renderkid": "2.0.3", - "utila": "0.4.0" + "renderkid": "^2.0.1", + "utila": "~0.4" } }, "private": { @@ -6108,12 +6127,12 @@ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.2.0", - "parse-asn1": "5.1.4", - "randombytes": "2.1.0", - "safe-buffer": "5.2.0" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "pump": { @@ -6122,8 +6141,8 @@ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { @@ -6132,9 +6151,9 @@ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "3.7.1", - "inherits": "2.0.4", - "pump": "2.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, "punycode": { @@ -6155,8 +6174,8 @@ "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "dev": true, "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, "querystring": { @@ -6177,7 +6196,7 @@ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { - "safe-buffer": "5.2.0" + "safe-buffer": "^5.1.0" } }, "randomfill": { @@ -6186,8 +6205,8 @@ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "randombytes": "2.1.0", - "safe-buffer": "5.2.0" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "read-pkg": { @@ -6196,9 +6215,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.5.0", - "path-type": "2.0.0" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, "read-pkg-up": { @@ -6207,8 +6226,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, "readable-stream": { @@ -6217,9 +6236,9 @@ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "dev": true, "requires": { - "inherits": "2.0.4", - "string_decoder": "1.3.0", - "util-deprecate": "1.0.2" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, "readdirp": { @@ -6228,9 +6247,9 @@ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "graceful-fs": "4.2.2", - "micromatch": "3.1.10", - "readable-stream": "2.3.6" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" }, "dependencies": { "readable-stream": { @@ -6239,13 +6258,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -6260,7 +6279,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -6272,9 +6291,9 @@ "dev": true, "requires": { "ast-types": "0.9.6", - "esprima": "3.1.3", - "private": "0.1.8", - "source-map": "0.5.7" + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" }, "dependencies": { "esprima": { @@ -6291,9 +6310,9 @@ "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "dev": true, "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" + "balanced-match": "^0.4.2", + "math-expression-evaluator": "^1.2.14", + "reduce-function-call": "^1.0.1" } }, "reduce-function-call": { @@ -6302,7 +6321,7 @@ "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "dev": true, "requires": { - "balanced-match": "0.4.2" + "balanced-match": "^0.4.2" } }, "regenerate": { @@ -6317,8 +6336,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "3.0.2", - "safe-regex": "1.1.0" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, "regexpu-core": { @@ -6327,9 +6346,9 @@ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "dev": true, "requires": { - "regenerate": "1.4.0", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.2.1", + "regjsgen": "^0.2.0", + "regjsparser": "^0.1.4" } }, "regjsgen": { @@ -6344,7 +6363,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" } }, "relateurl": { @@ -6365,11 +6384,11 @@ "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", "dev": true, "requires": { - "css-select": "1.2.0", - "dom-converter": "0.2.0", - "htmlparser2": "3.10.1", - "strip-ansi": "3.0.1", - "utila": "0.4.0" + "css-select": "^1.1.0", + "dom-converter": "^0.2", + "htmlparser2": "^3.3.0", + "strip-ansi": "^3.0.0", + "utila": "^0.4.0" } }, "repeat-element": { @@ -6402,7 +6421,7 @@ "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { - "path-parse": "1.0.6" + "path-parse": "^1.0.6" } }, "resolve-from": { @@ -6441,7 +6460,7 @@ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -6450,7 +6469,7 @@ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "7.1.4" + "glob": "^7.1.3" } }, "ripemd160": { @@ -6459,8 +6478,8 @@ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.4" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "run-queue": { @@ -6469,7 +6488,7 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "aproba": "1.2.0" + "aproba": "^1.1.1" } }, "safe-buffer": { @@ -6484,7 +6503,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, "sax": { @@ -6499,7 +6518,7 @@ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "dev": true, "requires": { - "ajv": "5.5.2" + "ajv": "^5.0.0" }, "dependencies": { "ajv": { @@ -6508,10 +6527,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.1.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" } }, "fast-deep-equal": { @@ -6552,10 +6571,10 @@ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { - "extend-shallow": "2.0.1", - "is-extendable": "0.1.1", - "is-plain-object": "2.0.4", - "split-string": "3.1.0" + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" }, "dependencies": { "extend-shallow": { @@ -6564,7 +6583,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6581,8 +6600,8 @@ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "inherits": "2.0.4", - "safe-buffer": "5.2.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "shebang-command": { @@ -6591,7 +6610,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -6612,7 +6631,7 @@ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "dev": true, "requires": { - "is-arrayish": "0.3.2" + "is-arrayish": "^0.3.1" }, "dependencies": { "is-arrayish": { @@ -6629,14 +6648,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "0.11.2", - "debug": "2.6.9", - "define-property": "0.2.5", - "extend-shallow": "2.0.1", - "map-cache": "0.2.2", - "source-map": "0.5.7", - "source-map-resolve": "0.5.2", - "use": "3.1.1" + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" }, "dependencies": { "define-property": { @@ -6645,7 +6664,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } }, "extend-shallow": { @@ -6654,7 +6673,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "0.1.1" + "is-extendable": "^0.1.0" } } } @@ -6665,9 +6684,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "1.0.0", - "isobject": "3.0.1", - "snapdragon-util": "3.0.1" + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" }, "dependencies": { "define-property": { @@ -6676,7 +6695,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "1.0.2" + "is-descriptor": "^1.0.0" } }, "is-accessor-descriptor": { @@ -6685,7 +6704,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-data-descriptor": { @@ -6694,7 +6713,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "6.0.2" + "kind-of": "^6.0.0" } }, "is-descriptor": { @@ -6703,9 +6722,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "1.0.0", - "is-data-descriptor": "1.0.0", - "kind-of": "6.0.2" + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } }, "kind-of": { @@ -6722,7 +6741,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.2.0" } }, "sort-keys": { @@ -6731,7 +6750,7 @@ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { - "is-plain-obj": "1.1.0" + "is-plain-obj": "^1.0.0" } }, "source-list-map": { @@ -6752,11 +6771,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "2.1.2", - "decode-uri-component": "0.2.0", - "resolve-url": "0.2.1", - "source-map-url": "0.4.0", - "urix": "0.1.0" + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" } }, "source-map-url": { @@ -6771,8 +6790,8 @@ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { - "spdx-expression-parse": "3.0.0", - "spdx-license-ids": "3.0.5" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { @@ -6787,8 +6806,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "2.2.0", - "spdx-license-ids": "3.0.5" + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { @@ -6803,7 +6822,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "3.0.2" + "extend-shallow": "^3.0.0" } }, "sprintf-js": { @@ -6818,7 +6837,7 @@ "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "dev": true, "requires": { - "safe-buffer": "5.2.0" + "safe-buffer": "^5.1.1" } }, "stable": { @@ -6833,8 +6852,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "0.2.5", - "object-copy": "0.1.0" + "define-property": "^0.2.5", + "object-copy": "^0.1.0" }, "dependencies": { "define-property": { @@ -6843,7 +6862,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "0.1.6" + "is-descriptor": "^0.1.0" } } } @@ -6854,8 +6873,8 @@ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { - "inherits": "2.0.4", - "readable-stream": "2.3.6" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" }, "dependencies": { "readable-stream": { @@ -6864,13 +6883,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -6885,7 +6904,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -6896,8 +6915,8 @@ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-http": { @@ -6906,11 +6925,11 @@ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.4", - "readable-stream": "2.3.6", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.2" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" }, "dependencies": { "readable-stream": { @@ -6919,13 +6938,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -6940,7 +6959,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -6963,8 +6982,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -6985,7 +7004,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -6996,8 +7015,8 @@ "integrity": "sha1-aLaqjhYsaoDnbjqKDC50cYbicf8=", "dev": true, "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.0.2" } }, "string.prototype.trimright": { @@ -7006,8 +7025,8 @@ "integrity": "sha1-q0pW2AKgH75yk+EehPJNyBZGYd0=", "dev": true, "requires": { - "define-properties": "1.1.3", - "function-bind": "1.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.0.2" } }, "string_decoder": { @@ -7016,7 +7035,7 @@ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "safe-buffer": "5.2.0" + "safe-buffer": "~5.2.0" } }, "strip-ansi": { @@ -7025,7 +7044,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -7046,9 +7065,9 @@ "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "dev": true, "requires": { - "browserslist": "4.7.0", - "postcss": "7.0.18", - "postcss-selector-parser": "3.1.1" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -7057,7 +7076,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "1.9.3" + "color-convert": "^1.9.0" } }, "browserslist": { @@ -7066,9 +7085,9 @@ "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000989", - "electron-to-chromium": "1.3.252", - "node-releases": "1.1.29" + "caniuse-lite": "^1.0.30000989", + "electron-to-chromium": "^1.3.247", + "node-releases": "^1.1.29" } }, "chalk": { @@ -7077,9 +7096,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "3.2.1", - "escape-string-regexp": "1.0.5", - "supports-color": "5.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "dependencies": { "supports-color": { @@ -7088,7 +7107,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -7105,9 +7124,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "2.4.2", - "source-map": "0.6.1", - "supports-color": "6.1.0" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" } }, "postcss-selector-parser": { @@ -7116,9 +7135,9 @@ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "dev": true, "requires": { - "dot-prop": "4.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "dot-prop": "^4.1.1", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "source-map": { @@ -7133,7 +7152,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "3.0.0" + "has-flag": "^3.0.0" } } } @@ -7150,13 +7169,13 @@ "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "dev": true, "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.4", - "whet.extend": "0.9.9" + "coa": "~1.0.1", + "colors": "~1.1.2", + "csso": "~2.3.1", + "js-yaml": "~3.7.0", + "mkdirp": "~0.5.1", + "sax": "~1.2.1", + "whet.extend": "~0.9.9" } }, "tapable": { @@ -7177,8 +7196,8 @@ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "2.3.6", - "xtend": "4.0.2" + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" }, "dependencies": { "readable-stream": { @@ -7187,13 +7206,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.4", - "isarray": "1.0.0", - "process-nextick-args": "2.0.1", - "safe-buffer": "5.1.2", - "string_decoder": "1.1.1", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, "safe-buffer": { @@ -7208,7 +7227,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "5.1.2" + "safe-buffer": "~5.1.0" } } } @@ -7219,7 +7238,7 @@ "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, "timsort": { @@ -7240,7 +7259,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "to-regex": { @@ -7249,10 +7268,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "2.0.2", - "extend-shallow": "3.0.2", - "regex-not": "1.0.2", - "safe-regex": "1.1.0" + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" } }, "to-regex-range": { @@ -7261,8 +7280,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "3.0.0", - "repeat-string": "1.6.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } }, "todomvc-app-css": { @@ -7305,8 +7324,8 @@ "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "dev": true, "requires": { - "commander": "2.19.0", - "source-map": "0.6.1" + "commander": "~2.19.0", + "source-map": "~0.6.1" }, "dependencies": { "commander": { @@ -7336,14 +7355,14 @@ "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", "dev": true, "requires": { - "cacache": "10.0.4", - "find-cache-dir": "1.0.0", - "schema-utils": "0.4.7", - "serialize-javascript": "1.9.1", - "source-map": "0.6.1", - "uglify-es": "3.3.9", - "webpack-sources": "1.4.3", - "worker-farm": "1.7.0" + "cacache": "^10.0.4", + "find-cache-dir": "^1.0.0", + "schema-utils": "^0.4.5", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "uglify-es": "^3.3.4", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" }, "dependencies": { "ajv": { @@ -7352,10 +7371,10 @@ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "commander": { @@ -7382,8 +7401,8 @@ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { - "ajv": "6.10.2", - "ajv-keywords": "3.4.1" + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" } }, "source-map": { @@ -7398,8 +7417,8 @@ "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", "dev": true, "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" + "commander": "~2.13.0", + "source-map": "~0.6.1" } } } @@ -7410,10 +7429,10 @@ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { - "arr-union": "3.1.0", - "get-value": "2.0.6", - "is-extendable": "0.1.1", - "set-value": "2.0.1" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" } }, "uniq": { @@ -7434,7 +7453,7 @@ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { - "unique-slug": "2.0.2" + "unique-slug": "^2.0.0" } }, "unique-slug": { @@ -7443,7 +7462,7 @@ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" } }, "unquote": { @@ -7458,8 +7477,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "0.3.1", - "isobject": "3.0.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" }, "dependencies": { "has-value": { @@ -7468,9 +7487,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "2.0.6", - "has-values": "0.1.4", - "isobject": "2.1.0" + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" }, "dependencies": { "isobject": { @@ -7510,7 +7529,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "2.1.1" + "punycode": "^2.1.0" } }, "urix": { @@ -7572,8 +7591,8 @@ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "dev": true, "requires": { - "define-properties": "1.1.3", - "object.getownpropertydescriptors": "2.0.3" + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" } }, "utila": { @@ -7588,8 +7607,8 @@ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "3.1.0", - "spdx-expression-parse": "3.0.0" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "vendors": { @@ -7610,9 +7629,9 @@ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "chokidar": "2.1.8", - "graceful-fs": "4.2.2", - "neo-async": "2.6.1" + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "webpack": { @@ -7621,28 +7640,28 @@ "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", "dev": true, "requires": { - "acorn": "5.7.3", - "acorn-dynamic-import": "2.0.2", - "ajv": "6.10.2", - "ajv-keywords": "3.4.1", - "async": "2.6.3", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.2.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.4.0", - "loader-utils": "1.2.3", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.2.1", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.9", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.6.0", - "webpack-sources": "1.4.3", - "yargs": "8.0.2" + "acorn": "^5.0.0", + "acorn-dynamic-import": "^2.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "async": "^2.1.2", + "enhanced-resolve": "^3.4.0", + "escope": "^3.6.0", + "interpret": "^1.0.0", + "json-loader": "^0.5.4", + "json5": "^0.5.1", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "mkdirp": "~0.5.0", + "node-libs-browser": "^2.0.0", + "source-map": "^0.5.3", + "supports-color": "^4.2.1", + "tapable": "^0.2.7", + "uglifyjs-webpack-plugin": "^0.4.6", + "watchpack": "^1.4.0", + "webpack-sources": "^1.0.1", + "yargs": "^8.0.2" }, "dependencies": { "ajv": { @@ -7651,10 +7670,10 @@ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { - "fast-deep-equal": "2.0.1", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.4.1", - "uri-js": "4.2.2" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "fast-deep-equal": { @@ -7687,7 +7706,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } }, "tapable": { @@ -7702,9 +7721,9 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "yargs": { @@ -7713,9 +7732,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -7727,9 +7746,9 @@ "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.4.3" + "source-map": "^0.5.6", + "uglify-js": "^2.8.29", + "webpack-sources": "^1.0.1" } } } @@ -7740,8 +7759,8 @@ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { - "source-list-map": "2.0.1", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" }, "dependencies": { "source-map": { @@ -7764,7 +7783,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -7791,7 +7810,7 @@ "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, "requires": { - "errno": "0.1.7" + "errno": "~0.1.7" } }, "wrap-ansi": { @@ -7800,8 +7819,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "string-width": { @@ -7810,9 +7829,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -7847,19 +7866,19 @@ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.3", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" }, "dependencies": { "camelcase": { @@ -7874,9 +7893,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -7885,9 +7904,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -7906,7 +7925,7 @@ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { diff --git a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java index b9786116926..9131d4f55cb 100644 --- a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java +++ b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java @@ -37,6 +37,9 @@ public class ServerRunner { private Server server; + /** + * Needed for reflection. + */ public ServerRunner() { } @@ -49,6 +52,9 @@ private static String getContextRoot(Class application) { return value.startsWith("/") ? value : "/" + value; } + /** + * Start the server. Needed for reflection. + */ public void start(Config config, int port) { // attempt a stop stop(); @@ -67,6 +73,9 @@ public void start(Config config, int port) { LOGGER.finest(() -> "Started server"); } + /** + * Stop the server. Needed for reflection. + */ public void stop() { if (null != server) { LOGGER.finest(() -> "Stopping server"); From f942d94763b4b526b8bb0c1bdd9509b9850614c7 Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Mon, 4 May 2020 18:33:02 +0200 Subject: [PATCH 05/12] Checkstyle fixes 2. Signed-off-by: Tomas Langer --- .../src/main/java/io/helidon/config/ConfigSourcesRuntime.java | 2 +- .../java/io/helidon/microprofile/arquillian/ServerRunner.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/config/config/src/main/java/io/helidon/config/ConfigSourcesRuntime.java b/config/config/src/main/java/io/helidon/config/ConfigSourcesRuntime.java index 0c9959d60a9..383f846ee20 100644 --- a/config/config/src/main/java/io/helidon/config/ConfigSourcesRuntime.java +++ b/config/config/src/main/java/io/helidon/config/ConfigSourcesRuntime.java @@ -52,7 +52,7 @@ static ConfigSourcesRuntime empty() { return new ConfigSourcesRuntime(List.of(new ConfigSourceRuntimeImpl(null, ConfigSources.empty())), MergingStrategy.fallback()); } - + @Override public boolean equals(Object o) { if (this == o) { diff --git a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java index 9131d4f55cb..6b96ae39831 100644 --- a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java +++ b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/ServerRunner.java @@ -54,6 +54,9 @@ private static String getContextRoot(Class application) { /** * Start the server. Needed for reflection. + * + * @param config configuration + * @param port port to start the server on */ public void start(Config config, int port) { // attempt a stop From 2a9bee197ed7e1452893c3f46a8a939184ac0d4b Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Mon, 4 May 2020 18:52:15 +0200 Subject: [PATCH 06/12] Javadoc fix. Signed-off-by: Tomas Langer --- .../java/io/helidon/config/yaml/YamlMpConfigSource.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java b/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java index a08b3a50507..00475d5d2de 100644 --- a/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java +++ b/config/yaml/src/main/java/io/helidon/config/yaml/YamlMpConfigSource.java @@ -36,9 +36,9 @@ * MicroProfile {@link org.eclipse.microprofile.config.spi.ConfigSource} that can be used * to add YAML files from classpath or file system using the * {@link org.eclipse.microprofile.config.spi.ConfigProviderResolver#getBuilder()}. + *

    The YAML file is transformed to a flat map as follows:

    + * Object nodes *

    - * The YAML file is transformed to a flat map as follows: - *

    Object nodes

    * Each node in the tree is dot separated. *
      * server:
    @@ -50,7 +50,8 @@
      * server.host=localhost
      * server.port=8080
      * 
    - *

    List nodes (arrays)

    + * List nodes (arrays) + *

    * Each node will be indexed (0 based) *

      * providers:
    
    From 4f3a345cfbb825e3d76c1310ed4047489c2b4016 Mon Sep 17 00:00:00 2001
    From: Tomas Langer 
    Date: Mon, 4 May 2020 21:59:22 +0200
    Subject: [PATCH 07/12] Added built-in converters to MP from SE.
    
    Signed-off-by: Tomas Langer 
    ---
     .../io/helidon/config/mp/MpConfigBuilder.java | 116 +++++++++++++++---
     1 file changed, 98 insertions(+), 18 deletions(-)
    
    diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java
    index 8dec2c553a1..bd8ab467914 100644
    --- a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java
    +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java
    @@ -16,14 +16,41 @@
     
     package io.helidon.config.mp;
     
    +import java.io.File;
     import java.lang.reflect.ParameterizedType;
     import java.lang.reflect.Type;
    +import java.math.BigDecimal;
    +import java.math.BigInteger;
    +import java.net.URI;
    +import java.net.URL;
    +import java.nio.charset.Charset;
    +import java.nio.file.Path;
    +import java.nio.file.Paths;
    +import java.time.Duration;
    +import java.time.Instant;
    +import java.time.LocalDate;
    +import java.time.LocalDateTime;
    +import java.time.LocalTime;
    +import java.time.OffsetDateTime;
    +import java.time.OffsetTime;
    +import java.time.Period;
    +import java.time.YearMonth;
    +import java.time.ZoneId;
    +import java.time.ZoneOffset;
    +import java.time.ZonedDateTime;
    +import java.util.Calendar;
     import java.util.Collections;
     import java.util.Comparator;
    +import java.util.Date;
    +import java.util.GregorianCalendar;
     import java.util.HashMap;
     import java.util.LinkedList;
     import java.util.List;
     import java.util.ServiceLoader;
    +import java.util.SimpleTimeZone;
    +import java.util.TimeZone;
    +import java.util.UUID;
    +import java.util.regex.Pattern;
     
     import io.helidon.common.serviceloader.HelidonServiceLoader;
     import io.helidon.common.serviceloader.Priorities;
    @@ -109,24 +136,65 @@ public Config build() {
                         .map(OrdinalSource::new)
                         .forEach(sources::add);
             }
    -        // built-in converters
    -        converters.add(new OrdinalConverter(ConfigMappers::toBoolean, Boolean.class, 1));
    -        converters.add(new OrdinalConverter(ConfigMappers::toBoolean, Boolean.TYPE, 1));
    -        converters.add(new OrdinalConverter(Byte::parseByte, Byte.class, 1));
    -        converters.add(new OrdinalConverter(Byte::parseByte, Byte.TYPE, 1));
    -        converters.add(new OrdinalConverter(Short::parseShort, Short.class, 1));
    -        converters.add(new OrdinalConverter(Short::parseShort, Short.TYPE, 1));
    -        converters.add(new OrdinalConverter(Integer::parseInt, Integer.class, 1));
    -        converters.add(new OrdinalConverter(Integer::parseInt, Integer.TYPE, 1));
    -        converters.add(new OrdinalConverter(Long::parseLong, Long.class, 1));
    -        converters.add(new OrdinalConverter(Long::parseLong, Long.TYPE, 1));
    -        converters.add(new OrdinalConverter(Float::parseFloat, Float.class, 1));
    -        converters.add(new OrdinalConverter(Float::parseFloat, Float.TYPE, 1));
    -        converters.add(new OrdinalConverter(Double::parseDouble, Double.class, 1));
    -        converters.add(new OrdinalConverter(Double::parseDouble, Double.TYPE, 1));
    -        converters.add(new OrdinalConverter(MpConfigBuilder::toChar, Character.class, 1));
    -        converters.add(new OrdinalConverter(MpConfigBuilder::toChar, Character.TYPE, 1));
    -        converters.add(new OrdinalConverter(MpConfigBuilder::toClass, Class.class, 1));
    +        // built-in converters - required by specification
    +        addBuiltIn(converters, Boolean.class, ConfigMappers::toBoolean);
    +        addBuiltIn(converters, Boolean.TYPE, ConfigMappers::toBoolean);
    +        addBuiltIn(converters, Byte.class, Byte::parseByte);
    +        addBuiltIn(converters, Byte.TYPE, Byte::parseByte);
    +        addBuiltIn(converters, Short.class, Short::parseShort);
    +        addBuiltIn(converters, Short.TYPE, Short::parseShort);
    +        addBuiltIn(converters, Integer.class, Integer::parseInt);
    +        addBuiltIn(converters, Integer.TYPE, Integer::parseInt);
    +        addBuiltIn(converters, Long.class, Long::parseLong);
    +        addBuiltIn(converters, Long.TYPE, Long::parseLong);
    +        addBuiltIn(converters, Float.class, Float::parseFloat);
    +        addBuiltIn(converters, Float.TYPE, Float::parseFloat);
    +        addBuiltIn(converters, Double.class, Double::parseDouble);
    +        addBuiltIn(converters, Double.TYPE, Double::parseDouble);
    +        addBuiltIn(converters, Character.class, MpConfigBuilder::toChar);
    +        addBuiltIn(converters, Character.TYPE, MpConfigBuilder::toChar);
    +        addBuiltIn(converters, Class.class, MpConfigBuilder::toClass);
    +
    +        // built-in converters - Helidon
    +        //javax.math
    +        addBuiltIn(converters, BigDecimal.class, ConfigMappers::toBigDecimal);
    +        addBuiltIn(converters, BigInteger.class, ConfigMappers::toBigInteger);
    +        //java.time
    +        addBuiltIn(converters, Duration.class, ConfigMappers::toDuration);
    +        addBuiltIn(converters, Period.class, ConfigMappers::toPeriod);
    +        addBuiltIn(converters, LocalDate.class, ConfigMappers::toLocalDate);
    +        addBuiltIn(converters, LocalDateTime.class, ConfigMappers::toLocalDateTime);
    +        addBuiltIn(converters, LocalTime.class, ConfigMappers::toLocalTime);
    +        addBuiltIn(converters, ZonedDateTime.class, ConfigMappers::toZonedDateTime);
    +        addBuiltIn(converters, ZoneId.class, ConfigMappers::toZoneId);
    +        addBuiltIn(converters, ZoneOffset.class, ConfigMappers::toZoneOffset);
    +        addBuiltIn(converters, Instant.class, ConfigMappers::toInstant);
    +        addBuiltIn(converters, OffsetTime.class, ConfigMappers::toOffsetTime);
    +        addBuiltIn(converters, OffsetDateTime.class, ConfigMappers::toOffsetDateTime);
    +        addBuiltIn(converters, YearMonth.class, YearMonth::parse); ;
    +        //java.io
    +        addBuiltIn(converters, File.class, MpConfigBuilder::toFile);
    +        //java.nio
    +        addBuiltIn(converters, Path.class, MpConfigBuilder::toPath);
    +        addBuiltIn(converters, Charset.class, ConfigMappers::toCharset);
    +        //java.net
    +        addBuiltIn(converters, URI.class, ConfigMappers::toUri);
    +        addBuiltIn(converters, URL.class, ConfigMappers::toUrl);
    +        //java.util
    +        addBuiltIn(converters, Pattern.class, ConfigMappers::toPattern);
    +        addBuiltIn(converters, UUID.class, ConfigMappers::toUUID);
    +
    +        // obsolete stuff
    +        // noinspection UseOfObsoleteDateTimeApi
    +        addBuiltIn(converters, Date.class, ConfigMappers::toDate);
    +        // noinspection UseOfObsoleteDateTimeApi
    +        addBuiltIn(converters, Calendar.class, ConfigMappers::toCalendar);
    +        // noinspection UseOfObsoleteDateTimeApi
    +        addBuiltIn(converters, GregorianCalendar.class, ConfigMappers::toGregorianCalendar);
    +        // noinspection UseOfObsoleteDateTimeApi
    +        addBuiltIn(converters, TimeZone.class, ConfigMappers::toTimeZone);
    +        // noinspection UseOfObsoleteDateTimeApi
    +        addBuiltIn(converters, SimpleTimeZone.class, ConfigMappers::toSimpleTimeZone);
     
             if (useDiscoveredConverters) {
                 ServiceLoader.load(Converter.class)
    @@ -164,6 +232,10 @@ public Config build() {
             return new MpConfigImpl(sources, converters, filters);
         }
     
    +    private  void addBuiltIn(List converters, Class clazz, Converter converter) {
    +        converters.add(new OrdinalConverter(converter, clazz, 1));
    +    }
    +
         ConfigBuilder metaConfig(io.helidon.config.Config metaConfig) {
             io.helidon.config.Config helidonConfig = io.helidon.config.Config.builder()
                     .config(metaConfig)
    @@ -172,6 +244,14 @@ ConfigBuilder metaConfig(io.helidon.config.Config metaConfig) {
             return this;
         }
     
    +    private static File toFile(String value) {
    +        return new File(value);
    +    }
    +
    +    private static Path toPath(String value) {
    +        return Paths.get(value);
    +    }
    +
         private static Class toClass(String stringValue) {
             try {
                 return Class.forName(stringValue);
    
    From ed1018eb1c377144b2da81c6ceedd7bfd68d4e62 Mon Sep 17 00:00:00 2001
    From: Tomas Langer 
    Date: Mon, 4 May 2020 22:17:35 +0200
    Subject: [PATCH 08/12] Print full config tree for troubleshooting.
    
    Signed-off-by: Tomas Langer 
    ---
     .../integration/nativeimage/mp1/Mp1Main.java  | 23 ++++++++++++-------
     .../mp-1/src/main/java/module-info.java       |  1 +
     2 files changed, 16 insertions(+), 8 deletions(-)
    
    diff --git a/tests/integration/native-image/mp-1/src/main/java/io/helidon/tests/integration/nativeimage/mp1/Mp1Main.java b/tests/integration/native-image/mp-1/src/main/java/io/helidon/tests/integration/nativeimage/mp1/Mp1Main.java
    index 9f2ff8e57d7..112b936bb1b 100644
    --- a/tests/integration/native-image/mp-1/src/main/java/io/helidon/tests/integration/nativeimage/mp1/Mp1Main.java
    +++ b/tests/integration/native-image/mp-1/src/main/java/io/helidon/tests/integration/nativeimage/mp1/Mp1Main.java
    @@ -21,6 +21,7 @@
     import java.nio.file.Path;
     import java.nio.file.Paths;
     import java.time.Instant;
    +import java.util.ArrayList;
     import java.util.Base64;
     import java.util.LinkedList;
     import java.util.List;
    @@ -49,6 +50,8 @@
     
     import io.opentracing.Tracer;
     import io.opentracing.util.GlobalTracer;
    +import org.eclipse.microprofile.config.Config;
    +import org.eclipse.microprofile.config.ConfigProvider;
     import org.eclipse.microprofile.faulttolerance.exceptions.TimeoutException;
     
     import static io.helidon.common.http.Http.Status.FORBIDDEN_403;
    @@ -105,19 +108,23 @@ public static void main(final String[] args) {
             long time = System.currentTimeMillis() - now;
             System.out.println("Tests finished in " + time + " millis");
     
    +        Config config = ConfigProvider.getConfig();
    +        List names = new ArrayList<>();
    +        config.getPropertyNames()
    +                .forEach(names::add);
    +        names.sort(String::compareTo);
    +
    +        System.out.println("All configuration options:");
    +        names.forEach(it -> {
    +            config.getOptionalValue(it, String.class)
    +                    .ifPresent(value -> System.out.println(it + "=" + value));
    +        });
    +
             server.stop();
     
             if (failed) {
                 System.exit(-1);
             }
    -
    -
    -//        try {
    -//            Thread.sleep(5000);
    -//            System.setProperty("app.message", "New message through change support");
    -//        } catch (InterruptedException e) {
    -//            e.printStackTrace();
    -//        }
         }
     
         private static String generateJwtToken() {
    diff --git a/tests/integration/native-image/mp-1/src/main/java/module-info.java b/tests/integration/native-image/mp-1/src/main/java/module-info.java
    index 5c97c50d350..1a093c0a84d 100644
    --- a/tests/integration/native-image/mp-1/src/main/java/module-info.java
    +++ b/tests/integration/native-image/mp-1/src/main/java/module-info.java
    @@ -31,6 +31,7 @@
         requires microprofile.rest.client.api;
         requires microprofile.metrics.api;
         requires java.json.bind;
    +    requires microprofile.config.api;
     
         exports io.helidon.tests.integration.nativeimage.mp1;
     
    
    From 7fcca63cc93e160cd14e01f31ebd4dc62a1b3861 Mon Sep 17 00:00:00 2001
    From: Tomas Langer 
    Date: Tue, 5 May 2020 10:25:37 +0200
    Subject: [PATCH 09/12] Extra semicolon.
    
    Signed-off-by: Tomas Langer 
    ---
     .../src/main/java/io/helidon/config/mp/MpConfigBuilder.java     | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java
    index bd8ab467914..9ddf8e6922c 100644
    --- a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java
    +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigBuilder.java
    @@ -171,7 +171,7 @@ public Config build() {
             addBuiltIn(converters, Instant.class, ConfigMappers::toInstant);
             addBuiltIn(converters, OffsetTime.class, ConfigMappers::toOffsetTime);
             addBuiltIn(converters, OffsetDateTime.class, ConfigMappers::toOffsetDateTime);
    -        addBuiltIn(converters, YearMonth.class, YearMonth::parse); ;
    +        addBuiltIn(converters, YearMonth.class, YearMonth::parse);
             //java.io
             addBuiltIn(converters, File.class, MpConfigBuilder::toFile);
             //java.nio
    
    From f87df80bc254d010b3252b1eca42c06f4614f779 Mon Sep 17 00:00:00 2001
    From: Tomas Langer 
    Date: Tue, 5 May 2020 11:17:05 +0200
    Subject: [PATCH 10/12] Review fixes.
    
    Signed-off-by: Tomas Langer 
    ---
     .../src/main/java/io/helidon/config/mp/MpConfigImpl.java        | 2 +-
     .../java/io/helidon/config/mp/MpEnvironmentVariablesSource.java | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java
    index ac55c0c65e2..dc31b77c9a0 100644
    --- a/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java
    +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpConfigImpl.java
    @@ -229,7 +229,7 @@ private Optional applyFilters(String propertyName, String stringValue) {
             String result = stringValue;
     
             for (MpConfigFilter filter : filters) {
    -            result = filter.apply(propertyName, stringValue);
    +            result = filter.apply(propertyName, result);
             }
     
             return Optional.ofNullable(result);
    diff --git a/config/config-mp/src/main/java/io/helidon/config/mp/MpEnvironmentVariablesSource.java b/config/config-mp/src/main/java/io/helidon/config/mp/MpEnvironmentVariablesSource.java
    index 2fc6fb6f9e4..9b6cad6e3f4 100644
    --- a/config/config-mp/src/main/java/io/helidon/config/mp/MpEnvironmentVariablesSource.java
    +++ b/config/config-mp/src/main/java/io/helidon/config/mp/MpEnvironmentVariablesSource.java
    @@ -44,7 +44,7 @@ public Map getProperties() {
         @Override
         public String getValue(String propertyName) {
             // environment variable config source is immutable - we can safely cache all requested keys, so we
    -        // not not execute the regular expression on every get
    +        // do not execute the regular expression on every get
             return cache.computeIfAbsent(propertyName, theKey -> {
                 // According to the spec, we have three ways of looking for a property
                 // 1. Exact match
    
    From 7441303f2ece5ba42dc51b269244710159838e65 Mon Sep 17 00:00:00 2001
    From: Tomas Langer 
    Date: Tue, 5 May 2020 13:23:22 +0200
    Subject: [PATCH 11/12] Review fixes #2.
    
    Signed-off-by: Tomas Langer 
    ---
     .../helidon/config/encryption/EncryptionFilter.java   |  2 +-
     .../helidon/config/encryption/MpEncryptionFilter.java |  2 +-
     .../arquillian/HelidonDeployableContainer.java        | 11 +++++------
     3 files changed, 7 insertions(+), 8 deletions(-)
    
    diff --git a/config/encryption/src/main/java/io/helidon/config/encryption/EncryptionFilter.java b/config/encryption/src/main/java/io/helidon/config/encryption/EncryptionFilter.java
    index a8d5a67400a..ff39774d039 100644
    --- a/config/encryption/src/main/java/io/helidon/config/encryption/EncryptionFilter.java
    +++ b/config/encryption/src/main/java/io/helidon/config/encryption/EncryptionFilter.java
    @@ -37,7 +37,7 @@
      * 

    * Password in properties must be stored as follows: *

      - *
    • ${AES=base64} - encrypted password using a master password (must be provided to Prime through configuration, system + *
    • ${AES=base64} - encrypted password using a master password (must be provided to prime through configuration, system * property or environment variable)
    • *
    • ${RSA=base64} - encrypted password using a public key (private key must be available to Prime instance, * its location must be provided to prime through configuration, system property or environment variable)
    • diff --git a/config/encryption/src/main/java/io/helidon/config/encryption/MpEncryptionFilter.java b/config/encryption/src/main/java/io/helidon/config/encryption/MpEncryptionFilter.java index fb3089401a3..c72740f8a47 100644 --- a/config/encryption/src/main/java/io/helidon/config/encryption/MpEncryptionFilter.java +++ b/config/encryption/src/main/java/io/helidon/config/encryption/MpEncryptionFilter.java @@ -35,7 +35,7 @@ *

      * Password in properties must be stored as follows: *

        - *
      • ${AES=base64} - encrypted password using a master password (must be provided to Prime through configuration, system + *
      • ${AES=base64} - encrypted password using a master password (must be provided to prime through configuration, system * property or environment variable)
      • *
      • ${RSA=base64} - encrypted password using a public key (private key must be available to Prime instance, * its location must be provided to prime through configuration, system property or environment variable)
      • diff --git a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java index 91a4182aeb9..81b8767c8ab 100644 --- a/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java +++ b/microprofile/tests/arquillian/src/main/java/io/helidon/microprofile/arquillian/HelidonDeployableContainer.java @@ -80,6 +80,8 @@ */ public class HelidonDeployableContainer implements DeployableContainer { private static final Logger LOGGER = Logger.getLogger(HelidonDeployableContainer.class.getName()); + // runnables that must be executed on stop + private static final ConcurrentLinkedQueue STOP_RUNNABLES = new ConcurrentLinkedQueue<>(); /** * The configuration for this container. @@ -91,7 +93,6 @@ public class HelidonDeployableContainer implements DeployableContainer contexts = new HashMap<>(); - private static ConcurrentLinkedQueue stopCalls = new ConcurrentLinkedQueue<>(); private Server dummyServer = null; @Override @@ -121,7 +122,6 @@ public void start() { @Override public void stop() { - // No-op if (null != dummyServer) { dummyServer.stop(); } @@ -130,7 +130,6 @@ public void stop() { @Override public ProtocolDescription getDefaultProtocol() { return new ProtocolDescription(HelidonLocalProtocol.PROTOCOL_NAME); - // return new ProtocolDescription(LocalProtocol.NAME); } @Override @@ -203,7 +202,7 @@ void startServer(RunContext context, Path[] classPath) .getDeclaredConstructor() .newInstance(); - stopCalls.add(() -> { + STOP_RUNNABLES.add(() -> { try { context.runnerClass.getDeclaredMethod("stop").invoke(context.runner); } catch (ReflectiveOperationException e) { @@ -349,10 +348,10 @@ public void undeploy(Archive archive) { } void stopAll() { - Runnable polled = stopCalls.poll(); + Runnable polled = STOP_RUNNABLES.poll(); while (Objects.nonNull(polled)) { polled.run(); - polled = stopCalls.poll(); + polled = STOP_RUNNABLES.poll(); } dummyServer.stop(); } From 407a005b8d7020c69c535117d27228dfad620b4a Mon Sep 17 00:00:00 2001 From: Tomas Langer Date: Tue, 5 May 2020 21:44:00 +0200 Subject: [PATCH 12/12] Reverted accidental change. --- examples/todo-app/frontend/package-lock.json | 2901 +++++++++--------- 1 file changed, 1441 insertions(+), 1460 deletions(-) diff --git a/examples/todo-app/frontend/package-lock.json b/examples/todo-app/frontend/package-lock.json index ee392fc651c..8bcc0076441 100644 --- a/examples/todo-app/frontend/package-lock.json +++ b/examples/todo-app/frontend/package-lock.json @@ -20,7 +20,7 @@ "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", "dev": true, "requires": { - "acorn": "^4.0.3" + "acorn": "4.0.13" }, "dependencies": { "acorn": { @@ -37,10 +37,10 @@ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" } }, "ajv-keywords": { @@ -55,9 +55,9 @@ "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" } }, "alphanum-sort": { @@ -84,8 +84,8 @@ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "micromatch": "3.1.10", + "normalize-path": "2.1.1" }, "dependencies": { "normalize-path": { @@ -94,7 +94,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } } } @@ -111,7 +111,7 @@ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "sprintf-js": "1.0.3" } }, "arr-diff": { @@ -144,9 +144,9 @@ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "bn.js": "4.11.8", + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" } }, "assert": { @@ -155,7 +155,7 @@ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { - "object-assign": "^4.1.1", + "object-assign": "4.1.1", "util": "0.10.3" }, "dependencies": { @@ -194,7 +194,7 @@ "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "dev": true, "requires": { - "lodash": "^4.17.14" + "lodash": "4.17.15" } }, "async-each": { @@ -215,12 +215,12 @@ "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "dev": true, "requires": { - "browserslist": "^1.7.6", - "caniuse-db": "^1.0.30000634", - "normalize-range": "^0.1.2", - "num2fraction": "^1.2.2", - "postcss": "^5.2.16", - "postcss-value-parser": "^3.2.3" + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000992", + "normalize-range": "0.1.2", + "num2fraction": "1.2.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" } }, "babel-code-frame": { @@ -229,9 +229,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "chalk": "1.1.3", + "esutils": "2.0.3", + "js-tokens": "3.0.2" } }, "balanced-match": { @@ -246,13 +246,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.3.0", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.2", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -261,7 +261,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -270,7 +270,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -279,7 +279,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -288,9 +288,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -343,7 +343,7 @@ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" }, "dependencies": { @@ -361,16 +361,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -379,7 +379,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -396,12 +396,12 @@ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.4", + "safe-buffer": "5.2.0" } }, "browserify-cipher": { @@ -410,9 +410,9 @@ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "browserify-aes": "1.2.0", + "browserify-des": "1.0.2", + "evp_bytestokey": "1.0.3" } }, "browserify-des": { @@ -421,10 +421,10 @@ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.4", + "safe-buffer": "5.2.0" } }, "browserify-rsa": { @@ -433,8 +433,8 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "bn.js": "4.11.8", + "randombytes": "2.1.0" } }, "browserify-sign": { @@ -443,13 +443,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "^4.1.1", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.2", - "elliptic": "^6.0.0", - "inherits": "^2.0.1", - "parse-asn1": "^5.0.0" + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.5.1", + "inherits": "2.0.4", + "parse-asn1": "5.1.4" } }, "browserify-zlib": { @@ -458,7 +458,7 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "~1.0.5" + "pako": "1.0.10" } }, "browserslist": { @@ -467,8 +467,8 @@ "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "dev": true, "requires": { - "caniuse-db": "^1.0.30000639", - "electron-to-chromium": "^1.2.7" + "caniuse-db": "1.0.30000992", + "electron-to-chromium": "1.3.252" } }, "buffer": { @@ -477,9 +477,9 @@ "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "base64-js": "1.3.1", + "ieee754": "1.1.13", + "isarray": "1.0.0" } }, "buffer-from": { @@ -506,19 +506,19 @@ "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", "dev": true, "requires": { - "bluebird": "^3.5.1", - "chownr": "^1.0.1", - "glob": "^7.1.2", - "graceful-fs": "^4.1.11", - "lru-cache": "^4.1.1", - "mississippi": "^2.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.2", - "ssri": "^5.2.4", - "unique-filename": "^1.1.0", - "y18n": "^4.0.0" + "bluebird": "3.5.5", + "chownr": "1.1.2", + "glob": "7.1.4", + "graceful-fs": "4.2.2", + "lru-cache": "4.1.5", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.7.1", + "ssri": "5.3.0", + "unique-filename": "1.1.1", + "y18n": "4.0.0" } }, "cache-base": { @@ -527,15 +527,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "collection-visit": "1.0.0", + "component-emitter": "1.3.0", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.1", + "to-object-path": "0.3.0", + "union-value": "1.0.1", + "unset-value": "1.0.0" } }, "caller-callsite": { @@ -544,7 +544,7 @@ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { - "callsites": "^2.0.0" + "callsites": "2.0.0" } }, "caller-path": { @@ -553,7 +553,7 @@ "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, "requires": { - "caller-callsite": "^2.0.0" + "caller-callsite": "2.0.0" } }, "callsites": { @@ -568,8 +568,8 @@ "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", "dev": true, "requires": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" + "no-case": "2.3.2", + "upper-case": "1.1.3" } }, "camelcase": { @@ -584,10 +584,10 @@ "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "dev": true, "requires": { - "browserslist": "^1.3.6", - "caniuse-db": "^1.0.30000529", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "browserslist": "1.7.7", + "caniuse-db": "1.0.30000992", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" } }, "caniuse-db": { @@ -608,8 +608,8 @@ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", "dev": true, "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" + "align-text": "0.1.4", + "lazy-cache": "1.0.4" } }, "chalk": { @@ -618,11 +618,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "chokidar": { @@ -631,18 +631,18 @@ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" + "anymatch": "2.0.0", + "async-each": "1.0.3", + "braces": "2.3.2", + "fsevents": "1.2.9", + "glob-parent": "3.1.0", + "inherits": "2.0.4", + "is-binary-path": "1.0.1", + "is-glob": "4.0.1", + "normalize-path": "3.0.0", + "path-is-absolute": "1.0.1", + "readdirp": "2.2.1", + "upath": "1.2.0" } }, "chownr": { @@ -657,8 +657,8 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.4", + "safe-buffer": "5.2.0" } }, "clap": { @@ -667,7 +667,7 @@ "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", "dev": true, "requires": { - "chalk": "^1.1.3" + "chalk": "1.1.3" } }, "class-utils": { @@ -676,10 +676,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "define-property": { @@ -688,7 +688,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -699,7 +699,7 @@ "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", "dev": true, "requires": { - "source-map": "~0.6.0" + "source-map": "0.6.1" }, "dependencies": { "source-map": { @@ -716,8 +716,8 @@ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", "dev": true, "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", + "center-align": "0.1.3", + "right-align": "0.1.3", "wordwrap": "0.0.2" } }, @@ -739,7 +739,7 @@ "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", "dev": true, "requires": { - "q": "^1.1.2" + "q": "1.5.1" } }, "code-point-at": { @@ -754,8 +754,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "color": { @@ -764,9 +764,9 @@ "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", "dev": true, "requires": { - "clone": "^1.0.2", - "color-convert": "^1.3.0", - "color-string": "^0.3.0" + "clone": "1.0.4", + "color-convert": "1.9.3", + "color-string": "0.3.0" } }, "color-convert": { @@ -790,7 +790,7 @@ "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", "dev": true, "requires": { - "color-name": "^1.0.0" + "color-name": "1.1.3" } }, "colormin": { @@ -799,9 +799,9 @@ "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", "dev": true, "requires": { - "color": "^0.11.0", + "color": "0.11.4", "css-color-names": "0.0.4", - "has": "^1.0.1" + "has": "1.0.3" } }, "colors": { @@ -840,10 +840,10 @@ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "buffer-from": "1.1.1", + "inherits": "2.0.4", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" }, "dependencies": { "readable-stream": { @@ -852,13 +852,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -873,7 +873,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -884,7 +884,7 @@ "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", "dev": true, "requires": { - "date-now": "^0.1.4" + "date-now": "0.1.4" } }, "constants-browserify": { @@ -899,12 +899,12 @@ "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.7.1", + "run-queue": "1.0.3" } }, "copy-descriptor": { @@ -925,10 +925,10 @@ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "import-fresh": "^2.0.0", - "is-directory": "^0.3.1", - "js-yaml": "^3.13.1", - "parse-json": "^4.0.0" + "import-fresh": "2.0.0", + "is-directory": "0.3.1", + "js-yaml": "3.13.1", + "parse-json": "4.0.0" }, "dependencies": { "esprima": { @@ -943,8 +943,8 @@ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.1" } } } @@ -955,8 +955,8 @@ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "bn.js": "4.11.8", + "elliptic": "6.5.1" } }, "create-hash": { @@ -965,11 +965,11 @@ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "cipher-base": "1.0.4", + "inherits": "2.0.4", + "md5.js": "1.3.5", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" } }, "create-hmac": { @@ -978,12 +978,12 @@ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.4", + "ripemd160": "2.0.2", + "safe-buffer": "5.2.0", + "sha.js": "2.4.11" } }, "cross-spawn": { @@ -992,9 +992,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "lru-cache": "4.1.5", + "shebang-command": "1.2.0", + "which": "1.3.1" } }, "crypto-browserify": { @@ -1003,17 +1003,17 @@ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.4", + "pbkdf2": "3.0.17", + "public-encrypt": "4.0.3", + "randombytes": "2.1.0", + "randomfill": "1.0.4" } }, "css-color-names": { @@ -1028,8 +1028,8 @@ "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", "dev": true, "requires": { - "postcss": "^7.0.1", - "timsort": "^0.3.0" + "postcss": "7.0.18", + "timsort": "0.3.0" }, "dependencies": { "ansi-styles": { @@ -1038,7 +1038,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -1047,9 +1047,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -1058,7 +1058,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -1075,9 +1075,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "source-map": { @@ -1092,7 +1092,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -1103,20 +1103,20 @@ "integrity": "sha512-wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==", "dev": true, "requires": { - "babel-code-frame": "^6.26.0", - "css-selector-tokenizer": "^0.7.0", - "cssnano": "^3.10.0", - "icss-utils": "^2.1.0", - "loader-utils": "^1.0.2", - "lodash.camelcase": "^4.3.0", - "object-assign": "^4.1.1", - "postcss": "^5.0.6", - "postcss-modules-extract-imports": "^1.2.0", - "postcss-modules-local-by-default": "^1.2.0", - "postcss-modules-scope": "^1.1.0", - "postcss-modules-values": "^1.3.0", - "postcss-value-parser": "^3.3.0", - "source-list-map": "^2.0.0" + "babel-code-frame": "6.26.0", + "css-selector-tokenizer": "0.7.1", + "cssnano": "3.10.0", + "icss-utils": "2.1.0", + "loader-utils": "1.2.3", + "lodash.camelcase": "4.3.0", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-modules-extract-imports": "1.2.1", + "postcss-modules-local-by-default": "1.2.0", + "postcss-modules-scope": "1.1.0", + "postcss-modules-values": "1.3.0", + "postcss-value-parser": "3.3.1", + "source-list-map": "2.0.1" } }, "css-select": { @@ -1125,10 +1125,10 @@ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", "dev": true, "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", + "boolbase": "1.0.0", + "css-what": "2.1.3", "domutils": "1.5.1", - "nth-check": "~1.0.1" + "nth-check": "1.0.2" } }, "css-select-base-adapter": { @@ -1143,9 +1143,9 @@ "integrity": "sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==", "dev": true, "requires": { - "cssesc": "^0.1.0", - "fastparse": "^1.1.1", - "regexpu-core": "^1.0.0" + "cssesc": "0.1.0", + "fastparse": "1.1.2", + "regexpu-core": "1.0.0" } }, "css-tree": { @@ -1155,7 +1155,7 @@ "dev": true, "requires": { "mdn-data": "2.0.4", - "source-map": "^0.5.3" + "source-map": "0.5.7" } }, "css-unit-converter": { @@ -1182,38 +1182,38 @@ "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", "dev": true, "requires": { - "autoprefixer": "^6.3.1", - "decamelize": "^1.1.2", - "defined": "^1.0.0", - "has": "^1.0.1", - "object-assign": "^4.0.1", - "postcss": "^5.0.14", - "postcss-calc": "^5.2.0", - "postcss-colormin": "^2.1.8", - "postcss-convert-values": "^2.3.4", - "postcss-discard-comments": "^2.0.4", - "postcss-discard-duplicates": "^2.0.1", - "postcss-discard-empty": "^2.0.1", - "postcss-discard-overridden": "^0.1.1", - "postcss-discard-unused": "^2.2.1", - "postcss-filter-plugins": "^2.0.0", - "postcss-merge-idents": "^2.1.5", - "postcss-merge-longhand": "^2.0.1", - "postcss-merge-rules": "^2.0.3", - "postcss-minify-font-values": "^1.0.2", - "postcss-minify-gradients": "^1.0.1", - "postcss-minify-params": "^1.0.4", - "postcss-minify-selectors": "^2.0.4", - "postcss-normalize-charset": "^1.1.0", - "postcss-normalize-url": "^3.0.7", - "postcss-ordered-values": "^2.1.0", - "postcss-reduce-idents": "^2.2.2", - "postcss-reduce-initial": "^1.0.0", - "postcss-reduce-transforms": "^1.0.3", - "postcss-svgo": "^2.1.1", - "postcss-unique-selectors": "^2.0.2", - "postcss-value-parser": "^3.2.3", - "postcss-zindex": "^2.0.1" + "autoprefixer": "6.7.7", + "decamelize": "1.2.0", + "defined": "1.0.0", + "has": "1.0.3", + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-calc": "5.3.1", + "postcss-colormin": "2.2.2", + "postcss-convert-values": "2.6.1", + "postcss-discard-comments": "2.0.4", + "postcss-discard-duplicates": "2.1.0", + "postcss-discard-empty": "2.1.0", + "postcss-discard-overridden": "0.1.1", + "postcss-discard-unused": "2.2.3", + "postcss-filter-plugins": "2.0.3", + "postcss-merge-idents": "2.1.7", + "postcss-merge-longhand": "2.0.2", + "postcss-merge-rules": "2.1.2", + "postcss-minify-font-values": "1.0.5", + "postcss-minify-gradients": "1.0.5", + "postcss-minify-params": "1.2.2", + "postcss-minify-selectors": "2.1.1", + "postcss-normalize-charset": "1.1.1", + "postcss-normalize-url": "3.0.8", + "postcss-ordered-values": "2.2.3", + "postcss-reduce-idents": "2.4.0", + "postcss-reduce-initial": "1.0.1", + "postcss-reduce-transforms": "1.0.4", + "postcss-svgo": "2.1.6", + "postcss-unique-selectors": "2.0.2", + "postcss-value-parser": "3.3.1", + "postcss-zindex": "2.2.0" } }, "cssnano-preset-default": { @@ -1222,36 +1222,36 @@ "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", "dev": true, "requires": { - "css-declaration-sorter": "^4.0.1", - "cssnano-util-raw-cache": "^4.0.1", - "postcss": "^7.0.0", - "postcss-calc": "^7.0.1", - "postcss-colormin": "^4.0.3", - "postcss-convert-values": "^4.0.1", - "postcss-discard-comments": "^4.0.2", - "postcss-discard-duplicates": "^4.0.2", - "postcss-discard-empty": "^4.0.1", - "postcss-discard-overridden": "^4.0.1", - "postcss-merge-longhand": "^4.0.11", - "postcss-merge-rules": "^4.0.3", - "postcss-minify-font-values": "^4.0.2", - "postcss-minify-gradients": "^4.0.2", - "postcss-minify-params": "^4.0.2", - "postcss-minify-selectors": "^4.0.2", - "postcss-normalize-charset": "^4.0.1", - "postcss-normalize-display-values": "^4.0.2", - "postcss-normalize-positions": "^4.0.2", - "postcss-normalize-repeat-style": "^4.0.2", - "postcss-normalize-string": "^4.0.2", - "postcss-normalize-timing-functions": "^4.0.2", - "postcss-normalize-unicode": "^4.0.1", - "postcss-normalize-url": "^4.0.1", - "postcss-normalize-whitespace": "^4.0.2", - "postcss-ordered-values": "^4.1.2", - "postcss-reduce-initial": "^4.0.3", - "postcss-reduce-transforms": "^4.0.2", - "postcss-svgo": "^4.0.2", - "postcss-unique-selectors": "^4.0.1" + "css-declaration-sorter": "4.0.1", + "cssnano-util-raw-cache": "4.0.1", + "postcss": "7.0.18", + "postcss-calc": "7.0.1", + "postcss-colormin": "4.0.3", + "postcss-convert-values": "4.0.1", + "postcss-discard-comments": "4.0.2", + "postcss-discard-duplicates": "4.0.2", + "postcss-discard-empty": "4.0.1", + "postcss-discard-overridden": "4.0.1", + "postcss-merge-longhand": "4.0.11", + "postcss-merge-rules": "4.0.3", + "postcss-minify-font-values": "4.0.2", + "postcss-minify-gradients": "4.0.2", + "postcss-minify-params": "4.0.2", + "postcss-minify-selectors": "4.0.2", + "postcss-normalize-charset": "4.0.1", + "postcss-normalize-display-values": "4.0.2", + "postcss-normalize-positions": "4.0.2", + "postcss-normalize-repeat-style": "4.0.2", + "postcss-normalize-string": "4.0.2", + "postcss-normalize-timing-functions": "4.0.2", + "postcss-normalize-unicode": "4.0.1", + "postcss-normalize-url": "4.0.1", + "postcss-normalize-whitespace": "4.0.2", + "postcss-ordered-values": "4.1.2", + "postcss-reduce-initial": "4.0.3", + "postcss-reduce-transforms": "4.0.2", + "postcss-svgo": "4.0.2", + "postcss-unique-selectors": "4.0.1" }, "dependencies": { "ansi-styles": { @@ -1260,7 +1260,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "browserslist": { @@ -1269,9 +1269,9 @@ "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "caniuse-lite": "1.0.30000989", + "electron-to-chromium": "1.3.252", + "node-releases": "1.1.29" } }, "caniuse-api": { @@ -1280,10 +1280,10 @@ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" + "browserslist": "4.7.0", + "caniuse-lite": "1.0.30000989", + "lodash.memoize": "4.1.2", + "lodash.uniq": "4.5.0" } }, "chalk": { @@ -1292,9 +1292,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -1303,7 +1303,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -1314,9 +1314,9 @@ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, "requires": { - "@types/q": "^1.5.1", - "chalk": "^2.4.1", - "q": "^1.1.2" + "@types/q": "1.5.2", + "chalk": "2.4.2", + "q": "1.5.1" } }, "color": { @@ -1325,8 +1325,8 @@ "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "dev": true, "requires": { - "color-convert": "^1.9.1", - "color-string": "^1.5.2" + "color-convert": "1.9.3", + "color-string": "1.5.3" } }, "color-string": { @@ -1335,8 +1335,8 @@ "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", "dev": true, "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" + "color-name": "1.1.3", + "simple-swizzle": "0.2.2" } }, "css-select": { @@ -1345,10 +1345,10 @@ "integrity": "sha512-dSpYaDVoWaELjvZ3mS6IKZM/y2PMPa/XYoEfYNZePL4U/XgyxZNroHEHReDx/d+VgXh9VbCTtFqLkFbmeqeaRQ==", "dev": true, "requires": { - "boolbase": "^1.0.0", - "css-what": "^2.1.2", - "domutils": "^1.7.0", - "nth-check": "^1.0.2" + "boolbase": "1.0.0", + "css-what": "2.1.3", + "domutils": "1.7.0", + "nth-check": "1.0.2" } }, "cssesc": { @@ -1372,8 +1372,8 @@ "integrity": "sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg==", "dev": true, "requires": { - "mdn-data": "~1.1.0", - "source-map": "^0.5.3" + "mdn-data": "1.1.4", + "source-map": "0.5.7" } }, "source-map": { @@ -1390,8 +1390,8 @@ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "0.2.1", + "domelementtype": "1.3.1" } }, "esprima": { @@ -1412,7 +1412,7 @@ "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", "dev": true, "requires": { - "html-comment-regex": "^1.1.0" + "html-comment-regex": "1.1.2" } }, "js-yaml": { @@ -1421,8 +1421,8 @@ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "1.0.10", + "esprima": "4.0.1" } }, "mdn-data": { @@ -1443,9 +1443,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "postcss-calc": { @@ -1454,10 +1454,10 @@ "integrity": "sha512-oXqx0m6tb4N3JGdmeMSc/i91KppbYsFZKdH0xMOqK8V1rJlzrKlTdokz8ozUXLVejydRN6u2IddxpcijRj2FqQ==", "dev": true, "requires": { - "css-unit-converter": "^1.1.1", - "postcss": "^7.0.5", - "postcss-selector-parser": "^5.0.0-rc.4", - "postcss-value-parser": "^3.3.1" + "css-unit-converter": "1.1.1", + "postcss": "7.0.18", + "postcss-selector-parser": "5.0.0", + "postcss-value-parser": "3.3.1" } }, "postcss-colormin": { @@ -1466,11 +1466,11 @@ "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "color": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "browserslist": "4.7.0", + "color": "3.1.2", + "has": "1.0.3", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" } }, "postcss-convert-values": { @@ -1479,8 +1479,8 @@ "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" } }, "postcss-discard-comments": { @@ -1489,7 +1489,7 @@ "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.18" } }, "postcss-discard-duplicates": { @@ -1498,7 +1498,7 @@ "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.18" } }, "postcss-discard-empty": { @@ -1507,7 +1507,7 @@ "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.18" } }, "postcss-discard-overridden": { @@ -1516,7 +1516,7 @@ "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.18" } }, "postcss-merge-longhand": { @@ -1526,9 +1526,9 @@ "dev": true, "requires": { "css-color-names": "0.0.4", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "stylehacks": "^4.0.0" + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1", + "stylehacks": "4.0.3" } }, "postcss-merge-rules": { @@ -1537,12 +1537,12 @@ "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "cssnano-util-same-parent": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0", - "vendors": "^1.0.0" + "browserslist": "4.7.0", + "caniuse-api": "3.0.0", + "cssnano-util-same-parent": "4.0.1", + "postcss": "7.0.18", + "postcss-selector-parser": "3.1.1", + "vendors": "1.0.3" }, "dependencies": { "postcss-selector-parser": { @@ -1551,9 +1551,9 @@ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "dev": true, "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } } } @@ -1564,8 +1564,8 @@ "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" } }, "postcss-minify-gradients": { @@ -1574,10 +1574,10 @@ "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "is-color-stop": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-arguments": "4.0.0", + "is-color-stop": "1.1.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" } }, "postcss-minify-params": { @@ -1586,12 +1586,12 @@ "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "dev": true, "requires": { - "alphanum-sort": "^1.0.0", - "browserslist": "^4.0.0", - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "uniqs": "^2.0.0" + "alphanum-sort": "1.0.2", + "browserslist": "4.7.0", + "cssnano-util-get-arguments": "4.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1", + "uniqs": "2.0.0" } }, "postcss-minify-selectors": { @@ -1600,10 +1600,10 @@ "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "dev": true, "requires": { - "alphanum-sort": "^1.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" + "alphanum-sort": "1.0.2", + "has": "1.0.3", + "postcss": "7.0.18", + "postcss-selector-parser": "3.1.1" }, "dependencies": { "postcss-selector-parser": { @@ -1612,9 +1612,9 @@ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "dev": true, "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } } } @@ -1625,7 +1625,7 @@ "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.18" } }, "postcss-normalize-url": { @@ -1634,10 +1634,10 @@ "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "dev": true, "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "is-absolute-url": "2.1.0", + "normalize-url": "3.3.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" } }, "postcss-ordered-values": { @@ -1646,9 +1646,9 @@ "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-arguments": "4.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" } }, "postcss-reduce-initial": { @@ -1657,10 +1657,10 @@ "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "caniuse-api": "^3.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0" + "browserslist": "4.7.0", + "caniuse-api": "3.0.0", + "has": "1.0.3", + "postcss": "7.0.18" } }, "postcss-reduce-transforms": { @@ -1669,10 +1669,10 @@ "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-match": "4.0.0", + "has": "1.0.3", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" } }, "postcss-selector-parser": { @@ -1681,9 +1681,9 @@ "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "cssesc": "^2.0.0", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "cssesc": "2.0.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } }, "postcss-svgo": { @@ -1692,10 +1692,10 @@ "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", "dev": true, "requires": { - "is-svg": "^3.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0", - "svgo": "^1.0.0" + "is-svg": "3.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1", + "svgo": "1.3.0" } }, "postcss-unique-selectors": { @@ -1704,9 +1704,9 @@ "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", "dev": true, "requires": { - "alphanum-sort": "^1.0.0", - "postcss": "^7.0.0", - "uniqs": "^2.0.0" + "alphanum-sort": "1.0.2", + "postcss": "7.0.18", + "uniqs": "2.0.0" } }, "source-map": { @@ -1721,7 +1721,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } }, "svgo": { @@ -1730,19 +1730,19 @@ "integrity": "sha512-MLfUA6O+qauLDbym+mMZgtXCGRfIxyQoeH6IKVcFslyODEe/ElJNwr0FohQ3xG4C6HK6bk3KYPPXwHVJk3V5NQ==", "dev": true, "requires": { - "chalk": "^2.4.1", - "coa": "^2.0.2", - "css-select": "^2.0.0", - "css-select-base-adapter": "^0.1.1", + "chalk": "2.4.2", + "coa": "2.0.2", + "css-select": "2.0.2", + "css-select-base-adapter": "0.1.1", "css-tree": "1.0.0-alpha.33", - "csso": "^3.5.1", - "js-yaml": "^3.13.1", - "mkdirp": "~0.5.1", - "object.values": "^1.1.0", - "sax": "~1.2.4", - "stable": "^0.1.8", - "unquote": "~1.1.1", - "util.promisify": "~1.0.0" + "csso": "3.5.1", + "js-yaml": "3.13.1", + "mkdirp": "0.5.1", + "object.values": "1.1.0", + "sax": "1.2.4", + "stable": "0.1.8", + "unquote": "1.1.1", + "util.promisify": "1.0.0" } } } @@ -1765,7 +1765,7 @@ "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", "dev": true, "requires": { - "postcss": "^7.0.0" + "postcss": "7.0.18" }, "dependencies": { "ansi-styles": { @@ -1774,7 +1774,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -1783,9 +1783,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -1794,7 +1794,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -1811,9 +1811,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "source-map": { @@ -1828,7 +1828,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -1845,8 +1845,8 @@ "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", "dev": true, "requires": { - "clap": "^1.0.9", - "source-map": "^0.5.3" + "clap": "1.2.3", + "source-map": "0.5.7" } }, "cyclist": { @@ -1861,8 +1861,8 @@ "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", "dev": true, "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" + "es5-ext": "0.10.51", + "type": "1.0.3" } }, "date-now": { @@ -1898,7 +1898,7 @@ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "object-keys": "^1.0.12" + "object-keys": "1.1.1" } }, "define-property": { @@ -1907,8 +1907,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -1917,7 +1917,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1926,7 +1926,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1935,9 +1935,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -1960,8 +1960,8 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "dev": true, "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" } }, "diffie-hellman": { @@ -1970,9 +1970,9 @@ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.1.0" } }, "dom-converter": { @@ -1981,7 +1981,7 @@ "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", "dev": true, "requires": { - "utila": "~0.4" + "utila": "0.4.0" } }, "dom-serializer": { @@ -1990,8 +1990,8 @@ "integrity": "sha512-sK3ujri04WyjwQXVoK4PU3y8ula1stq10GJZpqHIUgoGZdsGzAGu65BnU3d08aTVSvO7mGPZUc0wTEDL+qGE0Q==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" + "domelementtype": "2.0.1", + "entities": "2.0.0" }, "dependencies": { "domelementtype": { @@ -2020,7 +2020,7 @@ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", "dev": true, "requires": { - "domelementtype": "1" + "domelementtype": "1.3.1" } }, "domutils": { @@ -2029,8 +2029,8 @@ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", "dev": true, "requires": { - "dom-serializer": "0", - "domelementtype": "1" + "dom-serializer": "0.2.1", + "domelementtype": "1.3.1" } }, "dot-prop": { @@ -2039,7 +2039,7 @@ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "is-obj": "^1.0.0" + "is-obj": "1.0.1" } }, "duplexify": { @@ -2048,10 +2048,10 @@ "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "inherits": "2.0.4", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" }, "dependencies": { "readable-stream": { @@ -2060,13 +2060,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -2081,7 +2081,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -2098,13 +2098,13 @@ "integrity": "sha512-xvJINNLbTeWQjrl6X+7eQCrIy/YPv5XCpKW6kB5mKvtnGILoLDcySuwomfdzt0BMdLNVnuRNTuzKNHj0bva1Cg==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.7", + "hmac-drbg": "1.0.1", + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" } }, "emojis-list": { @@ -2119,7 +2119,7 @@ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "enhanced-resolve": { @@ -2128,10 +2128,10 @@ "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.4.0", - "object-assign": "^4.0.1", - "tapable": "^0.2.7" + "graceful-fs": "4.2.2", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.9" }, "dependencies": { "tapable": { @@ -2154,7 +2154,7 @@ "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "~1.0.1" + "prr": "1.0.1" } }, "error-ex": { @@ -2163,7 +2163,7 @@ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { - "is-arrayish": "^0.2.1" + "is-arrayish": "0.2.1" } }, "es-abstract": { @@ -2172,16 +2172,16 @@ "integrity": "sha512-cp/Tb1oA/rh2X7vqeSOvM+TSo3UkJLX70eNihgVEvnzwAgikjkTFr/QVgRCaxjm0knCNQzNoxxxcw2zO2LJdZA==", "dev": true, "requires": { - "es-to-primitive": "^1.2.0", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.0", - "is-callable": "^1.1.4", - "is-regex": "^1.0.4", - "object-inspect": "^1.6.0", - "object-keys": "^1.1.1", - "string.prototype.trimleft": "^2.0.0", - "string.prototype.trimright": "^2.0.0" + "es-to-primitive": "1.2.0", + "function-bind": "1.1.1", + "has": "1.0.3", + "has-symbols": "1.0.0", + "is-callable": "1.1.4", + "is-regex": "1.0.4", + "object-inspect": "1.6.0", + "object-keys": "1.1.1", + "string.prototype.trimleft": "2.0.0", + "string.prototype.trimright": "2.0.0" } }, "es-to-primitive": { @@ -2190,9 +2190,9 @@ "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "1.1.4", + "is-date-object": "1.0.1", + "is-symbol": "1.0.2" } }, "es5-ext": { @@ -2201,9 +2201,9 @@ "integrity": "sha512-oRpWzM2WcLHVKpnrcyB7OW8j/s67Ba04JCm0WnNv3RiABSvs7mrQlutB8DBv793gKcp0XENR8Il8WxGTlZ73gQ==", "dev": true, "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.1", - "next-tick": "^1.0.0" + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.2", + "next-tick": "1.0.0" } }, "es6-iterator": { @@ -2212,9 +2212,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" + "d": "1.0.1", + "es5-ext": "0.10.51", + "es6-symbol": "3.1.2" } }, "es6-map": { @@ -2223,12 +2223,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", - "es6-set": "~0.1.5", - "es6-symbol": "~3.1.1", - "event-emitter": "~0.3.5" + "d": "1.0.1", + "es5-ext": "0.10.51", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.2", + "event-emitter": "0.3.5" } }, "es6-set": { @@ -2237,11 +2237,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14", - "es6-iterator": "~2.0.1", + "d": "1.0.1", + "es5-ext": "0.10.51", + "es6-iterator": "2.0.3", "es6-symbol": "3.1.1", - "event-emitter": "~0.3.5" + "event-emitter": "0.3.5" }, "dependencies": { "es6-symbol": { @@ -2250,8 +2250,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.1", + "es5-ext": "0.10.51" } } } @@ -2262,8 +2262,8 @@ "integrity": "sha512-/ZypxQsArlv+KHpGvng52/Iz8by3EQPxhmbuz8yFG89N/caTFBSbcXONDw0aMjy827gQg26XAjP4uXFvnfINmQ==", "dev": true, "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.51" + "d": "1.0.1", + "es5-ext": "0.10.51" } }, "es6-templates": { @@ -2272,8 +2272,8 @@ "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", "dev": true, "requires": { - "recast": "~0.11.12", - "through": "~2.3.6" + "recast": "0.11.23", + "through": "2.3.8" } }, "es6-weak-map": { @@ -2282,10 +2282,10 @@ "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" + "d": "1.0.1", + "es5-ext": "0.10.51", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.2" } }, "escape-string-regexp": { @@ -2300,10 +2300,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "^0.1.3", - "es6-weak-map": "^2.0.1", - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" + "es6-map": "0.1.5", + "es6-weak-map": "2.0.3", + "esrecurse": "4.2.1", + "estraverse": "4.3.0" } }, "esprima": { @@ -2318,7 +2318,7 @@ "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "^4.1.0" + "estraverse": "4.3.0" } }, "estraverse": { @@ -2339,8 +2339,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1", - "es5-ext": "~0.10.14" + "d": "1.0.1", + "es5-ext": "0.10.51" } }, "events": { @@ -2355,8 +2355,8 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "md5.js": "1.3.5", + "safe-buffer": "5.2.0" } }, "execa": { @@ -2365,13 +2365,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, "expand-brackets": { @@ -2380,13 +2380,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -2395,7 +2395,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -2404,7 +2404,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -2415,8 +2415,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -2425,7 +2425,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -2436,14 +2436,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -2452,7 +2452,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -2461,7 +2461,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -2470,7 +2470,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -2479,7 +2479,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -2488,9 +2488,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -2507,10 +2507,10 @@ "integrity": "sha512-bt/LZ4m5Rqt/Crl2HiKuAl/oqg0psx1tsTLkvWbJen1CtD+fftkZhMaQ9HOtY2gWsl2Wq+sABmMVi9z3DhKWQQ==", "dev": true, "requires": { - "async": "^2.4.1", - "loader-utils": "^1.1.0", - "schema-utils": "^0.3.0", - "webpack-sources": "^1.0.1" + "async": "2.6.3", + "loader-utils": "1.2.3", + "schema-utils": "0.3.0", + "webpack-sources": "1.4.3" } }, "fast-deep-equal": { @@ -2537,10 +2537,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -2549,7 +2549,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -2560,9 +2560,9 @@ "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^2.0.0" + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "2.0.0" } }, "find-up": { @@ -2571,7 +2571,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "^2.0.0" + "locate-path": "2.0.0" } }, "flatten": { @@ -2586,8 +2586,8 @@ "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "inherits": "2.0.4", + "readable-stream": "2.3.6" }, "dependencies": { "readable-stream": { @@ -2596,13 +2596,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -2617,7 +2617,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -2634,7 +2634,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "from2": { @@ -2643,8 +2643,8 @@ "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "inherits": "2.0.4", + "readable-stream": "2.3.6" }, "dependencies": { "readable-stream": { @@ -2653,13 +2653,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -2674,7 +2674,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -2685,10 +2685,10 @@ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "graceful-fs": "4.2.2", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" }, "dependencies": { "readable-stream": { @@ -2697,13 +2697,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -2718,7 +2718,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -2736,8 +2736,8 @@ "dev": true, "optional": true, "requires": { - "nan": "^2.12.1", - "node-pre-gyp": "^0.12.0" + "nan": "2.14.0", + "node-pre-gyp": "0.12.0" }, "dependencies": { "abbrev": { @@ -2749,8 +2749,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -2764,23 +2763,21 @@ "dev": true, "optional": true, "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" + "delegates": "1.0.0", + "readable-stream": "2.3.6" } }, "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -2793,20 +2790,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -2820,7 +2814,7 @@ "dev": true, "optional": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.1" } }, "deep-extend": { @@ -2847,7 +2841,7 @@ "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.3.5" } }, "fs.realpath": { @@ -2862,14 +2856,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.3" } }, "glob": { @@ -2878,12 +2872,12 @@ "dev": true, "optional": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "has-unicode": { @@ -2898,7 +2892,7 @@ "dev": true, "optional": true, "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": "2.1.2" } }, "ignore-walk": { @@ -2907,7 +2901,7 @@ "dev": true, "optional": true, "requires": { - "minimatch": "^3.0.4" + "minimatch": "3.0.4" } }, "inflight": { @@ -2916,15 +2910,14 @@ "dev": true, "optional": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -2936,9 +2929,8 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "isarray": { @@ -2951,25 +2943,22 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" + "safe-buffer": "5.1.2", + "yallist": "3.0.3" } }, "minizlib": { @@ -2978,14 +2967,13 @@ "dev": true, "optional": true, "requires": { - "minipass": "^2.2.1" + "minipass": "2.3.5" } }, "mkdirp": { "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -3002,9 +2990,9 @@ "dev": true, "optional": true, "requires": { - "debug": "^4.1.0", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "debug": "4.1.1", + "iconv-lite": "0.4.24", + "sax": "1.2.4" } }, "node-pre-gyp": { @@ -3013,16 +3001,16 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.3.0", + "nopt": "4.0.1", + "npm-packlist": "1.4.1", + "npmlog": "4.1.2", + "rc": "1.2.8", + "rimraf": "2.6.3", + "semver": "5.7.0", + "tar": "4.4.8" } }, "nopt": { @@ -3031,8 +3019,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1", - "osenv": "^0.1.4" + "abbrev": "1.1.1", + "osenv": "0.1.5" } }, "npm-bundled": { @@ -3047,8 +3035,8 @@ "dev": true, "optional": true, "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.6" } }, "npmlog": { @@ -3057,17 +3045,16 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" + "are-we-there-yet": "1.1.5", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" } }, "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -3079,9 +3066,8 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "os-homedir": { @@ -3102,8 +3088,8 @@ "dev": true, "optional": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" } }, "path-is-absolute": { @@ -3124,10 +3110,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" + "deep-extend": "0.6.0", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" }, "dependencies": { "minimist": { @@ -3144,13 +3130,13 @@ "dev": true, "optional": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "rimraf": { @@ -3159,14 +3145,13 @@ "dev": true, "optional": true, "requires": { - "glob": "^7.1.3" + "glob": "7.1.3" } }, "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -3202,11 +3187,10 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } }, "string_decoder": { @@ -3215,16 +3199,15 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } }, "strip-ansi": { "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-json-comments": { @@ -3239,13 +3222,13 @@ "dev": true, "optional": true, "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" + "chownr": "1.1.1", + "fs-minipass": "1.2.5", + "minipass": "2.3.5", + "minizlib": "1.2.1", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.2", + "yallist": "3.0.3" } }, "util-deprecate": { @@ -3260,20 +3243,18 @@ "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2 || 2" + "string-width": "1.0.2" } }, "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -3307,12 +3288,12 @@ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.4", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "glob-parent": { @@ -3321,8 +3302,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" }, "dependencies": { "is-glob": { @@ -3331,7 +3312,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } } } @@ -3348,7 +3329,7 @@ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "function-bind": "^1.1.1" + "function-bind": "1.1.1" } }, "has-ansi": { @@ -3357,7 +3338,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "has-flag": { @@ -3378,9 +3359,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" } }, "has-values": { @@ -3389,8 +3370,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "kind-of": { @@ -3399,7 +3380,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -3410,8 +3391,8 @@ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.4", + "safe-buffer": "5.2.0" } }, "hash.js": { @@ -3420,8 +3401,8 @@ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" + "inherits": "2.0.4", + "minimalistic-assert": "1.0.1" } }, "he": { @@ -3442,9 +3423,9 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" + "hash.js": "1.1.7", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" } }, "hosted-git-info": { @@ -3477,11 +3458,11 @@ "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", "dev": true, "requires": { - "es6-templates": "^0.2.3", - "fastparse": "^1.1.1", - "html-minifier": "^3.5.8", - "loader-utils": "^1.1.0", - "object-assign": "^4.1.1" + "es6-templates": "0.2.3", + "fastparse": "1.1.2", + "html-minifier": "3.5.21", + "loader-utils": "1.2.3", + "object-assign": "4.1.1" } }, "html-minifier": { @@ -3490,13 +3471,13 @@ "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", "dev": true, "requires": { - "camel-case": "3.0.x", - "clean-css": "4.2.x", - "commander": "2.17.x", - "he": "1.2.x", - "param-case": "2.1.x", - "relateurl": "0.2.x", - "uglify-js": "3.4.x" + "camel-case": "3.0.0", + "clean-css": "4.2.1", + "commander": "2.17.1", + "he": "1.2.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.4.10" } }, "html-webpack-plugin": { @@ -3505,12 +3486,12 @@ "integrity": "sha1-sBq71yOsqqeze2r0SS69oD2d03s=", "dev": true, "requires": { - "html-minifier": "^3.2.3", - "loader-utils": "^0.2.16", - "lodash": "^4.17.3", - "pretty-error": "^2.0.2", - "tapable": "^1.0.0", - "toposort": "^1.0.0", + "html-minifier": "3.5.21", + "loader-utils": "0.2.17", + "lodash": "4.17.15", + "pretty-error": "2.1.1", + "tapable": "1.1.3", + "toposort": "1.0.7", "util.promisify": "1.0.0" }, "dependencies": { @@ -3532,10 +3513,10 @@ "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", "dev": true, "requires": { - "big.js": "^3.1.3", - "emojis-list": "^2.0.0", - "json5": "^0.5.0", - "object-assign": "^4.0.1" + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" } } } @@ -3546,12 +3527,12 @@ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" + "domelementtype": "1.3.1", + "domhandler": "2.4.2", + "domutils": "1.5.1", + "entities": "1.1.2", + "inherits": "2.0.4", + "readable-stream": "3.4.0" }, "dependencies": { "entities": { @@ -3580,7 +3561,7 @@ "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", "dev": true, "requires": { - "postcss": "^6.0.1" + "postcss": "6.0.23" }, "dependencies": { "ansi-styles": { @@ -3589,7 +3570,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -3598,9 +3579,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" } }, "has-flag": { @@ -3615,9 +3596,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" } }, "source-map": { @@ -3632,7 +3613,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -3655,8 +3636,8 @@ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", "dev": true, "requires": { - "caller-path": "^2.0.0", - "resolve-from": "^3.0.0" + "caller-path": "2.0.0", + "resolve-from": "3.0.0" } }, "imurmurhash": { @@ -3677,8 +3658,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -3711,7 +3692,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-arrayish": { @@ -3726,7 +3707,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "1.13.1" } }, "is-buffer": { @@ -3747,12 +3728,12 @@ "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", "dev": true, "requires": { - "css-color-names": "^0.0.4", - "hex-color-regex": "^1.1.0", - "hsl-regex": "^1.0.0", - "hsla-regex": "^1.0.0", - "rgb-regex": "^1.0.1", - "rgba-regex": "^1.0.0" + "css-color-names": "0.0.4", + "hex-color-regex": "1.1.0", + "hsl-regex": "1.0.0", + "hsla-regex": "1.0.0", + "rgb-regex": "1.0.1", + "rgba-regex": "1.0.0" } }, "is-data-descriptor": { @@ -3761,7 +3742,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-date-object": { @@ -3776,9 +3757,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -3813,7 +3794,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "^1.0.0" + "number-is-nan": "1.0.1" } }, "is-glob": { @@ -3822,7 +3803,7 @@ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "is-extglob": "2.1.1" } }, "is-number": { @@ -3831,7 +3812,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "is-obj": { @@ -3852,7 +3833,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "is-regex": { @@ -3861,7 +3842,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "^1.0.1" + "has": "1.0.3" } }, "is-resolvable": { @@ -3882,7 +3863,7 @@ "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", "dev": true, "requires": { - "html-comment-regex": "^1.1.0" + "html-comment-regex": "1.1.2" } }, "is-symbol": { @@ -3891,7 +3872,7 @@ "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "dev": true, "requires": { - "has-symbols": "^1.0.0" + "has-symbols": "1.0.0" } }, "is-windows": { @@ -3941,8 +3922,8 @@ "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^2.6.0" + "argparse": "1.0.10", + "esprima": "2.7.3" } }, "jsesc": { @@ -3975,7 +3956,7 @@ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", "dev": true, "requires": { - "minimist": "^1.2.0" + "minimist": "1.2.0" }, "dependencies": { "minimist": { @@ -3992,7 +3973,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } }, "knockout": { @@ -4006,8 +3987,8 @@ "integrity": "sha512-CZc+m2xZm51J8qSwdODeiiNeqh8CYkKEq6Rw8IkE4i/4yqf2cJhjQPsA6BtAV970ePRNhwEOXhy2U5xc5Jwh9Q==", "dev": true, "requires": { - "lodash": "^4.17.4", - "webpack-sources": "^1.0.1" + "lodash": "4.17.15", + "webpack-sources": "1.4.3" } }, "lazy-cache": { @@ -4022,7 +4003,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "invert-kv": "1.0.0" } }, "load-json-file": { @@ -4031,10 +4012,10 @@ "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" + "graceful-fs": "4.2.2", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" }, "dependencies": { "parse-json": { @@ -4043,7 +4024,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "1.3.2" } }, "pify": { @@ -4066,9 +4047,9 @@ "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "dev": true, "requires": { - "big.js": "^5.2.2", - "emojis-list": "^2.0.0", - "json5": "^1.0.1" + "big.js": "5.2.2", + "emojis-list": "2.1.0", + "json5": "1.0.1" } }, "locate-path": { @@ -4077,8 +4058,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "p-locate": "2.0.0", + "path-exists": "3.0.0" } }, "lodash": { @@ -4123,8 +4104,8 @@ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } }, "make-dir": { @@ -4133,7 +4114,7 @@ "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "pify": "^3.0.0" + "pify": "3.0.0" } }, "map-cache": { @@ -4148,7 +4129,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, "math-expression-evaluator": { @@ -4163,9 +4144,9 @@ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" + "hash-base": "3.0.4", + "inherits": "2.0.4", + "safe-buffer": "5.2.0" } }, "mdn-data": { @@ -4180,7 +4161,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "mimic-fn": "1.2.0" } }, "memory-fs": { @@ -4189,8 +4170,8 @@ "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "errno": "0.1.7", + "readable-stream": "2.3.6" }, "dependencies": { "readable-stream": { @@ -4199,13 +4180,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -4220,7 +4201,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -4231,19 +4212,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "kind-of": { @@ -4260,8 +4241,8 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "bn.js": "4.11.8", + "brorand": "1.1.0" } }, "mimic-fn": { @@ -4288,7 +4269,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.11" } }, "minimist": { @@ -4303,16 +4284,16 @@ "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", "dev": true, "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^2.0.1", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" + "concat-stream": "1.6.2", + "duplexify": "3.7.1", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.1.1", + "from2": "2.3.0", + "parallel-transform": "1.2.0", + "pump": "2.0.1", + "pumpify": "1.5.1", + "stream-each": "1.2.3", + "through2": "2.0.5" } }, "mixin-deep": { @@ -4321,8 +4302,8 @@ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -4331,7 +4312,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -4351,12 +4332,12 @@ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.7.1", + "run-queue": "1.0.3" } }, "ms": { @@ -4378,17 +4359,17 @@ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "kind-of": { @@ -4417,7 +4398,7 @@ "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", "dev": true, "requires": { - "lower-case": "^1.1.1" + "lower-case": "1.1.4" } }, "node-libs-browser": { @@ -4426,29 +4407,29 @@ "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", "dev": true, "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", + "assert": "1.5.0", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "3.0.0", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.2", + "stream-http": "2.8.3", + "string_decoder": "1.3.0", + "timers-browserify": "2.0.11", "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" + "url": "0.11.0", + "util": "0.11.1", + "vm-browserify": "1.1.0" }, "dependencies": { "punycode": { @@ -4463,13 +4444,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" }, "dependencies": { "string_decoder": { @@ -4478,7 +4459,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -4497,7 +4478,7 @@ "integrity": "sha512-R5bDhzh6I+tpi/9i2hrrvGJ3yKPYzlVOORDkXhnZuwi5D3q1I5w4vYy24PJXTcLk9Q0kws9TO77T75bcK8/ysQ==", "dev": true, "requires": { - "semver": "^5.3.0" + "semver": "5.7.1" } }, "normalize-package-data": { @@ -4506,10 +4487,10 @@ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "hosted-git-info": "2.8.4", + "resolve": "1.12.0", + "semver": "5.7.1", + "validate-npm-package-license": "3.0.4" } }, "normalize-path": { @@ -4530,10 +4511,10 @@ "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", "dev": true, "requires": { - "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" + "object-assign": "4.1.1", + "prepend-http": "1.0.4", + "query-string": "4.3.4", + "sort-keys": "1.1.2" } }, "npm-run-path": { @@ -4542,7 +4523,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" } }, "nth-check": { @@ -4551,7 +4532,7 @@ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", "dev": true, "requires": { - "boolbase": "~1.0.0" + "boolbase": "1.0.0" } }, "num2fraction": { @@ -4578,9 +4559,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -4589,7 +4570,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -4612,7 +4593,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" } }, "object.getownpropertydescriptors": { @@ -4621,8 +4602,8 @@ "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.5.1" + "define-properties": "1.1.3", + "es-abstract": "1.14.1" } }, "object.pick": { @@ -4631,7 +4612,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" } }, "object.values": { @@ -4640,10 +4621,10 @@ "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.12.0", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "define-properties": "1.1.3", + "es-abstract": "1.14.1", + "function-bind": "1.1.1", + "has": "1.0.3" } }, "once": { @@ -4652,7 +4633,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "optimize-css-assets-webpack-plugin": { @@ -4661,8 +4642,8 @@ "integrity": "sha512-FSoF15xKSEM2qCE3/y2gH92PysJSBY58Wx/hmSdIzVSOd0vg+FRS28NWZADId1wh6PDlbVt0lfPduV0IBufItQ==", "dev": true, "requires": { - "cssnano": "^4.1.10", - "last-call-webpack-plugin": "^2.1.2" + "cssnano": "4.1.10", + "last-call-webpack-plugin": "2.1.2" }, "dependencies": { "ansi-styles": { @@ -4671,7 +4652,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -4680,9 +4661,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -4691,7 +4672,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -4702,10 +4683,10 @@ "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", "dev": true, "requires": { - "cosmiconfig": "^5.0.0", - "cssnano-preset-default": "^4.0.7", - "is-resolvable": "^1.0.0", - "postcss": "^7.0.0" + "cosmiconfig": "5.2.1", + "cssnano-preset-default": "4.0.7", + "is-resolvable": "1.1.0", + "postcss": "7.0.18" } }, "has-flag": { @@ -4720,9 +4701,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "source-map": { @@ -4737,7 +4718,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -4754,9 +4735,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" } }, "p-finally": { @@ -4771,7 +4752,7 @@ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { - "p-try": "^1.0.0" + "p-try": "1.0.0" } }, "p-locate": { @@ -4780,7 +4761,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "^1.1.0" + "p-limit": "1.3.0" } }, "p-try": { @@ -4801,9 +4782,9 @@ "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" + "cyclist": "1.0.1", + "inherits": "2.0.4", + "readable-stream": "2.3.6" }, "dependencies": { "readable-stream": { @@ -4812,13 +4793,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -4833,7 +4814,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -4844,7 +4825,7 @@ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "dev": true, "requires": { - "no-case": "^2.2.0" + "no-case": "2.3.2" } }, "parse-asn1": { @@ -4853,12 +4834,12 @@ "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "dev": true, "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.17", + "safe-buffer": "5.2.0" } }, "parse-json": { @@ -4867,8 +4848,8 @@ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "error-ex": "1.3.2", + "json-parse-better-errors": "1.0.2" } }, "pascalcase": { @@ -4919,7 +4900,7 @@ "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "pify": "^2.0.0" + "pify": "2.3.0" }, "dependencies": { "pify": { @@ -4936,11 +4917,11 @@ "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.2.0", + "sha.js": "2.4.11" } }, "pify": { @@ -4955,7 +4936,7 @@ "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "find-up": "^2.1.0" + "find-up": "2.1.0" } }, "posix-character-classes": { @@ -4970,10 +4951,10 @@ "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", "dev": true, "requires": { - "chalk": "^1.1.3", - "js-base64": "^2.1.9", - "source-map": "^0.5.6", - "supports-color": "^3.2.3" + "chalk": "1.1.3", + "js-base64": "2.5.1", + "source-map": "0.5.7", + "supports-color": "3.2.3" }, "dependencies": { "supports-color": { @@ -4982,7 +4963,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "^1.0.0" + "has-flag": "1.0.0" } } } @@ -4993,9 +4974,9 @@ "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", "dev": true, "requires": { - "postcss": "^5.0.2", - "postcss-message-helpers": "^2.0.0", - "reduce-css-calc": "^1.2.6" + "postcss": "5.2.18", + "postcss-message-helpers": "2.0.0", + "reduce-css-calc": "1.3.0" } }, "postcss-colormin": { @@ -5004,9 +4985,9 @@ "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", "dev": true, "requires": { - "colormin": "^1.0.5", - "postcss": "^5.0.13", - "postcss-value-parser": "^3.2.3" + "colormin": "1.1.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" } }, "postcss-convert-values": { @@ -5015,8 +4996,8 @@ "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", "dev": true, "requires": { - "postcss": "^5.0.11", - "postcss-value-parser": "^3.1.2" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" } }, "postcss-discard-comments": { @@ -5025,7 +5006,7 @@ "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", "dev": true, "requires": { - "postcss": "^5.0.14" + "postcss": "5.2.18" } }, "postcss-discard-duplicates": { @@ -5034,7 +5015,7 @@ "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", "dev": true, "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" } }, "postcss-discard-empty": { @@ -5043,7 +5024,7 @@ "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", "dev": true, "requires": { - "postcss": "^5.0.14" + "postcss": "5.2.18" } }, "postcss-discard-overridden": { @@ -5052,7 +5033,7 @@ "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", "dev": true, "requires": { - "postcss": "^5.0.16" + "postcss": "5.2.18" } }, "postcss-discard-unused": { @@ -5061,8 +5042,8 @@ "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", "dev": true, "requires": { - "postcss": "^5.0.14", - "uniqs": "^2.0.0" + "postcss": "5.2.18", + "uniqs": "2.0.0" } }, "postcss-filter-plugins": { @@ -5071,7 +5052,7 @@ "integrity": "sha512-T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==", "dev": true, "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" } }, "postcss-merge-idents": { @@ -5080,9 +5061,9 @@ "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", "dev": true, "requires": { - "has": "^1.0.1", - "postcss": "^5.0.10", - "postcss-value-parser": "^3.1.1" + "has": "1.0.3", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" } }, "postcss-merge-longhand": { @@ -5091,7 +5072,7 @@ "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", "dev": true, "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" } }, "postcss-merge-rules": { @@ -5100,11 +5081,11 @@ "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", "dev": true, "requires": { - "browserslist": "^1.5.2", - "caniuse-api": "^1.5.2", - "postcss": "^5.0.4", - "postcss-selector-parser": "^2.2.2", - "vendors": "^1.0.0" + "browserslist": "1.7.7", + "caniuse-api": "1.6.1", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3", + "vendors": "1.0.3" } }, "postcss-message-helpers": { @@ -5119,9 +5100,9 @@ "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", "dev": true, "requires": { - "object-assign": "^4.0.1", - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "object-assign": "4.1.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" } }, "postcss-minify-gradients": { @@ -5130,8 +5111,8 @@ "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", "dev": true, "requires": { - "postcss": "^5.0.12", - "postcss-value-parser": "^3.3.0" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" } }, "postcss-minify-params": { @@ -5140,10 +5121,10 @@ "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", "dev": true, "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.2", - "postcss-value-parser": "^3.0.2", - "uniqs": "^2.0.0" + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1", + "uniqs": "2.0.0" } }, "postcss-minify-selectors": { @@ -5152,10 +5133,10 @@ "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", "dev": true, "requires": { - "alphanum-sort": "^1.0.2", - "has": "^1.0.1", - "postcss": "^5.0.14", - "postcss-selector-parser": "^2.0.0" + "alphanum-sort": "1.0.2", + "has": "1.0.3", + "postcss": "5.2.18", + "postcss-selector-parser": "2.2.3" } }, "postcss-modules-extract-imports": { @@ -5164,7 +5145,7 @@ "integrity": "sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw==", "dev": true, "requires": { - "postcss": "^6.0.1" + "postcss": "6.0.23" }, "dependencies": { "ansi-styles": { @@ -5173,7 +5154,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -5182,9 +5163,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" } }, "has-flag": { @@ -5199,9 +5180,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" } }, "source-map": { @@ -5216,7 +5197,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5227,8 +5208,8 @@ "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "css-selector-tokenizer": "0.7.1", + "postcss": "6.0.23" }, "dependencies": { "ansi-styles": { @@ -5237,7 +5218,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -5246,9 +5227,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" } }, "has-flag": { @@ -5263,9 +5244,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" } }, "source-map": { @@ -5280,7 +5261,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5291,8 +5272,8 @@ "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", "dev": true, "requires": { - "css-selector-tokenizer": "^0.7.0", - "postcss": "^6.0.1" + "css-selector-tokenizer": "0.7.1", + "postcss": "6.0.23" }, "dependencies": { "ansi-styles": { @@ -5301,7 +5282,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -5310,9 +5291,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" } }, "has-flag": { @@ -5327,9 +5308,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" } }, "source-map": { @@ -5344,7 +5325,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5355,8 +5336,8 @@ "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", "dev": true, "requires": { - "icss-replace-symbols": "^1.1.0", - "postcss": "^6.0.1" + "icss-replace-symbols": "1.1.0", + "postcss": "6.0.23" }, "dependencies": { "ansi-styles": { @@ -5365,7 +5346,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -5374,9 +5355,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" } }, "has-flag": { @@ -5391,9 +5372,9 @@ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "^2.4.1", - "source-map": "^0.6.1", - "supports-color": "^5.4.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "5.5.0" } }, "source-map": { @@ -5408,7 +5389,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5419,7 +5400,7 @@ "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", "dev": true, "requires": { - "postcss": "^5.0.5" + "postcss": "5.2.18" } }, "postcss-normalize-display-values": { @@ -5428,9 +5409,9 @@ "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-match": "4.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" }, "dependencies": { "ansi-styles": { @@ -5439,7 +5420,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -5448,9 +5429,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -5459,7 +5440,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5476,9 +5457,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "source-map": { @@ -5493,7 +5474,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5504,10 +5485,10 @@ "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-arguments": "4.0.0", + "has": "1.0.3", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" }, "dependencies": { "ansi-styles": { @@ -5516,7 +5497,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -5525,9 +5506,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -5536,7 +5517,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5553,9 +5534,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "source-map": { @@ -5570,7 +5551,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5581,10 +5562,10 @@ "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "dev": true, "requires": { - "cssnano-util-get-arguments": "^4.0.0", - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-arguments": "4.0.0", + "cssnano-util-get-match": "4.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" }, "dependencies": { "ansi-styles": { @@ -5593,7 +5574,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -5602,9 +5583,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -5613,7 +5594,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5630,9 +5611,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "source-map": { @@ -5647,7 +5628,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5658,9 +5639,9 @@ "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "dev": true, "requires": { - "has": "^1.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "has": "1.0.3", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" }, "dependencies": { "ansi-styles": { @@ -5669,7 +5650,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -5678,9 +5659,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -5689,7 +5670,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5706,9 +5687,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "source-map": { @@ -5723,7 +5704,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5734,9 +5715,9 @@ "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "dev": true, "requires": { - "cssnano-util-get-match": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "cssnano-util-get-match": "4.0.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" }, "dependencies": { "ansi-styles": { @@ -5745,7 +5726,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -5754,9 +5735,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -5765,7 +5746,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5782,9 +5763,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "source-map": { @@ -5799,7 +5780,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5810,9 +5791,9 @@ "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "browserslist": "4.7.0", + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" }, "dependencies": { "ansi-styles": { @@ -5821,7 +5802,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "browserslist": { @@ -5830,9 +5811,9 @@ "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "caniuse-lite": "1.0.30000989", + "electron-to-chromium": "1.3.252", + "node-releases": "1.1.29" } }, "chalk": { @@ -5841,9 +5822,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -5852,7 +5833,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5869,9 +5850,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "source-map": { @@ -5886,7 +5867,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5897,10 +5878,10 @@ "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", "dev": true, "requires": { - "is-absolute-url": "^2.0.0", - "normalize-url": "^1.4.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3" + "is-absolute-url": "2.1.0", + "normalize-url": "1.9.1", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" } }, "postcss-normalize-whitespace": { @@ -5909,8 +5890,8 @@ "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "dev": true, "requires": { - "postcss": "^7.0.0", - "postcss-value-parser": "^3.0.0" + "postcss": "7.0.18", + "postcss-value-parser": "3.3.1" }, "dependencies": { "ansi-styles": { @@ -5919,7 +5900,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "chalk": { @@ -5928,9 +5909,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -5939,7 +5920,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5956,9 +5937,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "source-map": { @@ -5973,7 +5954,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -5984,8 +5965,8 @@ "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", "dev": true, "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.1" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" } }, "postcss-reduce-idents": { @@ -5994,8 +5975,8 @@ "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", "dev": true, "requires": { - "postcss": "^5.0.4", - "postcss-value-parser": "^3.0.2" + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" } }, "postcss-reduce-initial": { @@ -6004,7 +5985,7 @@ "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", "dev": true, "requires": { - "postcss": "^5.0.4" + "postcss": "5.2.18" } }, "postcss-reduce-transforms": { @@ -6013,9 +5994,9 @@ "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", "dev": true, "requires": { - "has": "^1.0.1", - "postcss": "^5.0.8", - "postcss-value-parser": "^3.0.1" + "has": "1.0.3", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1" } }, "postcss-selector-parser": { @@ -6024,9 +6005,9 @@ "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", "dev": true, "requires": { - "flatten": "^1.0.2", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "flatten": "1.0.2", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } }, "postcss-svgo": { @@ -6035,10 +6016,10 @@ "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", "dev": true, "requires": { - "is-svg": "^2.0.0", - "postcss": "^5.0.14", - "postcss-value-parser": "^3.2.3", - "svgo": "^0.7.0" + "is-svg": "2.1.0", + "postcss": "5.2.18", + "postcss-value-parser": "3.3.1", + "svgo": "0.7.2" } }, "postcss-unique-selectors": { @@ -6047,9 +6028,9 @@ "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", "dev": true, "requires": { - "alphanum-sort": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "alphanum-sort": "1.0.2", + "postcss": "5.2.18", + "uniqs": "2.0.0" } }, "postcss-value-parser": { @@ -6064,9 +6045,9 @@ "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", "dev": true, "requires": { - "has": "^1.0.1", - "postcss": "^5.0.4", - "uniqs": "^2.0.0" + "has": "1.0.3", + "postcss": "5.2.18", + "uniqs": "2.0.0" } }, "prepend-http": { @@ -6081,8 +6062,8 @@ "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", "dev": true, "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" + "renderkid": "2.0.3", + "utila": "0.4.0" } }, "private": { @@ -6127,12 +6108,12 @@ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.4", + "randombytes": "2.1.0", + "safe-buffer": "5.2.0" } }, "pump": { @@ -6141,8 +6122,8 @@ "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" + "end-of-stream": "1.4.1", + "once": "1.4.0" } }, "pumpify": { @@ -6151,9 +6132,9 @@ "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "duplexify": "3.7.1", + "inherits": "2.0.4", + "pump": "2.0.1" } }, "punycode": { @@ -6174,8 +6155,8 @@ "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "dev": true, "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "object-assign": "4.1.1", + "strict-uri-encode": "1.1.0" } }, "querystring": { @@ -6196,7 +6177,7 @@ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { - "safe-buffer": "^5.1.0" + "safe-buffer": "5.2.0" } }, "randomfill": { @@ -6205,8 +6186,8 @@ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "randombytes": "2.1.0", + "safe-buffer": "5.2.0" } }, "read-pkg": { @@ -6215,9 +6196,9 @@ "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "load-json-file": "2.0.0", + "normalize-package-data": "2.5.0", + "path-type": "2.0.0" } }, "read-pkg-up": { @@ -6226,8 +6207,8 @@ "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" + "find-up": "2.1.0", + "read-pkg": "2.0.0" } }, "readable-stream": { @@ -6236,9 +6217,9 @@ "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "inherits": "2.0.4", + "string_decoder": "1.3.0", + "util-deprecate": "1.0.2" } }, "readdirp": { @@ -6247,9 +6228,9 @@ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "graceful-fs": "4.2.2", + "micromatch": "3.1.10", + "readable-stream": "2.3.6" }, "dependencies": { "readable-stream": { @@ -6258,13 +6239,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -6279,7 +6260,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -6291,9 +6272,9 @@ "dev": true, "requires": { "ast-types": "0.9.6", - "esprima": "~3.1.0", - "private": "~0.1.5", - "source-map": "~0.5.0" + "esprima": "3.1.3", + "private": "0.1.8", + "source-map": "0.5.7" }, "dependencies": { "esprima": { @@ -6310,9 +6291,9 @@ "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", "dev": true, "requires": { - "balanced-match": "^0.4.2", - "math-expression-evaluator": "^1.2.14", - "reduce-function-call": "^1.0.1" + "balanced-match": "0.4.2", + "math-expression-evaluator": "1.2.17", + "reduce-function-call": "1.0.2" } }, "reduce-function-call": { @@ -6321,7 +6302,7 @@ "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", "dev": true, "requires": { - "balanced-match": "^0.4.2" + "balanced-match": "0.4.2" } }, "regenerate": { @@ -6336,8 +6317,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" } }, "regexpu-core": { @@ -6346,9 +6327,9 @@ "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", "dev": true, "requires": { - "regenerate": "^1.2.1", - "regjsgen": "^0.2.0", - "regjsparser": "^0.1.4" + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" } }, "regjsgen": { @@ -6363,7 +6344,7 @@ "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", "dev": true, "requires": { - "jsesc": "~0.5.0" + "jsesc": "0.5.0" } }, "relateurl": { @@ -6384,11 +6365,11 @@ "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", "dev": true, "requires": { - "css-select": "^1.1.0", - "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" + "css-select": "1.2.0", + "dom-converter": "0.2.0", + "htmlparser2": "3.10.1", + "strip-ansi": "3.0.1", + "utila": "0.4.0" } }, "repeat-element": { @@ -6421,7 +6402,7 @@ "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "path-parse": "1.0.6" } }, "resolve-from": { @@ -6460,7 +6441,7 @@ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", "dev": true, "requires": { - "align-text": "^0.1.1" + "align-text": "0.1.4" } }, "rimraf": { @@ -6469,7 +6450,7 @@ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "glob": "^7.1.3" + "glob": "7.1.4" } }, "ripemd160": { @@ -6478,8 +6459,8 @@ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "hash-base": "3.0.4", + "inherits": "2.0.4" } }, "run-queue": { @@ -6488,7 +6469,7 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "aproba": "^1.1.1" + "aproba": "1.2.0" } }, "safe-buffer": { @@ -6503,7 +6484,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "sax": { @@ -6518,7 +6499,7 @@ "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", "dev": true, "requires": { - "ajv": "^5.0.0" + "ajv": "5.5.2" }, "dependencies": { "ajv": { @@ -6527,10 +6508,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "fast-deep-equal": { @@ -6571,10 +6552,10 @@ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -6583,7 +6564,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -6600,8 +6581,8 @@ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "2.0.4", + "safe-buffer": "5.2.0" } }, "shebang-command": { @@ -6610,7 +6591,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "1.0.0" } }, "shebang-regex": { @@ -6631,7 +6612,7 @@ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "dev": true, "requires": { - "is-arrayish": "^0.3.1" + "is-arrayish": "0.3.2" }, "dependencies": { "is-arrayish": { @@ -6648,14 +6629,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.1" }, "dependencies": { "define-property": { @@ -6664,7 +6645,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -6673,7 +6654,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -6684,9 +6665,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -6695,7 +6676,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -6704,7 +6685,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -6713,7 +6694,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -6722,9 +6703,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "kind-of": { @@ -6741,7 +6722,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" } }, "sort-keys": { @@ -6750,7 +6731,7 @@ "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", "dev": true, "requires": { - "is-plain-obj": "^1.0.0" + "is-plain-obj": "1.1.0" } }, "source-list-map": { @@ -6771,11 +6752,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "2.1.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, "source-map-url": { @@ -6790,8 +6771,8 @@ "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.5" } }, "spdx-exceptions": { @@ -6806,8 +6787,8 @@ "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" + "spdx-exceptions": "2.2.0", + "spdx-license-ids": "3.0.5" } }, "spdx-license-ids": { @@ -6822,7 +6803,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "extend-shallow": "3.0.2" } }, "sprintf-js": { @@ -6837,7 +6818,7 @@ "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", "dev": true, "requires": { - "safe-buffer": "^5.1.1" + "safe-buffer": "5.2.0" } }, "stable": { @@ -6852,8 +6833,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -6862,7 +6843,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -6873,8 +6854,8 @@ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" + "inherits": "2.0.4", + "readable-stream": "2.3.6" }, "dependencies": { "readable-stream": { @@ -6883,13 +6864,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -6904,7 +6885,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -6915,8 +6896,8 @@ "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" } }, "stream-http": { @@ -6925,11 +6906,11 @@ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" + "builtin-status-codes": "3.0.0", + "inherits": "2.0.4", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.2" }, "dependencies": { "readable-stream": { @@ -6938,13 +6919,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -6959,7 +6940,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -6982,8 +6963,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" }, "dependencies": { "ansi-regex": { @@ -7004,7 +6985,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "^3.0.0" + "ansi-regex": "3.0.0" } } } @@ -7015,8 +6996,8 @@ "integrity": "sha1-aLaqjhYsaoDnbjqKDC50cYbicf8=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.0.2" + "define-properties": "1.1.3", + "function-bind": "1.1.1" } }, "string.prototype.trimright": { @@ -7025,8 +7006,8 @@ "integrity": "sha1-q0pW2AKgH75yk+EehPJNyBZGYd0=", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.0.2" + "define-properties": "1.1.3", + "function-bind": "1.1.1" } }, "string_decoder": { @@ -7035,7 +7016,7 @@ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "safe-buffer": "~5.2.0" + "safe-buffer": "5.2.0" } }, "strip-ansi": { @@ -7044,7 +7025,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -7065,9 +7046,9 @@ "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", "dev": true, "requires": { - "browserslist": "^4.0.0", - "postcss": "^7.0.0", - "postcss-selector-parser": "^3.0.0" + "browserslist": "4.7.0", + "postcss": "7.0.18", + "postcss-selector-parser": "3.1.1" }, "dependencies": { "ansi-styles": { @@ -7076,7 +7057,7 @@ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.3" } }, "browserslist": { @@ -7085,9 +7066,9 @@ "integrity": "sha512-9rGNDtnj+HaahxiVV38Gn8n8Lr8REKsel68v1sPFfIGEK6uSXTY3h9acgiT1dZVtOOUtifo/Dn8daDQ5dUgVsA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000989", - "electron-to-chromium": "^1.3.247", - "node-releases": "^1.1.29" + "caniuse-lite": "1.0.30000989", + "electron-to-chromium": "1.3.252", + "node-releases": "1.1.29" } }, "chalk": { @@ -7096,9 +7077,9 @@ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" }, "dependencies": { "supports-color": { @@ -7107,7 +7088,7 @@ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -7124,9 +7105,9 @@ "integrity": "sha512-/7g1QXXgegpF+9GJj4iN7ChGF40sYuGYJ8WZu8DZWnmhQ/G36hfdk3q9LBJmoK+lZ+yzZ5KYpOoxq7LF1BxE8g==", "dev": true, "requires": { - "chalk": "^2.4.2", - "source-map": "^0.6.1", - "supports-color": "^6.1.0" + "chalk": "2.4.2", + "source-map": "0.6.1", + "supports-color": "6.1.0" } }, "postcss-selector-parser": { @@ -7135,9 +7116,9 @@ "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", "dev": true, "requires": { - "dot-prop": "^4.1.1", - "indexes-of": "^1.0.1", - "uniq": "^1.0.1" + "dot-prop": "4.2.0", + "indexes-of": "1.0.1", + "uniq": "1.0.1" } }, "source-map": { @@ -7152,7 +7133,7 @@ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "3.0.0" } } } @@ -7169,13 +7150,13 @@ "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", "dev": true, "requires": { - "coa": "~1.0.1", - "colors": "~1.1.2", - "csso": "~2.3.1", - "js-yaml": "~3.7.0", - "mkdirp": "~0.5.1", - "sax": "~1.2.1", - "whet.extend": "~0.9.9" + "coa": "1.0.4", + "colors": "1.1.2", + "csso": "2.3.2", + "js-yaml": "3.7.0", + "mkdirp": "0.5.1", + "sax": "1.2.4", + "whet.extend": "0.9.9" } }, "tapable": { @@ -7196,8 +7177,8 @@ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" + "readable-stream": "2.3.6", + "xtend": "4.0.2" }, "dependencies": { "readable-stream": { @@ -7206,13 +7187,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.4", + "isarray": "1.0.0", + "process-nextick-args": "2.0.1", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "safe-buffer": { @@ -7227,7 +7208,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.2" } } } @@ -7238,7 +7219,7 @@ "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "dev": true, "requires": { - "setimmediate": "^1.0.4" + "setimmediate": "1.0.5" } }, "timsort": { @@ -7259,7 +7240,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "to-regex": { @@ -7268,10 +7249,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" } }, "to-regex-range": { @@ -7280,8 +7261,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "3.0.0", + "repeat-string": "1.6.1" } }, "todomvc-app-css": { @@ -7324,8 +7305,8 @@ "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "dev": true, "requires": { - "commander": "~2.19.0", - "source-map": "~0.6.1" + "commander": "2.19.0", + "source-map": "0.6.1" }, "dependencies": { "commander": { @@ -7355,14 +7336,14 @@ "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", "dev": true, "requires": { - "cacache": "^10.0.4", - "find-cache-dir": "^1.0.0", - "schema-utils": "^0.4.5", - "serialize-javascript": "^1.4.0", - "source-map": "^0.6.1", - "uglify-es": "^3.3.4", - "webpack-sources": "^1.1.0", - "worker-farm": "^1.5.2" + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "schema-utils": "0.4.7", + "serialize-javascript": "1.9.1", + "source-map": "0.6.1", + "uglify-es": "3.3.9", + "webpack-sources": "1.4.3", + "worker-farm": "1.7.0" }, "dependencies": { "ajv": { @@ -7371,10 +7352,10 @@ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" } }, "commander": { @@ -7401,8 +7382,8 @@ "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", "dev": true, "requires": { - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0" + "ajv": "6.10.2", + "ajv-keywords": "3.4.1" } }, "source-map": { @@ -7417,8 +7398,8 @@ "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", "dev": true, "requires": { - "commander": "~2.13.0", - "source-map": "~0.6.1" + "commander": "2.13.0", + "source-map": "0.6.1" } } } @@ -7429,10 +7410,10 @@ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "2.0.1" } }, "uniq": { @@ -7453,7 +7434,7 @@ "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { - "unique-slug": "^2.0.0" + "unique-slug": "2.0.2" } }, "unique-slug": { @@ -7462,7 +7443,7 @@ "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, "requires": { - "imurmurhash": "^0.1.4" + "imurmurhash": "0.1.4" } }, "unquote": { @@ -7477,8 +7458,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { "has-value": { @@ -7487,9 +7468,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { "isobject": { @@ -7529,7 +7510,7 @@ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "punycode": "^2.1.0" + "punycode": "2.1.1" } }, "urix": { @@ -7591,8 +7572,8 @@ "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" + "define-properties": "1.1.3", + "object.getownpropertydescriptors": "2.0.3" } }, "utila": { @@ -7607,8 +7588,8 @@ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "spdx-correct": "3.1.0", + "spdx-expression-parse": "3.0.0" } }, "vendors": { @@ -7629,9 +7610,9 @@ "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", "dev": true, "requires": { - "chokidar": "^2.0.2", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "chokidar": "2.1.8", + "graceful-fs": "4.2.2", + "neo-async": "2.6.1" } }, "webpack": { @@ -7640,28 +7621,28 @@ "integrity": "sha512-Sw7MdIIOv/nkzPzee4o0EdvCuPmxT98+vVpIvwtcwcF1Q4SDSNp92vwcKc4REe7NItH9f1S4ra9FuQ7yuYZ8bQ==", "dev": true, "requires": { - "acorn": "^5.0.0", - "acorn-dynamic-import": "^2.0.0", - "ajv": "^6.1.0", - "ajv-keywords": "^3.1.0", - "async": "^2.1.2", - "enhanced-resolve": "^3.4.0", - "escope": "^3.6.0", - "interpret": "^1.0.0", - "json-loader": "^0.5.4", - "json5": "^0.5.1", - "loader-runner": "^2.3.0", - "loader-utils": "^1.1.0", - "memory-fs": "~0.4.1", - "mkdirp": "~0.5.0", - "node-libs-browser": "^2.0.0", - "source-map": "^0.5.3", - "supports-color": "^4.2.1", - "tapable": "^0.2.7", - "uglifyjs-webpack-plugin": "^0.4.6", - "watchpack": "^1.4.0", - "webpack-sources": "^1.0.1", - "yargs": "^8.0.2" + "acorn": "5.7.3", + "acorn-dynamic-import": "2.0.2", + "ajv": "6.10.2", + "ajv-keywords": "3.4.1", + "async": "2.6.3", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.2.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.4.0", + "loader-utils": "1.2.3", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.2.1", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.9", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.6.0", + "webpack-sources": "1.4.3", + "yargs": "8.0.2" }, "dependencies": { "ajv": { @@ -7670,10 +7651,10 @@ "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" } }, "fast-deep-equal": { @@ -7706,7 +7687,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "2.0.0" } }, "tapable": { @@ -7721,9 +7702,9 @@ "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", "dev": true, "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" }, "dependencies": { "yargs": { @@ -7732,9 +7713,9 @@ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", "window-size": "0.1.0" } } @@ -7746,9 +7727,9 @@ "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", "dev": true, "requires": { - "source-map": "^0.5.6", - "uglify-js": "^2.8.29", - "webpack-sources": "^1.0.1" + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.4.3" } } } @@ -7759,8 +7740,8 @@ "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" + "source-list-map": "2.0.1", + "source-map": "0.6.1" }, "dependencies": { "source-map": { @@ -7783,7 +7764,7 @@ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "which-module": { @@ -7810,7 +7791,7 @@ "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", "dev": true, "requires": { - "errno": "~0.1.7" + "errno": "0.1.7" } }, "wrap-ansi": { @@ -7819,8 +7800,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "string-width": "1.0.2", + "strip-ansi": "3.0.1" }, "dependencies": { "string-width": { @@ -7829,9 +7810,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -7866,19 +7847,19 @@ "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", "dev": true, "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" }, "dependencies": { "camelcase": { @@ -7893,9 +7874,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" }, "dependencies": { "string-width": { @@ -7904,9 +7885,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" } } } @@ -7925,7 +7906,7 @@ "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "4.1.0" }, "dependencies": { "camelcase": {